当我们遇到只有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 demo7.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;至此,完成。