Tabel yang rusak hampir selalu merupakan gejala: listrik padam, cakram yang penuh, atau perangkat keras yang sedang jebol. Perbaiki tabelnya, lalu cari tahu yang mana di antara ketiganya - kalau tidak, pekan depan terjadi lagi.
MyISAM
mysqlcheck --check --auto-repair --databases shop
# or, for one table
mysql -e "REPAIR TABLE shop.sessions"
MyISAM tak punya pemulihan pasca-kejatuhan, jadi mati yang tak rapi meninggalkan tabel bertanda jatuh. REPAIR biasanya membereskannya dalam hitungan detik, dan bisa membuang baris yang rusak.
InnoDB itu lain
REPAIR TABLE tidak bekerja pada InnoDB dan kerusakan di sana itu serius - mesinnya biasanya memulihkan dirinya sendiri saat menyala. Kalau InnoDB melaporkan kerusakan, jalan yang aman adalah memulihkan dari cadangan, bukan mencoba memperbaiki.
mysql -e "CHECK TABLE shop.orders"
sudo tail -100 /var/log/mysql/error.log
Kalau servernya menolak menyala karenanya
# my.cnf - TEMPORARY, to get the data out
innodb_force_recovery = 1
- Mulai dari 1 dan naikkan hanya kalau ia tak mau menyala — tingkat di atas 4 bisa menghancurkan data.
- Cadangkan semuanya begitu ia menyala —
mysqldump --all-databases > rescue.sql - Cabut pengaturannya, bangun ulang direktori datanya — lalu impor cadangannya.
Di atas innodb_force_recovery = 3, mesinnya berjalan dalam mode terbatas yang penulisannya justru bisa memperburuk keadaan. Ambil cadangannya lalu keluar; jangan menjalankan situs di atasnya.
Lalu temukan sebabnya
sudo dmesg -T | grep -iE 'i/o error|ata|nvme'
df -h
sudo smartctl -H /dev/sda
Dan tinggalkan MyISAM
SELECT table_name, engine FROM information_schema.tables
WHERE table_schema = 'shop' AND engine <> 'InnoDB';
ALTER TABLE shop.sessions ENGINE=InnoDB;
InnoDB punya pemulihan pasca-kejatuhan, penguncian tingkat baris, dan transaksi yang sungguhan. Tak ada alasan bagus bagi tabel baru untuk memakai MyISAM, dan mengonversinya melenyapkan seluruh golongan masalah ini.
