mysql 數據庫壞表修復
蘿蔔白菜,各有所愛,能幹活、能修復表纔是王道!!!
修復之前謹記:先備份數據庫 (備份完成後再進行以下修復操作)
可以mysqldump -A > all.sql 進行全庫備份 (mysqldump導出錯誤的時候可以省略錯誤的表進行導出其他的數據添加選項 --ignore-table=table_name ) 也可以進入到/usr/local/shell/ 執行 mysql_backup.sh進行備份數據庫 以上兩種方式都不可以備份 可以進入到/data/mysql/3306目錄裏面將以下所有文件信息copy一份
針對MyIsam表進行修復方法
1.描述:
在數據庫可以進入 mysql程序正常,只有日誌中拋有tables錯誤的時候使用以下修復:
mysql> REPAIR TABLE 表名
3.描述:
在數據庫不能進入、數據庫程序不能夠正常啓動的時候使用
mysqlcheck -Aor (此命令在數據庫外執行,針對所有myisam的數據庫表進行修復 -A=所有all、-o, --optimize 進行對索引優化【重新整理索引】-r, --repair 修復 )
shell# mysqlcheck -Aor 執行的時候會拋出錯誤(凡是innodb表都會拋錯誤)
在知道是那個表錯誤的情況下可以使用以下命令進行修復 (後續可以添加-f選項 force 強制修復,慎用此選項操作)
shell# myisamchk -oar tables.MYI
針對Innodb表修復方法
1.描述:
數據庫可以進入 mysql程序正常,只有日誌中拋有tables錯誤的時候使用以下修復:
1、通過mysqldump將錯誤的表進行導出(僅導出數據即可),確定導出沒有問題!
2、進入mysql truncate table 表名
3、通過mysql命令將剛纔導出的數據庫數據灌入即可搞定
2.描述:
可參考 http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
數據庫無法正常啓動,日誌中存在表錯誤,index錯誤信息 修復:
1、在my.cnf文件裏面添加
[mysqld]
innodb_force_recovery = 1 (1級別最低通常只是作爲跳過表錯誤正常啓動mysql服務)
級別越高,修復難度越大、 (1-6)
1(SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁。
2(SRV_FORCE_NO_BACKGROUND):阻止主線程的運行,如主線程需要執行full purge操作,會導致crash。
3(SRV_FORCE_NO_TRX_UNDO):不執行事務回滾操作。
4(SRV_FORCE_NO_IBUF_MERGE):不執行插入緩衝的合併操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日誌,InnoDB存儲引擎會將未提交的事務視爲已提交。
6(SRV_FORCE_NO_LOG_REDO):不執行前滾的操作。
2、能夠正常啓動mysql後,上層應用不用啓動、防止寫入數據出現錯誤
進入mysql 進行更改錯誤表的信息
mysql> alter table table_name ENGINE=myisam;
修改完成後使用Myisam的修復方式進行修復
修復完成之後將表更改爲innodb 、my.cnf 文件的innodb_force_recovery = 1 註釋掉之後重新啓動mysql注意觀察日誌是否拋錯
3、通過數據庫備份加binlog日誌進行恢復,步驟過多,不予寫出
仍然可以參考 http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
進行恢復