生產環境中的mysql突然啟動不了,查了原因是innodb庫錯誤,以前就遇到過這個問題,稀里糊塗的沒解決,結果導致大量數據丟失。這些又遇到這個問題,果斷把那個有問題的數據庫移動了別的地方,啟動了mysql使用。然后正好趕上中秋節假期,所以花了兩天時間認真查資料,一點點的解決問題。
因為我是用docker做了一個沙箱,但是啟動不起來,在這里上面浪費了半天的時間。這個跳過,直接說一下思路和過程。有什么問題可以微信我(winsonhsu)備注mysql技術交流
整個過程需要三個庫 we7 we7_old we7_tmp
1.備份數據庫文件夾we7
2.設置數據庫為恢復模式innodb_force_recovery = 3
3.啟動數據庫we7
4.此時可以看到庫里的innodb數據表都沒有顯示出來.只有myiasm表
4.創建一個新庫we7_tmp
5.使用navcat的tools>>data transfer 庫建從we7到新庫we7_tmp 這樣就把myiasm庫都復制過去了
6.還原一個過去備份的數據庫we7_old,用navcat里的tool>>structure synchronization工具進行架構比較,只比較表,得到差異后只復制增加的表語句,得到innodb的表結構 innodb.sql
7.在we7_tmp中執行innodb.sql
8.將復制過來的.ibd文件與.frm文件發生聯系。具體就是在控制台執行下面命令:
for f in \((ls *.ibd); do echo "alter table" \)(basename $f .ibd) " import tablespace;" >> import.sql; done
得到import.sql文件等一下使用
恢復表數據需要首先將原先的.ibd文件與原先的.frm文件解除綁定,具體就是在控制台執行下面命令:
for f in \((ls *.ibd); do echo "alter table" \)(basename $f .ibd) " discard tablespace;" >> discard.sql; done
得到discard.sql語句等一下使用
9在we7_tmp庫中執行discard.sql
10.將we7文件夾中的ibd文件全部拷貝過來
cp /www/backup/we7_test/*.ibd /www/docker/mysql/data/we7_test/
設置權限為全部可以讀寫
11.在we7_tmp庫中執行import.sql
12.設置完成后刪除we7和we7_old數據庫 將we7_tmp數據庫重命名為we7 寫一個rename.sh
#!/bin/bash
# 假設將we7_tmp數據庫名改為we7
# MyISAM直接更改數據庫目錄下的文件即可
mysql -uroot -pmD4Yyxrb3tcLDLFw -e 'create database if not exists we7_test'
list_table=$(mysql -uroot -pmD4Yyxrb3tcLDLFw -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='we7_tmp'")
for table in $list_table
do
mysql -uroot -pmD4Yyxrb3tcLDLFw -e "rename table we7_tmp.$table to we7_test.$table"
done
執行./rename.sh
數據庫修復完成,全部數據都回來了