mysql restore data

Mysql 通过frm&ibd 恢复数据

mysql存储在磁盘中,各种天灾人祸都可能会导致数据丢失,万一还没有做好备份,数据被误删除了,或者ibdata损坏了怎么办呢?别担心,只要有部分的frm、ibd存在就可以恢复部分数据。

 

系统环境

系统版本:CentOS Linux release 7.5.1804 (Core)
数据库版本:mariadb-10.2.18

思路

1.恢复表结构
2.复制出来创建表的sql语句
3.恢复表数据

恢复innodb类型数据表结构(如果表结构清楚,请直接跳过看恢复innodb表数据)

第一步:
创建一个数据库并且创建一个表的名字要和你要恢复的.frm一致
这里随便使用一个表做恢复操作,创建的新的表字段随意
>  create database  tmp;
>  use tmp;
> CREATE TABLE `channel_report_2017_02` (
`id` int(11),
`name1` varchar(8)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;


第二步:
关闭数据库  
# systemctl  stop mysqld
修改my.cnf的配置,在[mysqld]下面添加innodb_force_recovery=6 保存退出
使用需要恢复的channel_report_2017_02.frm文件覆盖创建的tmp数据库下面的表文件
# cp  channel_report_2017_02.frm  /data/mysql/tmp/channel_report_2017_02.frm
启动数据库
# systemctl  start mysqld
> use tmp;
> show create table channel_report_2017_02;
出现如下的错误提示
Table 'tmp.channel_report_2017_02' doesn't exist in engine
针对这个问题,我们可以通过查看mysql的日志文件来解决,大概的警告如下图
由错误信息可以知道,这个表有20个字段
注释my.cnf里面的#innodb_force_recovery=6,重新启动数据库

第三步:
删除tmp下面创建的表
>  drop table channel_report_2017_02;
然后重新创建一个有20个字段的表,关闭数据库,修改配置文件my.cnf,打开
参数innodb_force_recovery=6,
重新拷贝需要恢复的表文件channel_report_2017_02.frm到/data/mysql/tmp/channel_report_2017_02.frm
重启数据库
> use tmp ;
> show create table channel_report_2017_02;
这个时候就能显示出正确的建表语句,保存建表语句,表结构就恢复了

恢复innodb类型表数据

先关闭数据库,更改配置文件,关闭#innodb_force_recovery=6,然后重启数据库
创建正确的表
> use tmp; 
> create table true_table;
需要将创建的表原先的.ibd文件与原先的.frm文件解除绑定
> alter table channel_report_2017_02 discard tablespace;
关闭数据库,拷贝需要恢复的表数据文件(注意拷贝过去的文件权限问题)
# cp  channel_report_2017_02.ibd  /data/mysql/tmp/channel_report_2017_02.ibd
启动数据库,将.ibd和.frm进行关联
> alter table channel_report_2017_02 import tablespace;
查询表数据,如图

 

 

  

posted @ 2020-09-15 14:16  风不动幡动  阅读(234)  评论(0)    收藏  举报