mysql通過idb文件,恢復數據庫

原因: 由於一次未知原因,服務器停機後,導致數據庫不能啓動,由於剛接手項目,對此數據庫的配置不是那麼清晰,分析了很多,最後還是沒發正常啓動。由於發現數據idb文件還在,最後就採取了險招,重新安裝mysql,通過mysql的idb文件來恢復數據。

解決:

第一步: 完全卸載mysql數據庫

ubantu 徹底卸載mysql
sudo apt-get autoremove --purge mysql-server 
sudo apt-get remove mysql-common
sudo rm -rf /etc/mysql/  /var/lib/mysql
#清理殘留數據
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P  
sudo apt autoremove
sudo apt autoclean

第二步: 重新安裝mysql數據庫

Ubantu下安裝mysql8可自行百度;參考鏈接:https://www.linuxidc.com/Linux/2018-11/155408.htm

安裝後可能出現:
mysql 數據庫不允許遠程連接: ‘Host’ is not allowed to connect to this mysql server

方法一:修改 host 表

進入mysql數據庫,選擇mysql 
mysql> use mysql;

選擇 host 表
mysql> select host from user;

更新 host, 然後退出。
mysql> update user set host = '%' where user='root';

重啓數據庫, 完成。
service mysqld restart

如果報錯:Access denied for user ‘XXX’@’XXX’ (using password: YES) 請參考我的另一篇博文:
https://blog.csdn.net/qq_23035335/article/details/100522054

第三步:恢復數據

通過idb文件 恢復mysql數據

  • 首先需要一個跟要恢復的表結構完全一致的表。
    (在建表語句末尾加上 ROW_FORMAT=compact 或 ROW_FORMAT=DYNAMIC(mysql8默認);(InnoDB的行記錄格式有 Compact, Redundant, Compressed, Dynamic,具體要看自己的mysql用的是哪種)備份的表結構可以從備份庫,測試庫搞定表結構,可以刪掉外鍵約束,後面執行會方便很多。)
  • 然後執行ALTER TABLE 表名 DISCARD TABLESPACE。(ALTER TABLE table_name DISCARD TABLESPACE)
    (這裏一定不能手動刪除ibd文件,如果刪除了會導致mysql停止後無法重啓)
  • 把要恢復的ibd文件複製到mysql的data文件夾下。
    (默認路徑是/var/lib/mysql/數據庫名,在執行恢復之前,就應該已經知道了數據存儲目錄,同時也把所有的idb文件已備份,用於恢復。copy到目標位置後得檢查下權限,是不是mysql:mysql,不然執行下面的導入語句時會報錯:找不到對應的idb,實際可能是對應的idb文件權限不足)
  • 然後執行ALTER TABLE 表名 IMPORT TABLESPACE。(ALTER TABLE table_name IMPORT TABLESPACE)

完成,數據恢復成功,表很多的話可以採取一些批量處理措施,不然工作量會有點大。

附:導出數據庫到文件
/usr/bin/mysqldump -u root -密碼 --default-character-set=utf8 數據庫名> ./database_db.sql

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