Bu, yıllar boyunca MySQL DBA ve DBA StackExchange'te ele aldığım en tartışmalı konulardan biri.
Kibarca söylemek için, basitçe ibdata1 küçültmek için başka bir yol yoktur . İle innodb_file_per_table engelli, çalıştırmak her zaman OPTIMIZE TABLE
bir InnoDB'nin masaya, ibdata1 hızla büyür. Kullanılarak bırakılan DROP TABLE
ve DROP DATABASE
geri alınamayan veriler, DML değil, DDL oldukları için geri alınamaz. Oracle ve MSSQL'in DDL'yi geri alabileceğine inanıyorum. MySQL bunu yapamaz.
İbdata'da bulunan birkaç bilgi sınıfı vardır1
- Tablo Verileri
- Tablo Endeksleri
- Tablo MetaData
- MVCC Kontrol Verileri
- Çift Yazma Arabelleği (İşletim sistemi önbelleğe alma güvenini önlemek için arka plan yazma)
- Arabellek Ekle (Benzersiz olmayan ikincil dizinlerde yapılan değişiklikleri yönetme)
Kullanımı innodb_file_per_table=1
, ibdata1 dışında oluşturulan tablo verileri ve tablo dizinleri ile yeni tablolar oluşturmanıza olanak sağlar. Hala kullanarak ibdata1 içindeki tabloları çıkarabilirsiniz ALTER TABLE ... ENGINE=InnoDB;
veya OPTIMIZE TABLE
bu ibdata1'de bu büyük boşluk kullanılmayan alanı bırakacaktır.
Bununla birlikte, InnoDB altyapısını temizlemelisiniz. Bunu nasıl ve niçin yapılacağına dair StackExchange mesajlarını zaten yazdım:
İyi haberler
Yalnızca verileri boşaltmanız, bir kez daha doldurmanız ve bu sorunu bir daha asla tekrar ziyaret etmemelisiniz . OPTIMIZE TABLE
Daha sonra çalıştırmak gerçekten de .ibd
herhangi bir InnoDB tablosu için tablo dosyasını küçültecektir .