Tüm veritabanlarına atmadan innodb dosyasını ibdata1'i nasıl daraltabilirim?


24

InnoDB tüm tabloları tek bir büyük dosyada saklar ibdata1.

Büyük bir masa bıraktıktan sonra, dosya ne kadar büyük olursa olsun boyutunu koruyor. Bu veritabanını, tüm veritabanını (toplamda birkaç yüz GB'a sahip olan) atmadan ve yeniden almak zorunda kalmadan nasıl daraltabilirim?

Sanırım sebebi, düşmeyi hala geri alabilmeniz. Benim durumumda buna ihtiyacım yok.

Yanıtlar:


30

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 TABLEbir InnoDB'nin masaya, ibdata1 hızla büyür. Kullanılarak bırakılan DROP TABLEve DROP DATABASEgeri 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 TABLEbu 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 TABLEDaha sonra çalıştırmak gerçekten de .ibdherhangi bir InnoDB tablosu için tablo dosyasını küçültecektir .


1
Küçük düzeltme: MSSQL ve PostgreSQL DDL’yi geri alabilir. Oracle yapamaz. Aslında Oracle, DDL'yi görünce örtük bir taahhüt veriyor!
Chris Travers

1
@RolandoMySQLDBA beri MySQL hangi sürümü bu otomatik shrinking bu "iyi haber"?
Gavriel

@Gavriel - Yanlış okuduğunu düşünüyorum. Hala terketmek zorundasın; ibdata1'i çıkarın; tekrar başlat; ve yeniden yükleyin. Ibdata1’nın autoshrink1'i. (Değişen iblog * artık daha basittir.)
Rick James

2

InnoDB, my.cnf varsayılan dosyanızda aşağıdaki ayarları kullanmazsanız, sadece InnoDB tablolarınızı ibdata1'de saklar:

innodb_file_per_table = 1

DROP TABLE (ve DROP DATABASE) geri alınamaz.

Ibdata1'i küçültememenizin nedeni bu değil.

Bu kısaltılmış bir açıklamadır, ancak ibdata1, tablo verilerinize ek olarak InnoDB internals içeriyor. Anladığım kadarıyla, küçültmek için desteklenen bir işlem değil, birleştirilmesi gerekir.

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.