Tablo bozulması neredeyse her zaman bir belirtidir: bir elektrik kesintisi, dolan bir disk ya da bozulmakta olan donanım. Tabloyu onarın, sonra bunlardan hangisi olduğunu bulun - yoksa gelecek hafta yine olur.
MyISAM
mysqlcheck --check --auto-repair --databases shop
# or, for one table
mysql -e "REPAIR TABLE shop.sessions"
MyISAM'da çökme sonrası kurtarma yoktur; bu yüzden temiz olmayan bir kapanış tabloları çökmüş olarak işaretli bırakır. REPAIR onları genelde saniyeler içinde düzeltir ve bozuk satırları atabilir.
InnoDB başkadır
REPAIR TABLE, InnoDB'de çalışmaz ve oradaki bozulma ciddidir - motor normalde açılışta kendini kurtarır. InnoDB bir bozulma bildiriyorsa güvenli yol, onarım denemesi değil, bir yedekten geri yüklemektir.
mysql -e "CHECK TABLE shop.orders"
sudo tail -100 /var/log/mysql/error.log
Sunucu bu yüzden açılmıyorsa
# my.cnf - TEMPORARY, to get the data out
innodb_force_recovery = 1
- 1'den başlayın ve ancak açılmazsa yükseltin — 4'ün üstündeki düzeyler veriyi yok edebilir.
- Açılır açılmaz her şeyin yedeğini alın —
mysqldump --all-databases > rescue.sql - Ayarı kaldırın, veri dizinini yeniden kurun — ve yedeği içe aktarın.
innodb_force_recovery = 3'ün üstünde motor, yazmaların işleri daha da kötüleştirebileceği kısıtlı bir kipte çalışır. Yedeği alın ve çıkın; üzerinde bir site işletmeyin.
Sonra sebebi bulun
sudo dmesg -T | grep -iE 'i/o error|ata|nvme'
df -h
sudo smartctl -H /dev/sda
Ve MyISAM'dan çıkın
SELECT table_name, engine FROM information_schema.tables
WHERE table_schema = 'shop' AND engine <> 'InnoDB';
ALTER TABLE shop.sessions ENGINE=InnoDB;
InnoDB'de çökme sonrası kurtarma, satır düzeyinde kilitleme ve gerçek işlemler vardır. Yeni bir tablonun MyISAM olması için iyi bir gerekçe yoktur ve dönüştürmek bu sorun sınıfının tamamını ortadan kaldırır.
