หลักการ
ตารางที่ crashed (เสียหาย) จะมีคอลัมน์ Engine เป็น NULL หรือว่างเปล่า ในผลลัพธ์ของ SHOW TABLE STATUS
คำสั่งตรวจสอบ
SHOW TABLE STATUS FROM yourDatabaseName;
ตัวอย่างผลลัพธ์จาก database 'test3'
mysql> show table status from test3;
+------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+ | bestdateformatdemo | InnoDB | 10 | Dynamic | 4 | 4096 | 16384 | 0 | 0 | 0 | 5 | 2019-02-22 22:49:43 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | | countdemo | InnoDB | 10 | Dynamic | 4 | 4096 | 16384 | 0 | 0 | 0 | 4 | 2019-02-26 15:21:12 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | | deletedemo | InnoDB | 10 | Dynamic | 6 | 2730 | 16384 | 0 | 0 | 0 | NULL | 2019-02-13 19:20:04 | NULL | NULL | utf8mb4_0900_ai_ci | NULL | | | | ... (ตารางอื่นๆ ทั้งหมด Engine = InnoDB) ... +------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
วิธีอ่านผลลัพธ์
- Engine = InnoDB/MyISAM/MEMORY → ตารางปกติ
- Engine = NULL หรือว่าง → ตาราง crashed/เสียหาย
- คอลัมน์ Comment อาจมีข้อความ error เพิ่มเติม
ในตัวอย่างข้างต้น
ทุกตารางมี Engine = InnoDB → ไม่มีตาราง crashed
หากพบตาราง crashed (Engine = NULL)
MyISAM: ใช้ REPAIR TABLE
REPAIR TABLE table_name;
InnoDB: ใช้ InnoDB Recovery
- Backup ข้อมูลก่อน (ถ้าอ่านได้)
- Restart MySQL ด้วย
innodb_force_recoveryใน my.cnf - Dump ข้อมูล แล้ว drop และ recreate table
ป้องกันไม่ให้ crashed
- ใช้ InnoDB (default ตั้งแต่ MySQL 5.5) - มี crash recovery อัตโนมัติ
- ปิด MySQL อย่างถูกต้อง (SHUTDOWN ไม่ใช่ kill -9)
- ตรวจสอบ disk space ให้เพียงพอ
- Backup เรียบร้อย
หมายเหตุ: InnoDB ไม่ค่อยเกิด crashed table เพราะมี WAL (Write-Ahead Logging) และ crash recovery อัตโนมัติตอน startup