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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【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
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL如何排查和删除重复数据
该文章介绍了在MySQL中如何排查和删除重复数据的方法,包括通过组合字段生成唯一标识符以及使用子查询和聚合函数来定位并删除重复记录的具体步骤。
146 2
|
3月前
|
存储 SQL 关系型数据库
MySQL 给数据表增加一列,一定会锁表吗?
【8月更文挑战第8天】在数据库管理和开发中,给数据表增加一列是一个常见的操作。然而,当面试官提出“MySQL 给数据表增加一列,一定会锁表吗?”这一问题时,答案并非绝对。这主要取决于MySQL的版本、存储引擎以及具体的操作方式。
295 0
|
5月前
|
关系型数据库 MySQL
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
【mysql技巧】如何在这个mysql语句执行前加个前提,也就是只有表里没有相同数据才进行添加插入操作
37 1
|
3月前
|
SQL 关系型数据库 MySQL
MySQL 恢复误删除数据
MySQL 恢复误删除数据
43 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL之如何针对重复数据做一些工作
MySQL之如何针对重复数据做一些工作
67 1
|
存储 关系型数据库 MySQL
头大了,Mysql写入数据十几秒后被自动删除了
头大了,Mysql写入数据十几秒后被自动删除了
84 0
|
关系型数据库 MySQL 数据库
MySQL数据增加语句
MySQL数据增加语句
81 0
|
SQL 存储 数据可视化
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
310 0
删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
|
数据库 Python
Python编程:MySQLdb模块更新数据库获取影响行数
Python编程:MySQLdb模块更新数据库获取影响行数
210 0