> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000015 | 999120424 | | mysql-bin.000016 | 6722 | +------------------+-----------+ 2 rows in set (0.00 sec)創(chuàng)建表test
create table test (id int not null primary key,name varchar(20),memo varchar(50)) ENGINE=InnoDB auto_increment=100 default charset=utf8;插入幾條數(shù)據(jù)
> insert into test values(1,'name1','memo1'),(2,'name2','memo2'),(3,'name3','memo3'),(4,'name4','memo4'),(5,'name5','memo5'); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0查看一下數(shù)據(jù)的基本情況:
### DELETE FROM `test`.`test` ### WHERE ### @1=1 ### @2='name1' ### @3='memo1' ### DELETE FROM `test`.`test` ### WHERE ### @1=3 ### @2='name3' ### @3='memo3' # at 998969666update操作對應binlog日志中的SQL
### UPDATE `test`.`test` ### WHERE ### @1=2 ### @2='name2' ### @3='memo2' ### SET ### @1=2 ### @2='name2' ### @3='new' ### UPDATE `test`.`test` ### WHERE ### @1=4 ### @2='name4' ### @3='memo4' ### SET ### @1=4 ### @2='name4' ### @3='new' # at 998971422
insert操作對應binlog日志中的SQL
### INSERT INTO `test`.`test` ### SET ### @1=6 ### @2='name6' ### @3='memo6' # at 998973859值得一提的是-v(--verbose)選項會將行事件重構成被注釋掉的偽SQL語句,如果想看到更詳細的信息可以使用-vv選項,這樣可以包含一些數(shù)據(jù)類型和元信息的注釋內(nèi)容。
比如:
-vv的結果:
### DELETE FROM `test`.`test` ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### @2='name1' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */ ### @3='memo1' /* VARSTRING(150) meta=150 nullable=1 is_null=0 */回到數(shù)據(jù)恢復的問題,如果需要手工恢復就需要做幾件事情,一個就是根據(jù)字段標示拼接出可運行的SQL語句,然后按照逆向的順序執(zhí)行即可。
# python setup.py install Traceback (most recent call last): File "setup.py", line 6, in <module> from setuptools import setup, find_packages ImportError: No module named setuptools看來還和一個setuptools的庫有關,我們繼續(xù)安裝。
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY 'admin';比如我們使用如下的命令來解析binlog得到指定時間戳范圍內(nèi)的SQL情況,在此我們限定數(shù)據(jù)為test
#cat /tmp/tmp.log DELETE FROM `test`.`test` WHERE `memo`='memo1' AND `id`=1 AND `name`='name1' LIMIT 1; #start 11127 end 11321 time 2017-02-06 04:15:23 DELETE FROM `test`.`test` WHERE `memo`='memo3' AND `id`=3 AND `name`='name3' LIMIT 1; #start 11127 end 11321 time 2017-02-06 04:15:23 UPDATE `test`.`test` SET `memo`='new', `id`=2, `name`='name2' WHERE `memo`='memo2' AND `id`=2 AND `name`='name2' LIMIT 1; #start 11400 end 11625 time 2017-02-06 04:15:29 UPDATE `test`.`test` SET `memo`='new', `id`=4, `name`='name4' WHERE `memo`='memo4' AND `id`=4 AND `name`='name4' LIMIT 1; #start 11400 end 11625 time 2017-02-06 04:15:29 INSERT INTO `test`.`test`(`memo`, `id`, `name`) VALUES ('memo6', 6, 'name6'); #start 12062 end 12239 time 2017-02-06 04:15:37其實看起來還是很省事了。
#cat /tmp/tmp.log DELETE FROM `test`.`test` WHERE `memo`='memo6' AND `id`=6 AND `name`='name6' LIMIT 1; #start 12062 end 12239 time 2017-02-06 04:15:37 UPDATE `test`.`test` SET `memo`='memo4', `id`=4, `name`='name4' WHERE `memo`='new' AND `id`=4 AND `name`='name4' LIMIT 1; #start 11400 end 11625 time 2017-02-06 04:15:29 UPDATE `test`.`test` SET `memo`='memo2', `id`=2, `name`='name2' WHERE `memo`='new' AND `id`=2 AND `name`='name2' LIMIT 1; #start 11400 end 11625 time 2017-02-06 04:15:29 INSERT INTO `test`.`test`(`memo`, `id`, `name`) VALUES ('memo3', 3, 'name3'); #start 11127 end 11321 time 2017-02-06 04:15:23 INSERT INTO `test`.`test`(`memo`, `id`, `name`) VALUES ('memo1', 1, 'name1'); #start 11127 end 11321 time 2017-02-06 04:15:23運行了如上的語句之后,再次查看數(shù)據(jù),數(shù)據(jù)就恢復了正常。