MySQL InnoDB - innodb_file_per_table eksileri?


32

Varsayılan olarak MySQL InnoDB tüm DB'lerin tüm tablolarını tek bir global dosyada saklar. Bunu config içinde innodb_file_per_table olarak ayarlayarak değiştirebilirsiniz, bu daha sonra her tablo için bir veri dosyası oluşturur.

Neden innodb_file_per_tablevarsayılan olarak etkin olmadığını merak ediyorum . Kullanmanın olumsuz yanları var mı?

Yanıtlar:


32

Bunun için tam bir cevabım var.

Bir kez innodb_file_per_table yerine konur ve yeni InnoDB tablolar kullanılarak küçüldü edilebilir ALTER TABLE <innodb-table-name> ENGINE=InnoDB';yeni küçülecek Bu .ibdGARANTİLİ dosyaları.

ALTER TABLE <innodb-table-name> ENGINE=InnoDB';İnnodb_file_per_table'ı kullanmadan önce oluşturulan bir InnoDB tablosunda çalıştırıyorsanız , bu tablo için veri ve dizinleri ibdata1 dosyasından çıkaracak ve bir .ibddosyada saklayacaktır, .

ibdata1Dosya normalde bilgi dört tip evler

İşte ibdata1 dosyasını hemen hemen küçültmenin garantili yolu ...

ADIM 01) MySQLBütün veritabanlarını bir SQL metin dosyasına atın (SQLData.sql olarak adlandırın)

ADIM 02) Tüm veritabanlarını bırak (mysql, information_schema ve performance_schema şemaları hariç)

ADIM 03) MySQL Kapatma

ADIM 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
innodb_data_file_path=ibdata1:10M:autoextend

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.

  • ADIM 05) ibdata1, ib_logfile0 ve ib_logfile1'i silin ( silmeden önce aşağıdaki güncellemeye bakın! )

Bu noktada, yalnızca / var / lib / mysql içindeki mysql şeması olmalıdır.

  • ADIM 06) MySQL'i yeniden başlat

Bu, ibdata1'i 10 MB'de (seçeneği yapılandırmayın), ib_logfile0 ve ib_logfile1'i her biri 1G'de yeniden oluşturur

  • ADIM 07) SQLData.sql dosyasını mysql içine tekrar yükleyin

ibdata1 büyüyecek ancak yalnızca tablo meta verilerini ve aralıklı MVCC verilerini içerecektir.

Her InnoDB tablosu dışında olacak ibdata1

Mydb.mytable adlı bir InnoDB tablonuz olduğunu varsayalım. Eğer girerseniz /var/lib/mysql/mydb, tabloyu temsil eden iki dosya göreceksiniz.

  • mytable.frm (Depolama Motoru Başlığı)
  • mytable.ibd(Tablo Verileri Ana Sayfası ve Tablo Dizinleri mydb.mytable)

ibdata1 artık asla InnoDB verilerini ve Dizinlerini içermeyecek.

İle innodb_file_per_table seçenek in /etc/my.cnf, Çalıştırabileceğiniz OPTIMIZE TABLE mydb.mytableYA ALTER TABLE mydb.mytable ENGINE=InnoDB;ve dosya /var/lib/mysql/mydb/mytable.ibdaslında küçülecek.

Bunu kariyerimde MySQL DBA olarak sayısız kez tek bir problem olmadan yaptım. Aslında, bunu ilk yaptığımda, 50 MB ibdata1 dosyasını 50 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.

GÜNCELLEME 2013-07-02 15:08 EDT

Bu konuda sahip olduğum bir uyarı var, diğer yazılarımda da güncelledik ama bunu kaçırdım: Yanıtımı innodb_fast_shutdown ile biraz daha güncelliyorum çünkü mysql'i yeniden başlatıp bunu yapmak için mysql'i durdurdum. Şimdi, bu bir adım hayati öneme sahiptir çünkü kabul edilmeyen her işlem InnoDB İşlem Günlükleri içinde ve dışında başka hareketli parçalara sahip olabilir ( Bkz. InnoDB Altyapısı). ).

Lütfen, innodb_fast_shutdown öğesinin 2 olarak ayarlanmasının , günlükleri de temizleyeceğini, ancak daha fazla hareketli parçanın hala bulunduğunu ve MySQL'in başlangıcında Crash Recovery'de toplandığını unutmayın. 0 ayarı en iyisidir.


Harika bilgi - teşekkürler! 50GB >> 50MB - oldukça etkileyici!
UpTheCreek

Merhaba, tam olarak burada yazdığınız gibi yapmaya çalıştım, 'tek' sorun sunucunun daha sonra başlamaması. Eğer mysql servisini başlatırsam sadece orada kilitlenir. Eski cnf dosyamı geri alırsam her şey yolunda. Bununla ilgili bir ipucun var mı?
Nicola Peluchetti,

Bu soru Nicola için: 5. Adım yaptınız mı ???
RolandoMySQLDBA

@Nicola için başka bir soru: Sisteminizde ne kadar RAM var ???
RolandoMySQLDBA

2
Dikkatli ol! innodb_fast_shutdown=0Günlük dosyalarını silmek için kapatmadan önce seçenek MySQL'de ayarlanmalıdır! ( ib_logfile0ve ib_logfile1) Aksi takdirde veri kaybedebilirsiniz!
Totor

12

Hatayı görün .

Kullanmanın olumsuz yanları var mı?

  • daha açık dosyalar
  • Aç / Aç
  • .ibd dosyası büzülmez (bkz. 1 , 2 )

Her zaman büyük veritabanlarında innodb_file_per_table kullanırım.


Kullanmasanız bile, ibdata dosyaları küçülmez, ya da :(
minaev

1
Teşekkürler. Ayrıca, neden per-db bir dosyaya sahip olma seçeneğinin olmadığını da merak ediyorum.
UpTheCreek

1
@UpTheCreek, tablolar varlıklardır. Veritabanları, kendi başlarına varlıklardan ziyade, mantıksal varlık gruplarıdır. Veritabanlarının dizin olduğu ve tabloların dosya olduğu MyISAM ile daha belirgindir.
John Gardeniers

Sadece şunu belirtmek isterim ki .ibd dosyaları otomatik olarak küçülmezken , ibdata1tablo başına dosyaya alternatif değildir. En azından optimize tableküçülen ibdata1 ile karşılaştırıldığında önemsiz olan bir .ibd dosyasını küçültmek mümkündür.
RomanSt,

8

innodb_file_per_table, MariaDB'de varsayılan olarak etkindir.


1
Madende değil (CentOS 7'deki varsayılan sürüm). MySQL 5.6.6 veya daha yeni bir sürümüne ihtiyacınız var. Aksi takdirde, varsayılan kapalıdır .
Monica

2

Kullanmamayı seçmemin sebebi, innodb_file_per_tableher tablonun kendi dosyasına koymasıdır, yani her tablonun kendine has, toplam ek yükü (dosya imzaları, vb.) Alması, yaniMySQL dizinin paylaşılan bir tablo alanı kullanıyorsanız daha büyük. Ek olarak, tek, büyük bir dosya yerine birden çok küçük dosya bulunduğunda küme boşluğu nedeniyle daha fazla boş alan vardır.

Verilen ek yükü bir değil kitlesel sen kendim (ve muhtemelen çok “ev kullanıcıları”) büyük bir sürücü kullanarak veya dev veritabanı var, ama için, özellikle de şeylerin büyük düzeni içinde tutar, heryer eklendi ve MySQL mağazamı tuttuğum büyük kümelerdeki küçük sürücü için hala çok fazlaydı.

Örneğin, WordPress veritabanları ve birkaç diğer küçük veri tabanları (phpBB, dev, bazı AMP testleri, vs.) ile benim veritabanı deposu, dönüştürmek başına tabloya 50MB'ye 32MB onu değiştirdi ve bu hatta dahil değildir ibdata1ki hala gerektiren bir 10MB en az bir toplam, en azından 60MB.

Dediğim gibi, bu bazı insanlar, özellikle de işletmeler için çok fazla bir sorun olmayabilir, ancak yalnızca sitenizi, blogunuzu vb. Barındıran bir ev kullanıcısıysanız, o zaman gerçekten seçim yapmak gibi bir etken olabilir. bir ana bilgisayar sağlayıcısı, çünkü çoğu ana bilgisayar, toplam disk kullanımına ek olarak veritabanınızın boyutunu da sınırlar.


1
Barındırma hizmetinde barındıran sıkı kotalar hakkında bir noktaya gelinceye kadar sizi deli olduğunuzu düşünüyordum (kim on megabayt umurunda ??). Bunu asla düşünemezdim.
Dan Pritts,

@DanPritts, özellikle ücretsiz bilgisayarlar. Ayrıca, sen dev bir sürücü var olabilir, ama herkes yapar. Ana veri bölümümü geçen sene 1GB'tan 2GB'a çıkardım, çünkü çok dardı, ancak burada 10MB ve hatta 10MB'lık (özellikle günlük dosyalarıyla) hızlı bir şekilde yiyebiliyor. Artı, küme israfını da arttırmayı unutma. Sonunda, mutlaka bir sabit sürücü bile değil . Örneğin, şu anda web sitemi “taşınabilir” olarak kullanıyorum, böylece herhangi bir sistemden barındırabiliyorum, 2GB flash sürücü zaten sınırlı. Bu nedenle, boyutları küçük tutmak ve yazı yazmaktan kaçınmak önemlidir. Ve sonra gömülü sistemler var!
Synetech

Artı, 10 MB değil (bu, mutlak minimum boyuttur IBDATA1). 30 MB ile ~ 85 MB arasındaydı. Her şeyi silerek ve sıfırdan bir dökümü içe aktararak, önceki 30 MB'lık bir 69 MB'lık bir girişime girdim (bir veritabanının yarısından fazlasına dayanan bir tahmin ☺). Her nedense, masa başına kullanmama rağmen ibdata1, hala 18 MB'ım var. ☹
Synetech

32M ve 50M dosya boyutlarına bakılırsa, bir CMS kurulumuna sahip olduğum bir şeye benzemiyorum. Rakamlara gerçekten inanamıyorum, hatta bazı dosyaların meta verilerinin MEGABYTES'e boyutsal olarak aynı sistemlerde ekleyebildiğinden bile kaç veritabanınız var?
sjas

2

Sadece biraz daha bilgi eklemek için

MySQL 5.6.6'dan beri varsayılan olarak etkindir.


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.