Bir mysql innodb depolama motorunu, silinen tablolardan veri depolamaması için temizlemek mümkün müdür?
Yoksa her seferinde yeni bir veri tabanı oluşturmam mı gerekiyor?
Bir mysql innodb depolama motorunu, silinen tablolardan veri depolamaması için temizlemek mümkün müdür?
Yoksa her seferinde yeni bir veri tabanı oluşturmam mı gerekiyor?
Yanıtlar:
İşte InnoDB ile ilgili daha eksiksiz bir cevap. Bu biraz uzun bir süreçtir, ancak çabaya değer olabilir.
Bunun /var/lib/mysql/ibdata1
InnoDB altyapısındaki en yoğun dosya olduğunu unutmayın . Normalde altı tür bilgi barındırır:
Pictorial Representation of ibdata1
Birçok kişi ibdata
daha iyi disk alanı yönetimi ve performansı umuduyla birden çok dosya oluşturur , ancak bu inanç yanlıştır.
OPTIMIZE TABLE
?Ne yazık ki, OPTIMIZE TABLE
paylaşılan tablo alanı dosyasında depolanan bir InnoDB tablosuyla çalışmak ibdata1
iki şey yapar:
ibdata1
ibdata1
bitişik veri ve dizin sayfaları çünkü büyümek eklenmiş içinibdata1
Bununla birlikte, Tablo Verileri ve Tablo Dizinlerini ayırabilir ibdata1
ve bağımsız olarak yönetebilirsiniz.
OPTIMIZE TABLE
ile innodb_file_per_table
?Eklemek olduğunu varsayalım innodb_file_per_table
için /etc/my.cnf (my.ini)
. O zaman OPTIMIZE TABLE
tüm InnoDB Masalarında koşabilir misin?
İyi Haber : Eğer çalıştırdığınızda OPTIMIZE TABLE
ile innodb_file_per_table
etkin, bu üretecek .ibd
bu tablo için dosyayı. Örneğin, bir mydb.mytable
dataya sahip tablonuz varsa /var/lib/mysql
, aşağıdakileri üretecektir:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
, Bu .ibd
tablo için Veri Sayfalarını ve Dizin Sayfalarını içerecektir. Harika.
Kötü Haber : Tüm yaptığınız Veri Sayfalarını ve Dizin Sayfalarını içinde mydb.mytable
yaşamaktan çıkarmak ibdata
. Dahil olmak üzere her tablo için veri sözlüğü girişi mydb.mytable
hala veri sözlüğünde kalır (ibdata1'in Resimli Temsili'ne bakın ).ibdata1
BU NOKTADA SADECE SİLECEKSİNİZ !!! Lütfen bununibdata1
hiç küçülmediğiniunutmayın.
Küçültmek için ibdata1
kez ve tamamen için aşağıdakileri yapmanız gerekir:
mysqldump
Tüm veritabanlarını bir .sql
metin dosyasına ( örn.SQLData.sql
aşağıda kullanılmaktadır)
Tüm veritabanlarını bırakın ( mysql
ve hariç information_schema
) CAVEAT : Bir önlem olarak, lütfen tüm kullanıcı izinlerini yerine getirdiğinizden kesinlikle emin olmak için bu komut dosyasını çalıştırın:
mkdir /var/lib/mysql_grants
cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
chown -R mysql:mysql /var/lib/mysql_grants
Mysql'de oturum açın ve çalıştırın SET GLOBAL innodb_fast_shutdown = 0;
(Bu, kalan tüm işlem değişikliklerini tamamen temizleyecektir.ib_logfile0
ve ib_logfile1
)
MySQL'i kapat
Aşağıdaki satırları Windows'a ekleyin /etc/my.cnf
(veya my.ini
Windows'ta)
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
(Sidenote: Setiniz ne olursa olsun innodb_buffer_pool_size
, emin oluninnodb_log_file_size
% 25'inininnodb_buffer_pool_size
.
Ayrıca: innodb_flush_method=O_DIRECT
Windows'ta mevcut değildir)
Sil ibdata*
ve ib_logfile*
İsteğe bağlı olarak, tüm klasörleri kaldırabilir /var/lib/mysql
hariç/var/lib/mysql/mysql
.
(Bu baştan yaratacak Başlangıç MySQL ibdata1
[varsayılan olarak 10MB'yi] ve ib_logfile0
ve ib_logfile1
1G her).
İthalat SQLData.sql
Şimdi, ibdata1
büyümeye devam edecek , ancak yalnızca tablo meta verilerini içerecek çünkü her InnoDB tablosu dışında var olacak ibdata1
.ibdata1
artık InnoDB verilerini ve diğer tablolar için dizinleri içermeyecektir.
Örneğin, adlı bir InnoDB tablonuz olduğunu varsayalım mydb.mytable
. İçeri bakarsanız /var/lib/mysql/mydb
, tabloyu temsil eden iki dosya göreceksiniz:
mytable.frm
(Depolama Motoru Başlığı)mytable.ibd
(Tablo Verileri ve Dizinler)İçerisindeki innodb_file_per_table
seçenek ile /etc/my.cnf
koşabilirsinizOPTIMIZE TABLE mydb.mytable
ve dosya /var/lib/mysql/mydb/mytable.ibd
aslında küçülecek.
Bunu kariyerim boyunca MySQL DBA olarak birçok kez yaptım. Aslında, bunu ilk yaptığımda 50 GB küçülttüm ibdata1
sadece 500MB dosya aşağı!
Bir şans ver. Bununla ilgili başka sorularınız varsa, sormanız yeterli. Güven Bana; bu kısa vadede olduğu kadar uzun vadede de işe yarayacaktır.
Adım 6'da, mysql, mysql
şema başlangıcı düştüğü için yeniden başlatılamazsa , 2. Adıma geri bakın. Şemanın fiziksel kopyasını yaptınız mysql
. Aşağıdaki şekilde geri yükleyebilirsiniz:
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql
6. Adıma geri dönün ve devam edin
Ayarı ile ilgili olarak innodb_log_file_size % 25'ine innodb_buffer_pool_size 's battaniye kural oldukça eski okul olduğunu, 5. adımda.
Geri July 03, 2006
döndüğümüzde, Percona'nın neden uygun bir innodb_log_file_size seçmesi gerektiğine dair güzel bir makalesi vardı . Daha sonra üzerine Nov 21, 2008
, Percona başka bir makale üzerinde ile takip bir saatlik değişiklikleri koruyarak en yüksek iş yüküne göre uygun boyutun nasıl hesaplanacağına dair .
O zamandan beri DBA StackExchange'de günlük boyutunu hesaplamak ve bu iki Percona makalesine başvurduğum yer hakkında yazılar yazdım.
Aug 27, 2012
: 48 GB RAM ile sunucuda 30 GB InnoDB tablosu için uygun ayarJan 17, 2013
: MySQL 5.5 - Innodb - innodb_log_file_size 4 GB'den daha yüksek mi?Şahsen ben yine de ilk kurulum için% 25 kuralı uygulayacaktım. Ardından, üretimde zaman içinde iş yükü daha doğru belirlenebildiğinden, bir bakım döngüsü sırasında günlükleri dakikalar içinde yeniden boyutlandırabilirsiniz .
innodb_open_tables
gerekirse yükseltmeyi unutmayın . Varsayılan değer 300'dür.
InnoDB motoru silinmiş verileri saklamaz. Satırları ekleyip sildikçe, InnoDB depolama dosyaları içinde kullanılmayan alan ayrılır. Zamanla toplam alan azalmaz, ancak zamanla 'silinen ve boşaltılan' alan DB sunucusu tarafından otomatik olarak yeniden kullanılır.
Tabloların manuel olarak yeniden düzenlenmesi yoluyla motor tarafından kullanılan alanı daha fazla ayarlayabilir ve yönetebilirsiniz. Bunu yapmak için, mysqldump kullanarak etkilenen tablolardaki verileri boşaltın, tabloları bırakın, mysql hizmetini yeniden başlatın ve ardından döküm dosyalarından tabloları yeniden oluşturun.