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

mysql误删除数据后如何恢复

原创 小哥 2020-12-13
1681

mysql误删除数据后如何恢复

Mysql 误删除是我最头痛的一件事,网络也有很多惨痛的教训,为了减少企业损失,应迅速恢复业务数据,后续在人员操作行为上建立完善的制度及流程,将风险扼杀在摇篮才是上上策。

一,MyFlash简介

MyFlash的前身是binlong2,后续是由美团点评公司技术工程部开发维护的一个回滚DML操作的工具。该工具通过解析V4版本的二进制日志,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。 该工具已经在美团点评内部使用

二,MyFlash使用限制

二进制日志格式必须为【row】行级模式 ,且binlog_row_image =full
仅支持5.6与5.7 (如果是低版本的mysql 二种方案 1,升级mysql 2,使用binlog2)
[binlog2sql工具的下载地址:]
只能回滚DML(增,删,改)

三,详细说明

3.1 安装部署

git clone https://github.com/Meituan-Dianping/MyFlash.git
cd MyFlash/
[root@gitlab MyFlash]# yum install glib2*
[root@gitlab MyFlash]# gcc -w pkg-config --cflags --libs glib-2.0 source/binlogParseGlib.c -o binary/flashback
#动态编译

3.2 开启mysql-binlog

[root@gitlab mysql]# cat /etc/my.cnf|grep “log_bin*”

log_bin

log-bin=mysql-bin #名字前缀
log_bin_basename=/usr/local/mysql/data/mysql-bin #路径
log_bin_index=/usr/local/mysql/data/mysql-bin.index #索引
binlog_format=row #binlog模式 (行、混合、sql语句)
max_binlog_size = 512M #单个文件大小
expire_logs_days = 30 #保留最近30天
server-id = 1 #ID编号

[root@gitlab mysql]# /etc/init.d/mysqld restart
Restarting mysqld (via systemctl): [ OK ]
登陆mysql 查看binlog开启情况
mysql> show variables like ‘%log_bin%’

注意:此工具必须使用"row 行级模式"

show variables like ‘binlog%’;
##行级模式缺点,binlog日志会增大 原来的3倍 优点:相对安全

3.3 使用方法

cd binary
./flashback --help

Usage:
flashback [OPTION…]

Help Options:
-?, --help Show help options

Application Options:
–databaseNames 指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。
–tableNames 指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
–start-position 指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚

–stop-position 指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚
–start-datetime 指定回滚的开始时间。注意格式必须是 “2016-11-17 14:40:00。 如不指定,则不限定时间
–stop-datetime 指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
–sqlTypes 指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
–maxSplitSize 一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力
–binlogFileNames 指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持
–outBinlogFileNameBase 指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback
–logLevel 仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多
–include-gtids 指定需要回滚的gtid,支持gtid的单个和范围两种形式。
–exclude-gtids 指定不需要回滚的gtid,用法同include-gtids(跳过)

### 3.4 测试用例

1) 测试环境介绍:
[root@gitlab binary]# cat /etc/redhat-release #系统版本7.4
CentOS Linux release 7.4.1708 (Core)
[root@gitlab binary]# uname -a #系统内核3.10 64位
Linux gitlab.example.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@gitlab binary]# mysql -V #mysql 版本
mysql Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using EditLine wrapper
2)模拟数据
我这里把测试库的一些数据拿啦,直接导入sql作为案例使用
SELECT * FROM sys_member_msg WHERE id <=666

3) 模拟误删除

delete from sys_member_msg where id<=666 #在查看id小于666的就显示空了

4)回滚指定文件中的所有【插入、删除、修改】语句

row行级模式 查看binlong,需要添加参数(–base64-output=decode-rows -v)对输出结果解码。

4.1 查看开启binlong

mysql> show variables like ‘log_%’;
±---------------------------------------±-------------------------------+
| Variable_name | Value |
±---------------------------------------±-------------------------------+
| log_bin | ON |
| log_bin_basename | /var/local/mysql/data/mysql_bin |
| log_bin_index | /var/local/mysql/data/mysql-bin.index |

13 rows in set (0.00 sec)

4.2 查看最新binlog位置

mysql> show master status; #查看最新binlog位置
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000004 | 1014 | | | |
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

4.3 生成回滚数据文件

[root@gitlab binary]# time ./flashback --sqlTypes=‘DELETE’ --binlogFileNames=/usr/local/mysql/data/mysql-bin.000004
real 0m0.053s
user 0m0.015s
sys 0m0.035s
#参数意思 看上面用法介绍
#比如:开始时间 -结束时间 --DML语句类型(增删改)、post点、大数据要拆分
#默认产生一个binlog_output_base.flashback文件

4.4 恢复到数据库

[root@gitlab binary]# /usr/local/mysql/bin/mysqlbinlog binlog_output_base.flashback | mysql -uroot -p
Enter password: #输入mysql密码
#没有反馈,应该OK了
3.5查看数据回滚情况
SELECT * FROM sys_member_msg WHERE id <=666

## 四 总结:

1,myflash 只支持 row 模式,如果你现在的binlog是其它模式,切换的时候,会影响主从同步
2,row模式很安全,但是binlog数据量会增加 3-5倍
3,查看row模式下的binlog 需要添加参数(–base64-output=decode-rows -v)对输出结果解码
4,必要给开发生产数据库开放权限,让他们select去吧
5,筛选恢复数据有很多比如:开始时间 -结束时间 --DML语句类型(增删改)、post点、大数据要拆分后逐去恢复 等等
Mysql 误删除数据-快速回滚

[root@gitlab binary]# cat /etc/redhat-release #系统版本7.4
CentOS Linux release 7.4.1708 (Core)
[root@gitlab binary]# uname -a #系统内核3.10 64位
Linux gitlab.example.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@gitlab binary]# mysql -V #mysql 版本
mysql Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using EditLine wrapper

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论