MySQL Data数据恢复
- 情景描述
- 案例分析
- 恢复思路
- 解决方法
- 如何恢复表结构
情景描述
服务器上原来安装了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服务,删掉这张表,用获得的建表语句新建表
至此,表结构已经完全恢复。