【MySQL】MySQL數據庫被安裝覆蓋,需要修復恢復數據!

情景描述

服務器上原來安裝了MySQL 5.7.x,且正在實時運行。後來由於菜鳥人員在服務器上安裝了寶塔,並且重新安裝了MySQL5.5.x 。導致原來的項目都癱瘓了。運維排查發現問題,數據文件還在,只是配置文件被覆蓋。

案例分析

原來數據庫採用的是InnoDB和MyISAM引擎同時存在。

恢復思路

把原來數據庫的data文件直接複製到新數據庫data文件夾中,會發現,MyISAM中的data文件可以直接覆蓋,且可以被查看使用,但是InnoDB的數據表無法打開,會提示表不存在。

解決方法

正常情況下,當原來服務器的MySQL由於誤操作而無法使用,可以在服務器上新建與原來數據庫相同版本的MySQL,再將ibdata1、data中的數據庫文件直接複製到新的數據庫中,將文件的所有者權限改成mysql mysql即可。(如下:chown -R mysql:mysql ibdata1)

如果ibdata1文件被損壞或者被覆蓋就會無法直接恢復,這時候需要通過 frm+ibd文件來對數據表進行恢復。

1、如果有原來數據庫(這裏成爲db_old)的表結構,可以很好很快的恢復:
操作:

00、先新建一個數據庫(db_new),與原來的庫沒有任何關係
01、將原有數據庫結構導入新的數據庫中
02、對新的數據庫中的各個表進行如下操作

a、 mysql> ALTER TABLE table_xyz DISCARD TABLESPACE;
在這裏插入圖片描述
b、cp 原來db_old/table_xyz.ibd 新的數據庫中db_new/table_xyz.ibd
c、chown -R mysql:mysql db_new/table_xyz.ibd 這裏要說明一下(這裏需要先看一下,原有的數據庫擁有者的情況,可以通過 ll當前目錄來查看)
在這裏插入圖片描述
在這裏插入圖片描述
d、mysql> ALTER TABLE table_xyz IMPORT TABLESPACE;
在這裏插入圖片描述
e、執行完成,數據應該就可以恢復了

2、如果沒有原來的表結構,則需要通過frm先恢復表結構,然後再恢復數據:

如何恢復表結構

首要的一件事情就是恢復表結構,如果很幸運地保留了當時的表結構,此步可跳過,直接執行上面的1步驟。

1.1 隨意創建一張同名表
CREATE TABLE table_xyz(a int)ENGINE=InnoDB;

1.2 關閉mysql服務
net stop mysql

1.3 複製備份的db_old/table_xyz.frm覆蓋新建的表db_new/table_xyz.frm
1.4 開啓mysql服務
net start mysql
1.5 在mysql安裝目錄data文件夾下用文本編輯器打開.err文件
這是mysql的錯誤日誌,找到諸如 
 [Warning] InnoDB: Table db_new/table_xyz contains 1 user defined columns in InnoDB, but 6 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS 的記錄,發現原表擁有6個字段。
 
1.6 刪除當前表,新建一張擁有6個字段的同名表
mysql> DROP TABLE table_xyz;
Query OK, 0 rows affected (0.26 sec)

mysql>CREATE TABLE table_xyz(a1 int,a2 int,a3 int,a4 int,a5 int,a6 int)ENGINE=InnoDB;
Query OK, 0 rows affected (0.66 sec)

1.7 重複步驟1.2-1.3
修改配置文件my.ini在[mysqld]下添加/修改innodb_force_recovery=6

1.8 啓動mysql服務,查看錶結構,發現表結構已經恢復
mysql> desc table_xyz;
+-------------+---------------+------+-----+-------------------+----------------+
| Field       | Type          | Null | Key | Default           | Extra          |
+-------------+---------------+------+-----+-------------------+----------------+
| id          | int(11)       | NO   | PRI | NULL              | auto_increment |
| uid         | varchar(10)   | NO   |     | NULL              |                |
| content     | varchar(1000) | YES  |     | NULL              |                |
| pub_time    | varchar(20)   | YES  |     | NULL              |                |
| tool        | varchar(50)   | YES  |     | NULL              |                |
| create_time | datetime      | YES  |     | CURRENT_TIMESTAMP |                |
+-------------+---------------+------+-----+-------------------+----------------+
6 rows in set, 1 warning (0.01 sec)

導出表結構,在命令提示符下輸入 
mysqldump -uroot -proot db_new table_xyz> d:\table_xyz.sql 
在.sql文件中找到建表語句。 
或者也可以用數據庫管理軟件如navicat中找到這張表,在對象信息中複製下DDL選項卡里的內容。

1.9 停止mysql服務,修改配置文件my.ini
修改innodb_force_recovery=0或者直接註釋掉。

2.0 啓動mysql服務,刪掉這張表,用獲得的建表語句新建表
至此,表結構已經完全恢復。

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