Bu Ekim 2010'da StackOverflow geri ele .
InnoDB altyapısındaki en yoğun dosyayı unutmayın: / var / lib / mysql / ibdata1
Bu dosya normalde dört tür bilgi içerir
- Tablo Verileri
- Tablo Dizinleri
- MVCC (Çoklu Sürüm Eşzamanlılık Kontrolü) Verileri
- Tablo Meta Verileri (Tablo alanı kimliklerinin listesi)
OPTIMIZE TABLE
İbdata1'de saklanan bir InnoDB tablosuna karşı çalıştırmak iki şey yapar:
- Tablonun verilerini ve dizinlerini ibdata1 içinde bitişik hale getirir, böylece daha hızlı erişim sağlar
- Bitişik veri ve dizin sayfaları ibdata1'e eklendiğinden ibdata1'in büyümesini sağlar
Eğer ibdata1 gelen Tablo Veri ve Tablo Dizinleri'ni ayırmak ve onlara kullanarak bağımsız yönetmek iken innodb_file_per_table , büyük basitçe ibdata1 içinde disaapear bir disk alanına tamamı olmaz şaşkın ve ıslah edilemez. Daha fazlasını yapmalısınız.
İbdata1'i bir kez ve herkes için küçültmek için aşağıdakileri yapmanız gerekir:
1) MySQLTüm veritabanlarını bir SQL metin dosyasına dökün (/root/SQLData.sql olarak adlandırın)
2) Tüm veritabanlarını bırakın (mysql şeması hariç)
3) Kapatma mysql
4) /etc/my.cnf dosyasına aşağıdaki satırları ekleyin
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Sidenote: innodb_buffer_pool_size için setiniz ne olursa olsun, innodb_log_file_size'nin innodb_buffer_pool_size değerinin% 25 olduğundan emin olun.
5) ibdata1, ib_logfile0 ve ib_logfile1 dosyalarını silin
Bu noktada, sadece / var / lib / mysql içinde mysql şeması olmalıdır
6) MySQL'i yeniden başlatın
Bu, ibdata1'i 10 veya 18MB'de (MySQL sürümüne bağlı olarak), ib_logfile0 ve ib_logfile1'i her biri 1G'de yeniden oluşturur
7) /root/SQLData.sql dosyasını mysql dosyasına yeniden yükleyin
ibdata1 büyüyecek, ancak yalnızca tablo meta verilerini içerecektir. Aslında, yıllar içinde çok yavaş büyüyecek. İbdata1'in hızlı büyümesinin tek yolu, aşağıdakilerden bir veya daha fazlasına sahip olmanızdır:
- DDL bir çok (
CREATE TABLE
, DROP TABLE
, ALTER TABLE
)
- Birçok işlem
- İşlem başına yapılacak birçok değişiklik
Her InnoDB tablosu ibdata1 dışında mevcut olacaktır
Mydb.mytable adlı bir InnoDB tablonuz olduğunu varsayalım. / Var / lib / mysql / mydb dosyasına giderseniz, tabloyu temsil eden iki dosya göreceksiniz
- mytable.frm (Depolama Motoru Başlığı)
- mytable.ibd (mydb.mytable için Tablo Verileri ve Tablo Dizinlerinin Ana Sayfası)
ibdata1 artık InnoDB verilerini ve Endekslerini artık içermeyecek.
/Etc/my.cnf içindeki innodb_file_per_table seçeneğiyle çalıştırabilirsiniz OPTIMIZE TABLE mydb.mytable;
ve /var/lib/mysql/mydb/mytable.ibd dosyası gerçekte küçülür.
Bunu MySQL DBA olarak kariyerimde birçok kez yaptım
Aslında, bunu ilk kez yaptığımda, 50GB ibdata1 dosyasını 500MB'ye daralttım.
Bir şans ver. Bununla ilgili başka sorularınız varsa, bana e-posta gönderin. Güven Bana. Bu kısa vadede ve uzun mesafe üzerinde çalışacaktır !!!
GÜNCELLEME 2012-04-19 09:23 EDT
Yukarıdaki adımları uyguladıktan sonra, hangi tabloların birleştirilmesi gerektiğini nasıl belirleyebilirsiniz? Öğrenmek mümkündür, ancak senaryonuz olacak.
İşte bir örnek: Varsayalım tablonuz var mydb.mytable
. İnnodb_file_per_table etkinken, /var/lib/mysql/mydb/mytable.ibd dosyasına sahipsiniz
İki numara almanız gerekecek
İşletim Sisteminden DOSYA BOYUTU: İşletim sisteminden dosya boyutunu şu şekilde belirleyebilirsiniz
ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'
BİLGİ_SCHEMA'DAN DOSYA BOYUTU: Dosya boyutunu aşağıdaki gibi information_schema.tables adresinden öğrenebilirsiniz:
SELECT (data_length+index_length) tblsize FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';
BİLGİ_SCHEMA değerini OS değerinden çıkarın ve farkı BİLGİ_SCHEMA değerine bölün.
Oradan, bu yüzdeyi birleştirmek için yüzde kaçının gerekli olduğuna karar vereceksiniz. Tabii ki, aşağıdaki komutlardan birini kullanarak birleştirebilirsiniz:
OPTIMIZE TABLE mydb.mytable;
veya
ALTER TABLE mydb.mytable ENGINE=InnoDB;