คงจะมีเพื่อนๆ อาจจะเคยพบประสบการณ์แบบนี้ครับ คือ Database Mysql Crash (Start mysql ไม่ได้)อาจไฟดับ หรือ Server ถูกปิดโดยไม่ได้ตั้งใจ จะเกิด error ดังภาพ ....(มีเพื่อนอยู รพ.แถว 3 จังหวัดชายแดนใต้ ขอความช่วยเหลือ ผมเลยเอาวิธีการมาแบ่ง เผื่อมีท่านอื่นๆเคยพบเจอแบบนี้ ) หากท่านเคยเจอปัญหาดังกล่าวมีวิธีแก้ครับ
1 . ให้ไปเพิ่มคำสั่ง ในส่วนของ [mysqld]
[mysqld] innodb_force_recovery = 4
สำหรับตัวเลขด้านหลัง มีความหมายดังนี้
1(SRV_FORCE_IGNORE_CORRUPT)Let the server run even if it detects a corrupt page. Try to makeSELECT * FROMjump over corrupt index records and pages, which helps in dumping tables.tbl_name2(SRV_FORCE_NO_BACKGROUND)Prevent the main thread from running. If a crash would occur during the purge operation, this recovery value prevents it.3(SRV_FORCE_NO_TRX_UNDO)Do not run transaction rollbacks after recovery.4(SRV_FORCE_NO_IBUF_MERGE)Prevent insert buffer merge operations. If they would cause a crash, do not do them. Do not calculate table statistics.5(SRV_FORCE_NO_UNDO_LOG_SCAN)Do not look at undo logs when starting the database:InnoDBtreats even incomplete transactions as committed.6(SRV_FORCE_NO_LOG_REDO)Do not do the log roll-forward in connection with recovery.หลังจากเพิ่มไปแล้วก็ ลิงใช้คำสั่งที่ Command Shell#service mysql startหาก Start ได้ก็มาถูกทางแล้ว หากไม่ได้ให้ลอง ปรับเปลี่ยนตัวเลข 1-6 ครับหลังจากนั้นให้ใช้ คำสั่ง ซ่อม Mysql ทุก Databasesmysqlcheck -u root -p --auto-repair --all-databaseถ้าเป็น Myisam ให้ใช้คำสั่งนี้#myisamchk -r *.MYIหรือถ้าต้องการ Repair เฉพาะ Table ก็ทำตามนี้ครับ mysql -p use db_name; #ตรวจสอบว่า Table นี้มีปัญหาหรือไม่ check table table_name; #และสามารถซ่อม Table ที่เสียจาก repair table table_name;
****การ Repair table จากคำสั่งด้านบนจะใช้ได้เฉพาะกรณีที่ table เป็น Myisam เท่านั้นหากเป็น Innodb จะใช้ไม่ได้ หากตารางพังจริงๆให้ใช้วิธีสร้างตารางขึ้นมาใหม่เป็นMyisam จากนั้นค่อย Dump มาอีกที โดยใช้คำสั่ง
insert ignore into {new_table} select * from {old_table}
หลังจากนั้นค่อย Drop table เดิม แล้วค่อย rename กลับมาชื่่อเดิมโดยใช้คำสั่ง เช่น
ALTER TABLE {table_old} RENAME TO {table_new};
จากนั้น ก็เปลี่ยน type ตารางเป็น innodb ดังเดิม โดยใช้คำสั่ง
ALTER TABLE {ชื่อtable} TYPE=InnoDB;จากนั้นให้เอา innodb_force_recovery ออกโดยการใส่ # ไว้ข้างหน้า[mysqld] #innodb_force_recovery = 4
จากนั้น#service mysql restartหาก Start ได้สำเร็จ ก็ขอดีใจด้วย ทานกู้ได้แล้ว .....****การทำทุกขั้นตอนต้องทดสอบก่อนจะทำจริงๆนะครับ ปัญหาอาจจะแตกต่างกันไป เพราะฉนั้นรูปแบบที่แนะนำ อาจจะใช้ไม่ได้กับบางกรณี... ควรทำด้วยความระมัดระวังและรอบคอบครับ

1 comment:
ขอบคุณครับ
Post a Comment