Mengapa semua tabel MySQL InnoDB terfragmentasi?

10

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_MBkolom (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?

Clive
sumber
Apakah Anda benar-benar berpikir 7 MB gratis adalah masalah?
David Schwartz
@ DavidSchwartz Bukan petunjuk, itu sebabnya saya bertanya;) Ada 2314 tabel, masing-masing dengan 7MB gratis, dan saya tidak tahu apa artinya itu. Saya tidak yakin mengapa mysqltuner akan menunjukkan angka itu kepada saya jika bukan penyebab potensial untuk dikhawatirkan. Saya berharap seseorang di sini mungkin dapat memberi tahu saya betapa prihatinnya untuk diberi nomor, dan apa yang dapat saya lakukan untuk mengurangi masalah karena metode 'standar' tidak berfungsi
Clive
Migrasikan pertanyaan ini sesuai permintaan pengguna dalam sebuah bendera.
Daniel Beck
Sebagian besar detail yang ditampilkan mysqltuner hanya untuk informasi. Tidak semuanya masalah. Jika ini merupakan masalah, ia akan mengatakannya dengan jelas. Apakah ini diindikasikan sebagai masalah?
John Gardeniers
@JohnGardeniers Saya percaya begitu, pesannya adalah:, [!!] Total fragmented tables: 2314yang saya cukup yakin menunjukkan masalah (dengan tanda seru merah ganda)
Clive

Jawaban:

5

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.

John Gardeniers
sumber
3

Ketika Anda mengaktifkan innodb_file_per_table , yang Anda lakukan hanyalah mengatur protokol untuk membuat tabel InnoDB baru dibuat dalam .ibdfile eksternal . Semua tabel InnoDB yang Anda buat sebelum ini masih tertanam di ibdata1.

Dengan innodb_file_per_table dinonaktifkan, setiap kali Anda menjalankan

ALTER TABLE table_name ENGINE=INNODB;

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

UPDATE 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)

RolandoMySQLDBA
sumber
1
Ahhh ok, semuanya lebih masuk akal sekarang, terima kasih. Saya akhirnya mengekspor data, menghapus MySQL sepenuhnya, lalu menginstal ulang (tetapi menambahkan innodb_file_per_tableke 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 dengan innodb_force_recoverypada 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
Clive
luar biasa! ini sangat informatif. Terima kasih @Rando_MySQLDBA!
Sudhi