Tabel MyISAM agak mudah rusak.
Di header setiap tabel MyISAM adalah penghitung yang melacak berapa banyak file yang terbuka menangani ada di meja.
Jika Anda memulai mysql dan nomor di header tidak cocok dengan jumlah penanganan file yang sebenarnya, mysqld memperlakukan tabel sebagai macet.
Jika sederhana REPAIR TABLE mdl_user
membuatnya berfungsi lagi setiap kali tanpa kehilangan data, ini dapat menunjukkan bahwa Anda memiliki situs yang sangat diperdagangkan untuk menulis mdl_user
.
Jika puluhan tabel memerlukan ini REPAIR TABLE
, saya akan mengonversi semua tabel ke InnoDB. Namun, jika mdl_user
tabel adalah satu-satunya tabel dengan masalah ini, ada sesuatu yang dapat Anda lakukan (untuk contoh ini, katakanlah database adalah moodle
);
Jika Anda ingin semua tabel dibiarkan sebagai MyISAM
LANGKAH 01: Buat Skrip Tabel Perbaikan
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
LANGKAH 02: Nyatakan Skrip Perbaikan sebagai file startup
Tambahkan ini ke /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
LANGKAH 03: Mulai ulang mysql
Setiap restart mysql akan memicu Script Tabel Perbaikan
Jika Anda ingin semua tabel menjadi InnoDB
Jalankan kode ini untuk membuat skrip konversi massal tabel MyISAM ke InnoDB, dan melihatnya
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
Setelah Anda puas dengan konten skrip konversi, kemudian jalankan
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
UPDATE 2012-03-15 14:00 EDT
@ Kevin , Saat menggunakan MyISAM, bagaimana jika kehabisan Disk Space adalah masalah Anda?
Berikut adalah sesuatu yang perlu dipertimbangkan: Menurut Panduan Studi Sertifikasi MySQL 5.0 ,
bulletpoint # 11 mengatakan yang berikut di Halaman 408.409 Bagian 29.2:
Jika Anda kehabisan ruang disk saat menambahkan baris ke tabel MyISAM, tidak ada kesalahan terjadi. Server menunda operasi sampai ruang tersedia, dan kemudian menyelesaikan operasi.
Ketika Anda kehabisan ruang disk, jangan hanya mematikan atau membunuh mysql. Hitungan pegangan file terbuka di MyISAM yang saat ini digunakan tidak akan dihapus. Dengan demikian, tabel MyISAM ditandai macet. Jika Anda dapat mengosongkan ruang disk dalam volume data dengan mysqld masih berjalan, mysqld akan menjadi prajurit pada saat ruang disk tersedia.
Saya juga mengelola situs moodle di mysql, dan penyebab paling umum kerusakan tabel bagi kami adalah kehabisan ruang disk.
sumber
Saya menemukan satu baris yang bagus untuk mengonversi semua tabel ke InnoDB:
sumber