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. 1'den başlayın ve ancak açılmazsa yükseltin — 4'ün üstündeki düzeyler veriyi yok edebilir.
  2. Açılır açılmaz her şeyin yedeğini alın — mysqldump --all-databases > rescue.sql
  3. 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.