InnoDB altyapısındaki en yoğun dosyanın / var / lib / mysql / ibdata1 olduğunu unutmayın.
Bu dosya normalde birçok bilgi sınıfını barındırır ( innodb_file_per_table 0 olduğunda )
- Tablo Verileri
- Tablo Endeksleri
- MVCC (Multiversioning Eşzamanlılık Kontrolü) Verileri
- Geri Alma Segmentleri
- Tablo Alanını Geri Al
- Tablo Meta Verileri
- Resimli Gösterime bakınız
Birçok kişi daha iyi disk alanı yönetimi ve performansı için umuduyla birden fazla ibdata dosyası oluşturur. Yardımcı olmuyor.
Ne yazık ki, ibdata1'de depolanan InnoDB tablosuna karşı OPTIMIZE TABLE iki şey yapar:
- Tablo verilerini ve dizinlerini ibdata1 içinde bitişik yapar
- İbdata1'in büyümesini sağlar, çünkü bitişik veriler ibdata1'e eklenir.
Tablo Verileri ve Tablo Dizinlerini ibdata1'den ayırabilir ve bağımsız olarak innodb_file_per_table kullanarak yönetebilirsiniz . İbdata1'i bir kez ve herkes için küçültmek için aşağıdakileri yapmanız gerekir.
Adım 01) Mysqldump SQL metin dosyasına tüm veritabanları (SQLData.sql diyoruz) ( burada fazla detay )
Adım 02) dışında (tüm veritabanlarını Bırak mysql
, performance_schema
ve information_schema
)
Adım 03) MySQL Kapatma
Adım 04) Aşağıdaki satırları /etc/my.cnf dosyasına 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 kümeniz ne olursa olsun, innodb_log_file_size öğesinin innodb_buffer_pool_size% 25 olduğundan emin olun.
Adım 05) ibdata1, ib_logfile0 ve ib_logfile1 silin
Bu noktada, yalnızca / var / lib / mysql içindeki mysql şeması olmalıdır.
Adım 06) MySQL'i yeniden başlatın.
Bu ibdata1'i 10 MB’da, ib_logfile0 ve ib_logfile1 her birini 1G’de yeniden oluşturur
Adım 07) SQLData.sql dosyasını mysql içine tekrar yükleyin
ibdata1 büyüyecek, ancak yalnızca tablo meta verilerini içerecek
Her InnoDB tablosu ibdata1 dışında olacak
Mydb.mytable adlı bir InnoDB tablonuz olduğunu varsayalım. Eğer / var / lib / mysql / mydb 'ye girerseniz, tabloyu temsil eden iki dosya göreceksiniz.
- mytable.frm (Depolama Motoru Başlığı)
- mytable.ibd (mydb.mytable için Tablo Verileri ve Tablo Dizinleri Ana Sayfası)
ibdata1 artık InnoDB verilerini ve Dizinlerini artık içermeyecek.
/Etc/my.cnf içindeki innodb_file_per_table seçeneği ile çalıştırabilirsiniz OPTIMIZE TABLE mydb.mytable
ve dosya /var/lib/mysql/mydb/mytable.ibd
gerçekten küçülür.
MySQL DBA olarak kariyerimde bunu birçok kez yaptım
Aslında, bunu ilk yaptığımda, 50 MB ibdata1 dosyasını 500 MB'a daralttım.
Bir şans ver. Bununla ilgili başka sorularınız varsa, bana e-posta gönder. Güven Bana. Bu kısa vadede ve uzun vadede işe yarayacak. !!!
MyISAM ve InnoDB'de ne kadar gerçek veri saklandığını görmek istiyorsanız, lütfen bu sorguyu çalıştırın:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;