Untuk beberapa alasan, semua tabel InnoDB di server MySQL saya terdaftar sebagai terfragmentasi ketika saya menjalankan mysqltuner. Saya hanya menginstal server beberapa jam yang lalu (pada OSX Lion), dan memiliki banyak data segar yang diimpor dari file batch di dalamnya.
Saya mencoba mengubah semua tabel dalam satu database ke MYISAM, dan tentu saja jumlah tabel terfragmentasi turun. Anehnya, begitu saya mengonversi tabel-tabel itu kembali ke InnoDB, jumlah tabel yang terfragmentasi kembali naik. Ini bertentangan dengan penelitian saya sejauh ini yang menunjukkan bahwa berlari ALTER TABLE table_name ENGINE=INNODB;
harus memperbaiki fragmentasi.
Setelah sedikit Googling saya berlari:
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
Yang seharusnya mencantumkan semua tabel terfragmentasi (memang mengembalikan jumlah hasil yang sama dengan output mysqltuner untuk jumlah tabel terfragmentasi). Setiap entri memiliki nomor yang sama persis di data_free_MB
kolom (saat ini 7.00000000).
Apakah ini sebenarnya masalah nyata atau sesuatu yang dilakukan oleh mysqltuner? Jika ada masalah, bagaimana cara memperbaikinya?
EDIT
Saya menjadi semakin curiga bahwa saya idiot dan fragmentasi 7MB adalah untuk seluruh file, bukan untuk setiap tabel. Adakah yang bisa mengkonfirmasi apakah itu masalahnya?
[!!] Total fragmented tables: 2314
yang saya cukup yakin menunjukkan masalah (dengan tanda seru merah ganda)Jawaban:
Sesuai komentar saya di atas, tidak semua output dari sqltuner menunjukkan kesalahan. Kecuali jika skrip menyatakan dengan jelas bahwa ini merupakan masalah, biasanya pada baris berikutnya, diikuti oleh saran untuk remediasi, maka itu hanya item informasi.
sumber
Ketika Anda mengaktifkan innodb_file_per_table , yang Anda lakukan hanyalah mengatur protokol untuk membuat tabel InnoDB baru dibuat dalam
.ibd
file eksternal . Semua tabel InnoDB yang Anda buat sebelum ini masih tertanam di ibdata1.Dengan innodb_file_per_table dinonaktifkan, setiap kali Anda menjalankan
semua yang dilakukannya adalah menambahkan data tabel dan indeks halaman ke ibdata1. Ini akan membuat tabel ada di halaman yang berdekatan dan menghapus fragmentasi, Kelemahannya adalah ibdata1 tumbuh dengan cepat.
REKOMENDASI
Anda perlu mengekspor semua data, menghapus ibdata1, ib_logfile0, ib_logfile1, dan memuat ulang.
Saya menulis bagaimana dan mengapa melakukan ini
Oct 29, 2010
: Howto: Bersihkan mesin penyimpanan mysql InnoDB?Jul 05, 2012
: Pindahkan ibdata1, atur innodb_data_file_pathUPDATE 2012-08-15 12:05 EDT
Anda mungkin ingin melihat skrip mysqltuner.pl itu sendiri. IMHO saya pikir itu menggunakan formula lama untuk mengukur fragmentasi. Pastikan Anda memiliki versi terbaru mysqltuner.
Adapun untuk mengukur fragmentasi tabel InnoDB disimpan secara eksternal, saya menulis posting tentang itu kembali pada 11 April 2012 (Lihat Pembaruan di bagian bawah untuk 19 April 2012)
sumber
innodb_file_per_table
ke file conf sebelum memulai server dan mengimpor kembali). Sebelum itu saya mendapatkan semua jenis kesalahan InnoDB (yang benar-benar buruk ... yang berarti saya harus menjalankan denganinnodb_force_recovery
pada level 6 hanya untuk mendapatkan data!), Dan segala macam 'tanggal file log ada di masa depan!' kesalahan. Tampaknya sudah berhenti sekarang tapi aku masih punya beberapa meja yang cukup terfragmentasi. Saya hanya akan mengawasinya, terima kasih lagi atas masukannya