Monday, March 18, 2013

การกู้คืน Mysql Database (Forcing Recovery)

การกู้คืน Mysql Database (Forcing Recovery)

คงจะมีเพื่อนๆ อาจจะเคยพบประสบการณ์แบบนี้ครับ คือ 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 make SELECT * FROM tbl_name jump over corrupt index records and pages, which helps in dumping tables.
  • 2 (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: InnoDB treats 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 ทุก Databases 
    mysqlcheck -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:

a said...

ขอบคุณครับ