【MySQL】MySQL数据库被安装覆盖,需要修复恢复数据!

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;
【MySQL】MySQL数据库被安装覆盖,需要修复恢复数据!_第1张图片
b、cp 原来db_old/table_xyz.ibd 新的数据库中db_new/table_xyz.ibd
c、chown -R mysql:mysql db_new/table_xyz.ibd 这里要说明一下(这里需要先看一下,原有的数据库拥有者的情况,可以通过 ll当前目录来查看)
【MySQL】MySQL数据库被安装覆盖,需要修复恢复数据!_第2张图片
在这里插入图片描述
d、mysql> ALTER TABLE table_xyz IMPORT TABLESPACE;
【MySQL】MySQL数据库被安装覆盖,需要修复恢复数据!_第3张图片
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服务,删掉这张表,用获得的建表语句新建表
至此,表结构已经完全恢复。

你可能感兴趣的:(MySQL,mysql,ibdata1,frm,ibd,数据恢复)