送給mysql dba們一顆速效救心丸,閃回之binlog2sql


做了多年oracle dba,對oralce的閃回是一往情深.如今搞起了mysql,找了個不錯的閃回工具,分享給大家吧。


1.下載

https://github.com/danfengcao/binlog2sql

http://rpmfind.net

Search: python-pip

pip 是一個Python包管理工具,主要是用於安裝 PyPI 上的軟件包


2. 安裝

# yum install python-setuptools -y
# rpm -ivh python-pip-7.1.0-1.el6.noarch.rpm   --rpmfind.net 下載上傳安裝
# pip install PyMySQL
# pip install -r requirments.txt
# pwd
/usr/local/binlog2sql-master/binlog2sql-master
# less README.md  --這個必須要看個十遍,八遍的才行


3. 測試用例

(root@localhost) [kk]> create database roidba;
Query OK, 1 row affected (0.00 sec)
 
(root@localhost) [kk]> use roidba
Database changed
(root@localhost) [roidba]> create table roidba ( id int,name varchar(10));
Query OK, 0 rows affected (0.15 sec)
 
(root@localhost) [roidba]> insert into roidba values(1,'mysql');
Query OK, 1 row affected (0.00 sec)
 
(root@localhost) [roidba]> insert into roidba values(2,'oracle');
Query OK, 1 row affected (0.00 sec)
 
(root@localhost) [roidba]> insert into roidba values(3,'mariadb');
Query OK, 1 row affected (0.00 sec)
(root@localhost) [roidba]> delete from roidba;
Query OK, 3 rows affected (0.01 sec)
(root@localhost) [roidba]> select * from roidba;
Empty set (0.00 sec)


4. 創建閃回用戶

(root@localhost) [roidba]> GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO flashback@'%' identified by 'flashback';  
Query OK, 0 rows affected (0.04 sec)
 
(root@localhost) [roidba]> flush privileges;
Query OK, 0 rows affected (0.05 sec)

 

5. 閃回的要求

1)知道大概的時間點2017-01-12 18:00 ~ 2017-01-12 18:00
2)知道binlog信息
(root@localhost) [roidba]> show binary logs;
+------------------+----------------+
| Log_name  | File_size |
+------------------+----------------+
| mysql-bin.000001 |3828 |
| mysql-bin.000002 | 238 |
| mysql-bin.000003 |1231 |
+------------------+---------------+

 

6. 解析

--binlog中解析的sql
[root@mysql-121 binlog2sql-master]# python binlog2sql/binlog2sql.py -h192.168.80.132 -P3306 -uflashback -pflashback -droidba -troidba --start-file='mysql-bin.000003' --start-datetime='2017-01-12 18:00:00' --stop-datetime='2017-01-12 18:30:00'
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (1, 'mysql'); #start 239 end 413 time 2017-01-12 18:10:54
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (2, 'oracle'); #start 492 end 667 time 2017-01-12 18:11:00
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (3, 'mariadb'); #start 746 end 922 time 2017-01-12 18:11:08
DELETE FROM `roidba`.`roidba` WHERE `id`=1 AND `name`='mysql' LIMIT 1; #start 1001 end 1200 time 2017-01-12 18:11:14
DELETE FROM `roidba`.`roidba` WHERE `id`=2 AND `name`='oracle' LIMIT 1; #start 1001 end 1200 time 2017-01-12 18:11:14
DELETE FROM `roidba`.`roidba` WHERE `id`=3 AND `name`='mariadb' LIMIT 1; #start 1001 end 1200 time 2017-01-12 18:11:14
USE roidba;
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flashback'@'%' IDENTIFIED BY PASSWORD '*6DE874C277DDA35061BD526FB38B6A3C8B3A9254';
USE roidba;
flush privileges;

 

7. 閃回

--閃回sql
# python binlog2sql/binlog2sql.py -h192.168.80.132 -P3306 -uflashback -p'flashback' -droidba -troidba --start-file='mysql-bin.000003' --start-position=1001 --stop-position=1200 -B > rollback.sql
[root@mysql-121 binlog2sql-master]# less rollback.sql
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (3, 'mariadb'); #start 1001 end 1200 time 2017-01-12 18:11:14
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (2, 'oracle'); #start 1001 end 1200 time 2017-01-12 18:11:14
INSERT INTO `roidba`.`roidba`(`id`, `name`) VALUES (1, 'mysql'); #start 1001 end 1200 time 2017-01-12 18:11:14
--開始回滾
[root@mysql-121 binlog2sql-master]# mysql -ubackup -pbackup -h192.168.80.132 <./rollback.sql   --具有插入權限纔可以

8.驗證

自己多測試,多動手,看別人做很簡單,其實真的自己上手就不一定了,少說多做,少扯淡。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章