情景描述
服務器上原來安裝了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服務,刪掉這張表,用獲得的建表語句新建表
至此,表結構已經完全恢復。