《闪回工具科普.docx》由会员分享,可在线阅读,更多相关《闪回工具科普.docx(29页珍藏版)》请在第一文库网上搜索。
1、闪回工具科普MySQL闪回特性最早由阿里巴巴的彭立勋开发,2012年他向MySQL官方提交了一个补丁,并对闪回设计思路做了说明。但是由于一些原因,目前业内安装这个补丁的团队还很少,真正应用到线上的更是少之又少。之后,又有多位人员针对不同MySQL版本的不同语言开发了闪回工具,原理用的都是他的思路。闪回工具按实现方式可以分成三类。第一类是以补丁形式集成到官方工具mysqlbinlog中。以彭立勋提交的补丁为代表。优点如下:-上手成本低。mysqlbinlog原有的选项都能直接使用,只是多加了一个闪回选项。闪回特性未来有可能被官方收录。 支持离线解析。缺点如下: 兼容性差、项目活跃度不高。由于bi
2、nlog格式的变动,如果闪回工具的作者不及时对补丁升级,则闪回工具将无法使用。目前已有多位人员分别针对MySQL 5.5/5.6/5.7开发了补丁,部分项目代码公开,但总体上活跃度都不高。 难以添加新功能,实战效果欠佳。在实战中,经常会遇到现有补丁不能满足需求的情况,比如要添加表过滤功能,很简单的一个需求,代码改动也不大,但是对大部分DBA来说,修改MySQL源码还是很困难的事情。 安装稍显麻烦。需要对MySQL源码打补丁,然后再编译安装。这些缺点,可能就是mysqlbinlog工具中的闪回功能没有流行起来的原因。第二类是独立工具,通过伪装成Slave拉取binlog来进行处理。以binlog
3、2sqi为代表。优点如下: 兼容性好。伪装成Slave拉取binlog这项技术在业界的应用非常广泛,很多开发语言都有这样的活跃项目,MySQL版本的兼容性由这些项目搞定,闪回工具的兼容问题不再突出。 添加新功能的难度小。这类闪回工具更容易被改造成DBA自己喜欢的形式,更适合实战。 安装和使用简单。缺点如下: 必须开启MySQL服务器。第三类是简单脚本。先用mysqlbinlog解析出文本格式的binlog,再根据回滚原理用正则表达式进行匹配并替换。优点如下: 脚本编写方便,往往能快速搞定某个特定问题。 安装和使用简单。 支持离线解析。缺点如下: 通用性不好。可靠性不好。就目前的闪回工具而言,线
4、上环境的闪回,笔者建议使用binlog2sql,离线解析使用mysqlbinlog o一、binlog2sqlbinlog2sql的作用如下: 快速回滚(闪回)数据。 修复主从切换后数据不一致的问题。 binlog生成标准SQL语句带来的衍生功能。已测试环境如下: Python2.6/2.7 MySQL5.6.x, MySQL 5.7.18, MariaDB提示:binlog2sqi代码及相关使用介绍详见:(一)安装和使用要求从MySQLbinlog解析出SQL语句。根据不同的选项,可以得到原始SQL语句、回滚SQL语句、去除主键的INSERT SQL语句等。1 .安装 binlog2sqi(
5、root local host # git clone https : /github. com/danf engcao/binlog2sql. git & cdbinlog2sqiroot local host # pip install -r requirements. txt2 .使用要求 f参数设置:server_id= 1, log_bin=/var/log/MySQL/MySQL-bin.log,max_binlog_size = 1G, binlog format = row, binlog row image = fullo 用户最小权限:SELECT, SUPER, REPL
6、ICATIONCLIENT, REPLICATIONSLAVEo SELECT:需要读取服务器端的information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的SQL语句。 SUPER/REPLICATION CLIENT:需要执行SHOWMASTER STATUS语句,获取服务器端的binlog列表。 REPLICATION SLAVE:通过BINLOG_DUMP协议获取binlog内容。3.基本用法解析出标准SQL语句:(root local host . python binlog2sql .py -hl27.0.0.1 -P3306 -uadmin -p a
7、dmin -dtest-t test3 test4 -start-file=,MySQL-bin.0000021在输出内容中带有SQL语句及其对应的binlogpos,比如INSERTINTOtest.test3(addtime, data, id) VALUES C2016-12-10 13:03:38; English, 4);#start 570 end736o在上述命令的解析结果中,产过误操作的SQL语句文本进行甄孙找到误操作的语句对应的binlog pos范围(例如:示例语句中的#start 570 end 736就表示binlog pos的起始值为570,结束值由736),然后使用
8、该binlog pos范围反向解析binlog,即可生成可用于恢复数据的SQL语句文本。解析出回滚SQL语句:(root 0 local host -* # python binlog2sql .py -flashback -hl27.0.0.1 -P3306 -uadmin-p1 admin1 -dtest -ttest3 start-file= fMySQL-bin.0000021 -start-position=763 -stop-position=1147输出内容与解析出标准SQL语句的输出内容类似,比如INSERTINTOtest.test3(addtime, data, id) V
9、ALUES (2016-12-10 13:03:38; English1, 4);#start 981 end1147,这时对反向的SQL语句进行人工确认,如果无误就可以导入实例中执行了。(二)命令行选项4. MySQL连接配置选项- -h:指定需要连接的数据库IP地址。 -P:指定需要连接的数据库端口。 -U:指定需要连接的数据库中的用户名。 -p:指定-U选项指定的用户的密码。5.解析模式选项 -stop-never:持续同步binlog。可选。不使用此选项,则同步至执行命令时最新的binlog 位置。 -K,no-primary-key:对INSERT语句去除主键。可选。 -B,-fla
10、shback:生成回滚语句,可解析大文件,不受内存限制,每打印1000行加一句SLEEPSELECT(l)。可选。与一stop-never或-no-primary-key选项不能同时使用。6 .解析范围控制选项 -start-file:起始解析文件。必选。 -start-position/start-pos :用于指定-start-file选项指定文件的起始解析位置。可选。如果不指定,则默认将从-start-file选项指定文件的开头进行解析。 -stop-file/-end-file:末尾解析文件。可选。如果不指定,则将复用-startfile选项指定的文件名(即,开始和结束文件名相同,表示
11、只解析一个文件)。若解析模式为-stop-never,则此选项失效。 -stop-position/end-pos: stopflle的末尾解析位置。可选。默认为stop行le的最末位置。若解法模式为-stop-never,则此选项失效。 -start-datetime:从哪个时间点的binlog开始解析,格式必须为datetime,如2016-11-11 IklklTo可选。默认不过滤。 -stop-datetime:到哪个时间点的binlog停止解析,格式必须为datetime,如2016-11-11 IklklTo可选。默认不过滤。7 .对象过滤选项 -d,-databases:只输出目
12、标数据库的SQL语句。可选。默认为空。- -t,-tables:只输出目标表的SQL语句。可选。默认为空。(三)实战演示8.造数#建库、建表mysql CREATE DATABASE % test;use test;mysql CREATE TABLE test (id int(ll) NOT NULL AUTO_INCREMENTzFame、 varchar(20) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (id)ENGINEInnoDB;f插入测试数据mysql insertmysql insertmysql insertmysql insert
13、mysql insertmysql insertmysql insertmysql insertinto test(name)into test(name)into test(name)into test(name)into test(name)into test(name)into test(name)into test(name)values(* testlvalues(test2values(1test3values(* test4values(* test5values(1test6values(test?values(* test89. INSERT 闪回登录到数据库中,查看当前的数
14、据:mysql use testDatabase changedmysql show tables;+I Tables_in_test I+I testI+1 row in set (0.00 sec)mysql select * from test;IidInameII2|testlII4|test2II6|test3II8|test4|I10Itest5II12|test6|I14|test7|I16|test8I8 rows in set (0.00 sec)执行插入数据操作:mysql insert into test (naxne) values (1 test91);Query OK, 1 row affected (0.00 sec)mysql insert into test(name) values(1testlO1);Query OK, 1 row affected (0.00 sec)mysql insert into test(name) values(* testll1);Query OK, 1 row affected (0.00 sec)mysql insert into test(name) values(testl2);Query OK, 1 row affec