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; 查询表数据,如图


浙公网安备 33010602011771号