記錄一次MySQL的拯救過程

1 背景

       公司某個業務系統的MySQL貌似被黑死活啓動不了,氣急之下決定重置數據庫。業務數據庫名稱dzjf,庫表位於/var/lib/mysql/dzjf目錄,備份的時候僅僅備份了次目錄下的所有文件,很不幸手頭居然沒有所有表的SQL腳本。

2 步驟

2.1 恢復表結構

      首先重新創建一個數據庫dzjf:

      CREATE DATABASE dzjf;

      USE dzjf;

      接着創建一張表,表的名字要和你要恢復的表名一致,這裏我要恢復user表。但是我不知道原先user表裏的字段名稱和字段類型了,怎麼辦?沒關係,用UltraEdit打開備份出來的user.frm文件,在文件的最後你可以看到都有哪些字段,

       當然還是看不出字段類型,但這已經足夠了,我們只要知道接有幾個字段就行,字段類型可以忽略,接下來要創建的user表只要字段數量能夠對應上就可以,字段類型隨意。

       CREATE TABLE user(id1 INT, id2 INT, id3 INT, id4 INT, id5 INT, id6 INT, id7 INT, id8 INT, id9 INT, id10 INT, id11 INT, id12 INT, id13 INT, id14 INT, id15 INT);

       創建好後,我們退出mysql,同時停止mysql的服務

       systemctl stop mysql.service

       然後將之前備份的user.frm文件複製到/var/lib/mysql/dzjf目錄下覆蓋掉剛創建的user.frm。然後重新啓動mysql。

       systemctl start mysql.service

       重新進入mysql控制檯,執行以下命令:

       USE dzjf;

       DESC user;

       此時我們可以看到奇蹟發生了,user表的結構恢復出來了,

趕緊把user表的DDL導出來吧,

      SHOW CREATE TABLE user\G

那表結構都恢復了,那我們就可以使用user表了嗎?答案是:NO。我們需要把這個表刪除,然後用導出的建表SQL重新建表,這個時候的表纔是真正能使用的。

2.2 恢復表數據

      恢復表數據需要首先將新建的user.ibd文件與user.frm文件解除綁定,具體就是在控制檯執行下面命令:

      ALTER TABLE user DISCARD TABLESPACE;

      接着退出控制檯,停止mysql服務,然後將前面備份的user.ibd文件覆蓋這個新建的user.ibd文件,再重新開啓mysql服務。最後將user.ibd文件與user.frm文件重新關聯。具體執行下面命令:

      ALTER TABLE user IMPORT TABLESPACE;

這時候查看user表,就會發現數據已經成功恢復啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章