【MySQL核心】误删除表?帮你时间倒流!!!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL核心】误删除表?帮你时间倒流!!!

简述:

在真实的业务场景中,有时候误删除表可能不止是将这个表找回来那么简单,还需要经过业务方确认是否要补数据等处理方式。

我这里是通过备份+截取 binlog 的方式将数据恢复到删除前一个事务。

恢复思路:

  • 1、从物理备份中获取表空间 / 或者从逻辑备份中过滤出单表
  • 2、将表空间 import 到数据库 / 或者导入逻辑备份的单表
  • 3、通过 my2sql 过滤出待恢复表的 SQL语句
  • 4、将语句恢复至数据库完成恢复

1、删除一个表

drop table t_user;

2、停止业务(防止对数据二次伤害)

主库防止写入开启只读模式

set global read_only=1;

3、从物理全备恢复

解压备份文件

tar  xf  /data/backup/full.tar.gz

将备份文件重做备份路径

innobackupex --apply-log  /data/backup/full

创建一张表结构相同的表,并释放表空间

alter  table  t_user discard  tablespace;

将备份中 t_user.ibd 文件cp到生产库的相对应的库下面

cp -a  innobackupex.exp  t_user.ibd   /mydata/3306/data/test/

将文件赋权

chown -R mysql:mysql /mydata/3306/data/test/t_user.ibd

将表空间导入到生产库中

alter table t_user import tablespace;

查看数据

select * from t_user limit 10;

4、从逻辑全备恢复

如果你的是逻辑备份可以这样操作

#从全备中提取出该表的建表语句
sed -e  '/./{H;$!d;}' -e 'x;/CREATE TABLE `t_user`/!d;q' full.sql >  /tmp/t_user.sql
#提取该表的insert into语句
grep  'INSERT INTO `t_user`' full.sql >> /tmp/t_user.sql

将备份文件恢复至数据库

# 登陆数据库 执行 source
use test  # 进入库
source /tmp/t_user.sql  # 执行导入

注意:这里备份文件要手动打开看下是不是你想要的表和数据

恢复至这里已经把备份的数据恢复好了,但是备份完这段时间数据库依然在运行中,这段时间的数据都在 binlog 中,但是怎么从 binlog 中提取单个表的数据呢?

5、截取 binlog 恢复

这里选择使用 go 语言编写的 my2sql 工具进行恢复,相比于其他工具,my2sql 速度更快,功能也比较丰富。在恢复前需要先找出备份的 position 信息和 drop table 前一个position 信息用来指定恢复的位置。

项目地址:https://github.com/liuhr/my2sql

获取位置信息

获取备份结束的 position 信息

# 查看备份结束位置(--start-position位置)
cat /data/backup/full/xtrabackup_binlog_info
mysql-bin.000007    13524   # start-position位置

获取删除表前一个 position 信息

# 通过mysqlbinlog 查找删除前一个position 位置
mysqlbinlog  /mydata/3306/mysql-bin.000007 |grep  -i -B20 -C10 'drop table'
COMMIT/*!*/;
# at 43459
#240815 13:46:59 server id 330651  end_log_pos 43524 CRC32 0xd7e4f2a5   Ignorable
# Ignorable event type 33 (MySQL Gtid)
# at 43524    # 使用前一个位置点  --stop-position 位置
#240815 13:46:59 server id 330651  end_log_pos 43645 CRC32 0x0455269b   Query   thread_id=7     exec_time=0     error_code=0    xid=0
SET TIMESTAMP=1723700819/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
DROP TABLE `users` /* generated by server */

生成 sql 语句

通过my2sql 生成 users 表的 sql 语句。

安装工具

https://github.com/liuhr/my2sql

# 安装 git 和 go
yum install -y git go
git clone https://github.com/liuhr/my2sql.git
cd my2sql/
go build .
# 还可以直接下载打包好的 linux 文件 
https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql

获取单表数据

my2sql  \
-user root -password 123456  -port 3306 \
-host localhost -databases test_db  -tables orders \
-work-type 2sql   -start-file  mysql-bin.000007 \
-start-pos=44863 -stop-pos=54850 \
-output-dir /tmp

-databases 指定库

-tables 指定表

-work-type 转换类型 为 sql

-start-file 指定 binlog 文件

-start-pos 指定开始位置点

-stop-pos 指定结束位置点

-output-dir 输出文件

将 sql 导入到数据库

# 登陆 mysql
mysql -uroot -p
# 导入sql
source /tmp/forward.1.sql

欢迎、点赞、收藏、转发,下期可以详细写下 my2sql 这个工具。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL 关系型数据库
MySQL 给数据表增加一列,一定会锁表吗?
【8月更文挑战第8天】在数据库管理和开发中,给数据表增加一列是一个常见的操作。然而,当面试官提出“MySQL 给数据表增加一列,一定会锁表吗?”这一问题时,答案并非绝对。这主要取决于MySQL的版本、存储引擎以及具体的操作方式。
108 0
|
3月前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
27 1
|
29天前
|
SQL 关系型数据库 MySQL
MySQL 恢复误删除数据
MySQL 恢复误删除数据
21 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL之如何针对重复数据做一些工作
MySQL之如何针对重复数据做一些工作
59 1
|
4月前
|
SQL 存储 关系型数据库
向 MySQL 数据库插入 100w 条数据的优化方案
向 MySQL 数据库插入 100w 条数据的优化方案
79 1
|
4月前
|
SQL 存储 关系型数据库
MySQL中的分析表、检查表与优化表如何操作?
MySQL中的分析表、检查表与优化表如何操作?
103 0
|
12月前
|
SQL 关系型数据库 MySQL
mysql大批量插入数据的正确做法
mysql大批量插入数据的正确做法
137 0
|
存储 关系型数据库 MySQL
头大了,Mysql写入数据十几秒后被自动删除了
头大了,Mysql写入数据十几秒后被自动删除了
77 0
|
关系型数据库 MySQL 数据库
MySQL数据增加语句
MySQL数据增加语句
75 0
|
SQL 存储 数据可视化
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
284 0
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏