• 已删除用户
Administrator
发布于 2020-07-14 / 2 阅读
0

MySQL基于物理备份文件的表数据恢复

当我们遇到只有MySQL5.7的物理备份文件但只想恢复部分表数据,或者物理文件损坏无法恢复时,可以参照该文档恢复表数据。该文档的前提是 .frm.idb 文件正常。
恢复过程分为 2 个步骤:恢复表结构恢复表数据 。如果我们已经有了表结构脚本,则可直接进入第二步。

恢复的前提是:首先你需要有一台 MySQL 服务器,创建一个数据库。示例中创建的数据叫demo,需要恢复的表也叫demo

注意:仅支持 InnoDB 数据库引擎。

恢复表结构

  1. 创建同名表。即这张表的名字要和要恢复的.frm 或者.ibd 一致。字段名称、类型、数量等则可随意。

create table demo(f1 int);
  1. 关闭数据库服务

service mysql stop
  1. 覆盖 demo.frm 文件
    将要恢复的 demo.frm 文件覆盖新建数据库的 demo 表的 demo.frm 文件。
    参考目录: /zhangqin/data/mysql/demo/ 。具体参见安装数据时配置的数据目录。

  2. 设置 innodb_force_recovery
    修改数据库配置文件/etc/my.cnf,文件的最后加上:

innodb_force_recovery = 6
  1. 启动数据库服务

service mysql start
  1. 查看表结构(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 个字段。

  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

  1. 恢复表结构

    关闭数据库服务 -> 注释掉/etc/my.cnf 中的 innodb_force_recovery = 6 -> 启动数据库服务 -> 删除 demo 表 -> 执行刚才复制出的 DDL 语句 -> 表结构恢复完成。

恢复表数据

  1. 解除.frm、.idb 文件绑定(SQL 语句)

alter table demo discard tablespace;
  1. 关闭数据库服务
    略。

  2. 覆盖 demo.idb 文件
    参考目录: /zhangqin/data/mysql/demo/ 。具体参见安装数据时配置的数据目录。

  3. 文件赋权

chmod 777 /zhangqin/data/mysql/demo/demo.idb
  1. 启动数据服务

  2. 恢复.frm、.idb 文件绑定(SQL 语句)

alter table demo import tablespace;
  1. 至此,完成。