Tüm MySQL InnoDB tabloları neden parçalanmıştır?


10

Nedense, MySQL sunucumdaki tüm InnoDB tabloları mysqltuner çalıştırdığınızda parçalanmış olarak listeleniyor. Sunucuyu yalnızca birkaç saat önce (OSX Lion'da) yükledim ve içinde toplu iş dosyalarından alınan bir sürü taze veri var.

Bir veritabanındaki tüm tabloları MYISAM'a dönüştürmeyi denedim ve parçalanmış tabloların sayısının düştüğünden eminim. Garip bir şekilde, bu tabloları InnoDB'ye dönüştürdüğümde parçalanmış tablo sayısı tekrar geri çekildi. Bu şimdiye kadar yaptığım araştırmanın aksine, koşmanın ALTER TABLE table_name ENGINE=INNODB;parçalanmayı düzeltmesi gerektiğini gösteriyor .

Google'dan biraz sonra koştum:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Sözde tüm parçalanmış tabloları listeler (gerçekten parçalanmış tablo sayısı için mysqltuner çıktıları ile aynı sayıda sonuç döndürür). Her bir giriş data_free_MBsütunda tam olarak aynı numaraya sahiptir (şu anda 7.00000000).

Bu gerçekten gerçek bir sorun mu yoksa mysqltuner'ın yanlış yaptığı bir şey mi? Sorun varsa, nasıl düzeltebilirim?

DÜZENLE

Bir aptal olduğumdan ve 7MB'lık parçalanmanın her dosya için değil, tüm dosya için olduğundan daha fazla şüpheleniyorum. Herkes böyle bir durumun doğru olup olmadığını teyit edebilir mi?


Gerçekten 7 ücretsiz MB'nin bir sorun olduğunu mu düşünüyorsunuz?
David Schwartz

@DavidSchwartz Bir ipucu değil, bu yüzden sordum;) Her biri 7MB ücretsiz olan 2314 tablo var ve bunun ne anlama geldiğini bilmiyorum. Endişe için potansiyel bir neden olmasaydı neden mysqltuner'ın bana bu rakamı göstereceğinden emin değilim. Burada birisinin bana sayıların nasıl verileceğinden ve 'standart' yöntemler işe yaramadığından sorunu hafifletmek için neler yapabileceğimi söyleyebileceğini umuyordum
Clive

Bu soruyu kullanıcının bayraktaki isteğine göre taşıma.
Daniel Beck

Mysqltuner ayrıntılarının çoğu sadece bilgi amaçlıdır. Her şey bir sorun değil. Eğer bir sorun varsa, açıkça söyleyecektir. Bu bir sorun olarak gösterildi mi?
John Gardeniers

@JohnGardeniers Buna inanıyorum, mesaj şudur: [!!] Total fragmented tables: 2314ki eminim bir problemi gösterir (çift kırmızı ünlem işareti ile)
Clive

Yanıtlar:


5

Yukarıdaki yorumlarıma göre, sqltuner çıktılarının tümü hataları göstermez. Komut dosyası, genellikle bir sonraki satırda, ardından da düzeltme önerileriyle ilgili bir sorun olduğunu açıkça belirtmedikçe, yalnızca bilgi amaçlı bir öğedir.


3

İnnodb_file_per_table özelliğini etkinleştirdiğinizde , yaptığınız tek şey yeni InnoDB tablolarının harici bir .ibddosyada oluşturulmasını sağlamak için bir protokol ayarlamaktı . Bundan önce oluşturduğunuz tüm InnoDB tabloları hala ibdata1 içine gömülüdür.

İnnodb_file_per_table devre dışı bırakıldığında, her çalıştırdığınızda

ALTER TABLE table_name ENGINE=INNODB;

tek yaptığı tablonun veri ve indeks sayfalarını ibdata1'e eklemek. Bu, tabloyu bitişik sayfalarda var edecek ve parçalanmayı kaldıracak, olumsuz, ibdata1'in hızlı bir şekilde büyümesidir.

ÖNERİ

Tüm verileri dışa aktarmanız, ibdata1, ib_logfile0, ib_logfile1'i kaldırmanız ve yeniden yüklemeniz gerekir.

Bunu nasıl ve neden yapacağımı yazdım

GÜNCELLEME 2012-08-15 12:05 EDT

Sen mysqltuner.pl betiğin içine bakmak isteyebilirsiniz. IMHO Bence parçalanma ölçmek için eski bir formül kullanıyor. Mysqltuner yazılımının en son sürümüne sahip olduğunuzdan emin olun.

Harici olarak depolanan InnoDB tablolarının parçalanmasının ölçülmesine gelince, 11 Nisan 2012 tarihinde bunun hakkında bir yazı yazdım (19 Nisan 2012 için alttaki Güncelleme'ye bakın)


1
Ahhh tamam, şimdi işler çok daha mantıklı, teşekkürler. Verileri dışa aktarma, MySQL'i tamamen silme, sonra yeniden yükleme (ancak innodb_file_per_tablesunucuyu başlatmadan ve yeniden içe aktarmadan önce conf dosyasına ekleme) yaptım . Ondan önce her türlü InnoDB hatası alıyordum (gerçekten kötü türler ... innodb_force_recoverysadece veriyi elde etmek için seviye 6 ile koşmak zorunda olduğumu ifade edenler !) Ve her türlü 'günlük dosyası tarihi gelecek!' hatalar. Bunlar şimdi durmuş gibi görünüyor, ama hala çok az parçalanmış tablolarım var. Sadece gözüme
bakacağım

müthiş! bu çok bilgilendirici. Teşekkürler @RolandoMySQLDBA!
Sudhi
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.