暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL从整库备份中恢复单表

原创 只是甲 2021-11-26
606

备注:
MySQL 5.7.31

Table of Contents

一.问题描述

之前帮朋友搭建的MySQL数据库,说是有个表的数据被误删除了,现在需要进行恢复。

二. 解决方案

还好我之前给他安装MySQL数据库的时候,特意做了备份,每天凌晨都会把整库进行备份。

2.1 从整库备份中找到单表的备份文件

2.1.1 直接通过sed命令处理

在网上找到了这个命令,用起来还不错:

sed -n -e '/CREATE TABLE.*`my_table`/,/UNLOCK TABLES/p' mydump.sql >/tmp/my_table.sql
复制

不过有点慢,9GB左右文件 5分钟左右,结果文件500M左右

速度有点慢:

2.1.2 切分后通过grep来查找

下次尝试把大文件切分一下
按1000行一个文件进行切分,最好在后台运行
split -l 1000 mydump.sql &

切分后的文件如下:

[root@not1 tmp]# ls
xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau  xav  xaw  xax  xay  xaz  xba  xbb
复制

写个shell脚本遍历:

#!/bin/bash dir=/data/tmp date for file in $dir/*; do cat $file | grep --ignore-case 'insert into `my_table`' >>/tmp/20211126.log done date echo "=================" date cat /data/dump.sql | grep --ignore-case 'insert into `my_table`' >>/tmp/20211126_2.log date ~
复制

数据量不大,只有2G,12s优化到了8s,效果还算过得去

[root@node1 data]# sh 1.sh 
Fri Nov 26 17:40:38 CST 2021
Fri Nov 26 17:40:50 CST 2021
=================
Fri Nov 26 17:40:50 CST 2021
Fri Nov 26 17:41:02 CST 202
复制

2.2 恢复到一个新表

做恢复的时候,最好是恢复到一个新库下的新表,确认数据无误后再写回原表

mysql -uroot -p -hmy_host
create database db_backup;
use db_backup;
source /tmp/my_table.sql
复制

追日志,确保无问题。

2.3 还原到源环境

因为备份表和目前系统的表 表结构不一致,所以处理起来会麻烦一些

目前系统的表比源表多一个col1字段。

-- 备份新表 create table my_new_table_bak like my_new_table; -- 将新表多的字段给删除 alter table my_new_table drop column col1; -- 从备份表同步数据 insert into my_new_table select * from db_backup.my_backup_table; -- 将删除的列再添加回来 alter table my_new_table add column col1 varchar(255); -- 清理备份表 drop table db_backup.my_backup_table;
复制

参考:

  1. https://cloud.tencent.com/developer/ask/28565
  2. https://www.cnblogs.com/mysql-dba/p/4958612.html
最后修改时间:2021-12-06 22:56:42
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论