MySQL'de ibdata boyutunu azaltmanın en iyi yolu nedir?


63

ibdataDosyaları günden güne artan bazı Üretim sunucularına sahibim .

Zaten 290GB alan tüketmiştir.

Sunuculardaki tablolar çoğunlukla InnoDB'dir ve yüksek okuma ve yazma istekleri vardır.

Günlük dosyası boyutu da artıyor. Tablolarda büyük miktarda Veri var.

Her ikisinin de büyüyen boyutunu nasıl kontrol edebilirim?

Ben kullanmıyorum innodb_file_per_table.

Yanıtlar:


104

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_schemave 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.mytableve dosya /var/lib/mysql/mydb/mytable.ibdgerç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;

My.cnf (zaten sahip olduğum) için önerilen ayarlarda, ib_logfile0 ve 1'i silip mysql'i başlattıktan sonra bile, yeni dosyalar oluşturulur ve saniyeler içinde yukarıdaki sorgunuzda görüntülendiği gibi veritabanının boyutuna eşit olarak büyürler. MySQL'in tüm tabloları kopyalayıp kopyalayamadığından ve her dosya ayrı bir dosyada tutulurken bu dosyalara endekslendiğinden emin değilsiniz.
Allen King,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.