当我们遇到只有MySQL5.7
的物理备份文件但只想恢复部分表数据,或者物理文件损坏无法恢复时,可以参照该文档恢复表数据。该文档的前提是 .frm 、 .idb 文件正常。
恢复过程分为 2 个步骤:恢复表结构 、恢复表数据 。如果我们已经有了表结构脚本,则可直接进入第二步。
恢复的前提是:首先你需要有一台 MySQL 服务器,创建一个数据库。示例中创建的数据叫demo,需要恢复的表也叫demo。
注意
:仅支持 InnoDB 数据库引擎。
恢复表结构
创建同名表。即这张表的名字要和要恢复的.frm 或者.ibd 一致。字段名称、类型、数量等则可随意。
create table demo(f1 int);
关闭数据库服务
service mysql stop
覆盖 demo.frm 文件
将要恢复的 demo.frm 文件覆盖新建数据库的 demo 表的 demo.frm 文件。
参考目录: /zhangqin/data/mysql/demo/ 。具体参见安装数据时配置的数据目录。设置 innodb_force_recovery
修改数据库配置文件/etc/my.cnf,文件的最后加上:
innodb_force_recovery = 6
启动数据库服务
service mysql start
查看表结构(SQL 语句)
登录数据库使用命令查看表结构,可使用 navicat 执行命令。
desc demo
执行报以下错误:
ERROR 1146 (42S02) Table ‘demo.demo’ doesn't exist
针对这个问题,我们可以通过查看 mysql 的日志文件来解决,查看 /zhangqin/data/mysql/ 文件夹里面.err 结尾的文件,你会发现出现下面所示的错误信息:[Warning] InnoDB: Table demo/demo contains 1 user defined columns in InnoDB, but 6 columns in MySQL. 是因为,我们要恢复的表有 6 个字段,而我们在创建表的时候只创建了 1 个字段。
重建 demo 表并获得表结构
关闭数据库服务 -> 注释/etc/my.cnf 中的 innodb_force_recovery = 6 -> 启动数据库服务 -> 删除 demo 表(详见 7.1) -> 创建 6 个字段 demo 表(详见 7.2) -> 重新执行以上步骤 1-6,出现表结构 -> navicat 中复制 ddl 语句(其他工具均可) -> DDL 语句最后增加 ROW_FORMAT=COMPACT (详见 7.3)。
7.1 删除 demo 表(SQL 语句)
drop table demo
7.2 创建 demo 表(SQL 语句)
create table demo(
f1 int,
f2 int,
f3 int,
f4 int,
f5 int,
f6 int,
);
7.3 DDL 示例
CREATE TABLE `demo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`creator_id` bigint(20) NOT NULL COMMENT '创建人ID',
`modifier_id` bigint(20) DEFAULT NULL COMMENT '修改人ID',
`gmt_create` datetime NOT NULL COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识:0->未删除;1->已删除',
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表数据恢复DEMO表' ROW_FORMAT=COMPACT;
注意
:DDL 的末尾需要添加ROW_FORMAT=COMPACT。
恢复表结构
关闭数据库服务 -> 注释掉/etc/my.cnf 中的 innodb_force_recovery = 6 -> 启动数据库服务 -> 删除 demo 表 -> 执行刚才复制出的 DDL 语句 -> 表结构恢复完成。
恢复表数据
解除.frm、.idb 文件绑定(SQL 语句)
alter table demo discard tablespace;
关闭数据库服务
略。覆盖 demo.idb 文件
参考目录: /zhangqin/data/mysql/demo/ 。具体参见安装数据时配置的数据目录。文件赋权
chmod 777 /zhangqin/data/mysql/demo/demo.idb
启动数据服务
略恢复.frm、.idb 文件绑定(SQL 语句)
alter table demo import tablespace;
至此,完成。