这是我参与新手入门的第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
- MyFlash语法:--databaseNames : 需要闪回的数据库名称,如果有多个数据库,用逗号”,”隔开。
- --tableNames : 要闪回的表名称,如果有多个表,用逗号”,”隔开。
- --start-position :闪回的起始位置,如不指定,从文件开始处回滚。
- --stop-position : 闪回的终止位置,如不指定,回滚到文件结尾。
- --start-datetime : 闪回的开始时间。
- --stop-datetime : 闪回的终止时间。
- --sqlTypes : 指定需要回滚的sql类型,支持INSERT、UPDATE、DELETE,多个类型使用逗号”,”分开。
- --maxSplitSize : 对文件进行固定尺寸的切割,以防止单次应用binlog尺寸较大,对线上造成压力。
- --binlogFileNames : 指定需要回滚的binlog文件,美团文档说目前只支持单个binlog文件,经测试已经支持多个binlog文件同时闪回。
- --outBinlogFileNameBase :指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback。
- logLevel : 仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多。
- include-gtids : 指定需要回滚的gtid,支持gtid的单个和范围两种形式。
- 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、其他常用命令
- binlog 的配置信息:show variables like '%log_bin%';
- binlog 的格式:show variables like 'binlog_format';
- 日志的文件列表:show binary logs;
- 当前日志的写入状态:show master status;
- 清空 binlog 日志:reset master;