Mysql利用MyFlash工具进行数据恢复

712 阅读4分钟

这是我参与新手入门的第1篇文章

前言

额,最近公司来了不少测试小伙伴,有时大家在测试环境上直接修改数据库,到时候发生了些问题,之前用Oracle时可以用其自带的闪回进行数据恢复,现在公司用的是MySQL,主要是利用第三方工具操作binglog日志进行处理。

1、MySQL闪回原理

首先,在mysql中存在如下几种日志:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。其中MySQL的闪回技术主要是利用binlog日志进行数据恢复的。

2、关于binlog日志的介绍

binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息。binlog包含了一些事件,这些事件描述了数据库的改动,如建表、数据改动等,也包括一些潜在改动,比如 DELETE FROM ran WHERE bing = luan,然而一条数据都没被删掉的这种情况。除非使用 Row-based logging,否则会包含所有改动数据的 SQL Statement。显然,我们执行SELECT等不设计数据变更的语句是不会记录Binlog的,而涉及到数据更新则会记录。要注意的是,对支持事务的引擎如InnoDB而言,必须要提交了事务才会记录Binlog。Binlog是在事务最终commit前写入的,binlog什么时候刷新到磁盘跟参数sync_binlog相关。如果设置为0,则表示MySQL不控制binlog的刷新,由文件系统去控制它缓存的刷新,而如果设置为不为0的值则表示每sync_binlog次事务,MySQL调用文件系统的刷新操作刷新binlog到磁盘中。设为1是最安全的,在系统故障时最多丢失一个事务的更新,但是会对性能有所影响,一般情况下会设置为100或者0,牺牲一定的一致性来获取更好的性能。 默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。

3、开启binlog

配置/etc/my.cnf,在[mysqld]下增加如下配置

[mysqld]
server_id=1918    #针对mysql5.7以上需要增加该参数
log_bin = mysql-bin
binlog_format = ROW

保存后重启MySQL服务即可。登陆MySQL后可以使用show variables like '%log_bin%'查看是否启用binlog日志。

4、Mysql闪回工具

MyFlash是美团开发的一个回滚DML操作的工具,该工具是开源的,github地址为: github.com/Meituan-Dia…, 通过该工具,可以实现MySQL数据库的闪回。

4.1下载源码:

git clone https://github.com/Meituan-Dianping/MyFlash.git

4.2 安装依赖包:

yum install -y gcc pkg-config glib2 libgnomeui-devel

4.3 进入MyFlash,编译:

gcc -w  `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c  -o binary/flashback
  1. MyFlash语法:--databaseNames : 需要闪回的数据库名称,如果有多个数据库,用逗号”,”隔开。
  2. --tableNames : 要闪回的表名称,如果有多个表,用逗号”,”隔开。
  3. --start-position :闪回的起始位置,如不指定,从文件开始处回滚。
  4. --stop-position : 闪回的终止位置,如不指定,回滚到文件结尾。
  5. --start-datetime : 闪回的开始时间。
  6. --stop-datetime : 闪回的终止时间。
  7. --sqlTypes : 指定需要回滚的sql类型,支持INSERT、UPDATE、DELETE,多个类型使用逗号”,”分开。
  8. --maxSplitSize : 对文件进行固定尺寸的切割,以防止单次应用binlog尺寸较大,对线上造成压力。
  9. --binlogFileNames : 指定需要回滚的binlog文件,美团文档说目前只支持单个binlog文件,经测试已经支持多个binlog文件同时闪回。
  10. --outBinlogFileNameBase :指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback。
  11. logLevel : 仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多。
  12. include-gtids : 指定需要回滚的gtid,支持gtid的单个和范围两种形式。
  13. exclude-gtids : 指定不需要回滚的gtid,用法同include-gtids。

./flashback --databaseNames=数据库名称 --tableNames=表名称 --sqlTypes='DELETE' --binlogFileNames=/mysql/binlog/master-bin.000001

4.4 应用闪回的日志:

mysqlbinlog binlog_output_base.flashback | mysql -uroot -p123456

5、其他常用命令

  1. binlog 的配置信息:show variables like '%log_bin%';
  2. binlog 的格式:show variables like 'binlog_format';
  3. 日志的文件列表:show binary logs;
  4. 当前日志的写入状态:show master status;
  5. 清空 binlog 日志:reset master;