MySQL使用全库备份数据恢复单表数据的方法

日常运维 MySQL 数据库时,我们大多会采用全实例逻辑备份,将库内所有数据表统一导出为一份 SQL 备份文件。但业务故障场景下常会出现一种需求:仅需回滚单张数据表的数据,无需恢复整库。
若直接完整还原全量备份,效率极低。目标表可能仅几十 MB,而库内其余大表动辄数十 GB 甚至上百 GB,完整导入会耗费大量时间、占用服务器 IO 资源。此时最优方案是从完整备份文件中单独抽取出目标表的建表语句与插入数据语句,仅对该表执行恢复操作。
线上环境中一台 MySQL 实例通常承载多个业务数据库,常规运维均会执行全库统一备份,所有库表内容整合至单个备份 SQL。但偶发场景只需恢复单个数据库,或是仅还原某一张数据表,下面结合实操案例讲解完整处理流程。
现有完整备份文件:fdcsqlmysql-2018_11_30-03_00_01.sql,文件包含实例全部数据表,本次需求仅恢复fdc_document单表数据。

一、提取目标表建表语句

借助 sed 文本处理命令,精准过滤备份文件中对应数据表的建表结构代码。

通用语法:

bash
运行
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `目标表名`/!d;q' 完整备份文件名.sql
适配本次需求执行命令:
bash
运行
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `fdc_document`/!d;q' fdcsqlmysql-2018_11_30-03_00_01.sql
执行后输出完整表结构代码,包含删表前置语句、字符集配置、字段定义、索引配置等完整内容示例:
sql
DROP TABLE IF EXISTS `fdc_document`;
/*!40101 SET @saved_cs_client  = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `fdc_document` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '文档ID',
  `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
  `name` char(40) NOT NULL DEFAULT '' COMMENT '标识',
  ...
  `entrust_rule` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '经纪人点击是否和用户签委托协议:1为有;0为没有',
  `audit` tinyint(3) NOT NULL DEFAULT '0' COMMENT '审核:0为未审核;1为图片已审核;2为描述已审核;3为图片和描述都已审核',
  PRIMARY KEY (`id`),
  KEY `idx_area_house` (`partition`,`category_id`,`status`,`is_off`) USING BTREE,
  KEY `idx_model_house` (`model_id`,`status`,`is_off`) USING BTREE,
  KEY `idx_community_house` (`community_id`,`estate`,`status`,`is_off`) USING BTREE,
  KEY `idx_uid_house` (`uid`,`model_id`,`is_off`) USING BTREE,
  KEY `idx_pid_house` (`id`,`pid`,`status`,`is_off`) USING BTREE,
  KEY `is_video` (`is_video`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=211138 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

二、提取目标表业务数据

通过 grep 匹配 INSERT 插入语句,单独导出该表全部业务数据至独立 SQL 文件。

通用语法:

bash
运行
grep 'INSERT INTO`目标表名`' 完整备份文件.sql > 单表数据文件.sql
本次实操执行指令:
bash
运行
grep 'INSERT INTO`fdc_document`' fdcsqlmysql-2018_11_30-03_00_01.sql > document.sql
命令执行完成后,目录下生成 document.sql 文件,内部仅存放fdc_document表全部插入语句,后续可单独导入恢复数据。

三、数据表恢复操作步骤

1. 初始化数据库与数据表

先登录 MySQL 创建对应业务数据库,再将上一步提取到的建表 SQL 执行,完成fdc_document数据表结构初始化。

2. 导入单表业务数据

进入目标数据库,使用 source 命令加载独立数据文件完成数据还原:
sql
MySQL [document]> source /data/backup/mysql/document.sql
执行完毕后,单表数据恢复流程全部完成。
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论