MySQL执行delete误删除数据恢复

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 误删数据先别跑路

有时候我们可能因为手抖或者粗心,执行了一条delete语句,导致正常的业务数据被删除了。
别慌,也先别跑路。
有很多种方式可以恢复回来,这一篇文章就来聊聊使用my2sql工具解析出delete语句的回滚操作(也就是insert),来恢复delete误删除的数据。
my2sql工具Github地址:https://github.com/liuhr/my2sql
不过要想使用my2sql恢复数据,需要注意这些:

  • binlog格式必须为row,且binlog_row_image=full(表示记录的二进制日志将包含所有列的值,包括旧值和新值)
  • 只能回滚DML, 不能回滚DDL
  • 8.0 用户密码认证必须是mysql_native_password才能解析

我们通过一个实验,来模拟误操作,并进行恢复。
1 新建测试表和测试用户
创建测试表并写入数据

create database d_recover;
use d_recover;

CREATE TABLE del_t1 (
id int NOT NULL AUTO_INCREMENT,
a int NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8mb4;

insert into del_t1 values (1,1),(2,2);

创建恢复用户

CREATE USER `u_rollback`@`127.0.0.1` IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'IgdI8G_aUU';
GRANT SELECT, REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO `u_rollback`@`127.0.0.1`;

2 安装Binlog解析工具my2sql
下载my2sql

mkdir /data/backup/rollback -p
cd /data/backup/rollback
wget https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql

3 模拟误操作

delete from d_recover.del_t1;

4 把误操作事务所在的Binlog复制到新目录

mkdir /data/backup/rollback
cp /data/mysql/binlog/mysql-bin.000012 /data/backup/rollback

5 查看误操作事务开始和结束的位点
解析误操作期间的Binlog,预估误操作大概的起止时间,范围可以稍微大一点。

cd /data/backup/rollback
mysqlbinlog mysql-bin.000012 --start-datetime='2023-06-21 01:20:00'  --stop-datetime='2023-06-21 01:40:00'  --base64-output=decode-rows -v  > operation.sql

找到误操作的Binlog,并确定开始和结束的位点

图片

比如上面解析出的Binlog,误操作开始的位点可以认为是3556,结束的位点是3719

6 生成回滚SQL

/data/backup/rollback
./my2sql -user u_rollback -password 'IgdI8G_aUU' -host 127.0.0.1 -databases d_recover -tables del_t1 -work-type rollback -start-file mysql-bin.000012 -start-pos 3556 -stop-pos 3719 -output-dir recover_01

查看并确认回滚SQL

cat recover_01/rollback.12.sql

图片

7 导入回滚的SQL
如果确定回滚的SQL没问题,把回滚SQL导入到误操作的库里

mysql -uroot -p <recover_01/rollback.12.sql

再进行数据确认

select *  from d_recover.del_t1;

如果一切顺利,那误删除的数据(1,1),(2,2)就已经恢复回来了。

当然,数据恢复还有其他的一些方式,比如:全备+Binlog、延迟从库(主库有误操作,从库同步到误操作前一个事务)、新建从库同步到误操作前一个事务等等,后面会找时间分享这些恢复方式。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL DELETE 语句
MySQL DELETE 语句
|
2月前
|
SQL 弹性计算 关系型数据库
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
云服务器数据恢复环境: 华为ECS云服务器,linux操作系统,mysql数据库(innodb引擎)。作为网站服务器使用。 云服务器故障: 在执行mysql数据库版本更新测试时,误将本应该在测试库上执行的sql脚本执行在生产库上了,生产库上的部分表被truncate,部分表内有少量数据被delete。 需要恢复被truncate的表以及被少量数据被delete的表。
服务器数据恢复-华为ECS云服务器mysql数据库数据恢复案例
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
74 0
|
2天前
|
SQL 存储 关系型数据库
|
2天前
|
存储 关系型数据库 MySQL
|
7天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之 MySQL数据库中,执行delete命令删除数据后,存储空间通常不会立即释放,该如何优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
15天前
|
关系型数据库 MySQL 数据库
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
217 1
|
6天前
|
关系型数据库 MySQL 数据库
DELETE、TRUNCATE 和 DROP 在MySQL中的区别及使用示例
DELETE、TRUNCATE 和 DROP 在MySQL中的区别及使用示例
22 0
|
7天前
|
SQL 关系型数据库 MySQL
大量delete mysql的数据时,为什么导致OOM
大量delete mysql的数据时,为什么导致OOM
|
27天前
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
27 0

相关产品

  • 云数据库 RDS MySQL 版