Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ตรวจสอบตารางที่ crashed ใน MySQL ด้วย SHOW TABLE STATUS


หลักการ

ตารางที่ 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

  1. Backup ข้อมูลก่อน (ถ้าอ่านได้)
  2. Restart MySQL ด้วย innodb_force_recovery ใน my.cnf
  3. 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