binlog2sql的安裝及使用


 

binlog2sql是大眾點評開源的一款用於解析binlog的工具,在測試環境試用了下,還不錯。

 DBA或開發人員,有時會誤刪或者誤更新數據,如果是線上環境並且影響較大,就需要能快速回滾。傳統恢復方法是利用備份重搭實例,再應用去除錯誤sql后的binlog來恢復數據。此法費時費力,甚至需要停機維護,並不適合快速回滾。也有團隊利用LVM快照來縮短恢復時間,但快照的缺點是會影響mysql的性能。現在有不少好用而且效率又高的開源閃回工具如binlog2sql、mysqlbinlog_flashback,這些工具在工作中給DBA減輕了不少痛苦,以下針對binlog2sql的使用進行實踐演練。

binlog2sql的用途:

  • 數據快速回滾(閃回)
  • 主從切換后數據不一致的修復
  • 從binlog生成標准SQL,帶來的衍生功能

安裝binlog2sql前先安裝git和pip:

yum -y install epel-release 
yum -y install git  python-pip

安裝binlog2sql:

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt

 MySQL的配置要開啟以下選項:

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

要授權一個用戶有以下權限:

SELECT, REPLICATION SLAVE, REPLICATION CLIENT

權限說明:

  • select:需要讀取server端information_schema.COLUMNS表,獲取表結構的元信息,拼接成可視化的sql語句
  • super/replication client:兩個權限都可以,需要執行'SHOW MASTER STATUS', 獲取server端的binlog列表
  • replication slave:通過BINLOG_DUMP協議獲取binlog內容的權限

 

內網環境如何使用該工具呢?

該工具的使用依賴以下三個包:

PyMySQL==0.7.8
wheel==0.24.0
mysql-replication==0.9

其中,每個包又會依賴其它包,所以安裝這些包是一個比較麻煩的事情。

如果是在外網的環境下,可直接通過pip install安裝,它會自動下載並安裝依賴包的。

 

在內網環境下,可手動安裝這些包,目前,這些包已下載打包,並上傳到百度雲盤中,大家可自行下載。

http://pan.baidu.com/s/1qYQ2PPy

 

安裝教程:

# tar xvf binlog2sql.tar.gz

# cd binlog2sql/binlog2sql_dependencies/


# tar xvf setuptools-0.6c11.tar.gz

# cd setuptools-0.6c11

# python setup.py install

# cd ..

# tar xvf pip-9.0.1.tar.gz

# cd pip-9.0.1

# python setup.py install

# cd ..

# pip install *.whl mysql-replication-0.9.tar.gz

DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop
 support for Python 2.6Processing ./mysql-replication-0.9.tar.gz
Processing ./argparse-1.4.0-py2.py3-none-any.whl
Processing ./linecache2-1.0.0-py2.py3-none-any.whl
Requirement already satisfied: PyMySQL==0.7.8 from file:///root/binlog2sql/binlog2sql_dependencies/PyMySQL-0.7.8-py2-none-any.whl in 
/usr/lib/python2.6/site-packagesProcessing ./six-1.10.0-py2.py3-none-any.whl
Processing ./traceback2-1.4.0-py2.py3-none-any.whl
Processing ./unittest2-1.1.0-py2.py3-none-any.whl
Processing ./wheel-0.24.0-py2.py3-none-any.whl
Installing collected packages: argparse, linecache2, six, traceback2, unittest2, wheel, mysql-replication
  Running setup.py install for mysql-replication ... done
Successfully installed argparse-1.4.0 linecache2-1.0.0 mysql-replication-0.9 six-1.10.0 traceback2-1.4.0 unittest2-1.1.0 wheel-0.24.0

至此,所有依賴包安裝完畢。

binlog2sql的使用參數說明:

mysql連接配置

-h host; -P port; -u user; -p password

解析模式

--stop-never 持續同步binlog。可選。不加則同步至執行命令時最新的binlog位置。

-K, --no-primary-key 對INSERT語句去除主鍵。可選。

-B, --flashback 生成回滾語句,可解析大文件,不受內存限制,每打印一千行加一句SLEEP SELECT(1)。可選。與stop-never或no-primary-key不能同時添加。

解析范圍控制

--start-file 起始解析文件。必須。

--start-position/--start-pos start-file的起始解析位置。可選。默認為start-file的起始位置。

--stop-file/--end-file 末尾解析文件。可選。默認為start-file同一個文件。若解析模式為stop-never,此選項失效。

--stop-position/--end-pos stop-file的末尾解析位置。可選。默認為stop-file的最末位置;若解析模式為stop-never,此選項失效。

--start-datetime 從哪個時間點的binlog開始解析,格式必須為datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。

--stop-datetime 到哪個時間點的binlog停止解析,格式必須為datetime,如'2016-11-11 11:11:11'。可選。默認不過濾。

對象過濾

-d, --databases 只輸出目標db的sql。可選。默認為空。

-t, --tables 只輸出目標tables的sql。可選。默認為空。

root@localhost:mysql3306.sock [hch]>select * from hch;
+----+-------+
| id | cname |
+----+-------+
|  1 | hch   |
|  2 | tom   |
|  3 | jerry |
+----+-------+
3 rows in set (0.00 sec)

# 刪除表里的數據 root@localhost:mysql3306.sock [hch]
>delete from hch; Query OK, 3 rows affected (0.12 sec) root@localhost:mysql3306.sock [hch]>select * from hch; Empty set (0.00 sec)
# 查看binlog位置
root@localhost:mysql3306.sock [hch]>show master status; +------------------+----------+--------------+------------------+--------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+--------------------------------------------+ | mysql-bin.000010 | 713 | | | 7c91060d-1927-11e8-a036-000c2930f871:1-139 | +------------------+----------+--------------+------------------+--------------------------------------------+ 1 row in set (0.00 sec)

 

下面我們使用binlog2sql進行格式為ROW的binlog生成hch庫hch表的標准SQL

[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 > 1.sql
[root@hch binlog2sql]# cat 1.sql
USE hch;
create table hch(id int not null auto_increment, cname varchar(32), primary key(id));
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 480 end 643 time 2018-03-04 17:59:25
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 739 end 902 time 2018-03-04 17:59:29
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 998 end 1163 time 2018-03-04 17:59:34
DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`=1 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`=2 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`=3 LIMIT 1; #start 1259 end 1442 time 2018-03-04 18:02:57

我們可以看到,剛剛執行過的sql都生成出來了。

我們現在對hch這個庫的所有操作生成反向SQL,這個時候需要在上面語句的基礎上帶一個-B參數,就是flashback閃回的意思:

[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 -B
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 1259 end 1442 time 2018-03-04 18:02:57
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 1259 end 1442 time 2018-03-04 18:02:57
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 1259 end 1442 time 2018-03-04 18:02:57
DELETE FROM `hch`.`hch` WHERE `cname`='jerry' AND `id`=3 LIMIT 1; #start 998 end 1163 time 2018-03-04 17:59:34
DELETE FROM `hch`.`hch` WHERE `cname`='tom' AND `id`=2 LIMIT 1; #start 739 end 902 time 2018-03-04 17:59:29
DELETE FROM `hch`.`hch` WHERE `cname`='hch' AND `id`=1 LIMIT 1; #start 480 end 643 time 2018-03-04 17:59:25

可以看到生成了跟上面標准SQL相反的SQL了,通過這些反向SQL可以進行誤操的數據恢復。

比如我們想恢復delete命令之前的數據。

[root@hch binlog2sql]# python binlog2sql.py -h localhost -u root -p mysql123 -d hch -t hch --start-file mysql-bin.000009 --start-pos=1259 --stop-pos=1442 -B > roll_1.sql 
[root@hch binlog2sql]# cat roll_1.sql
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('jerry', 3); #start 1259 end 1442 time 2018-03-04 18:02:57
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('tom', 2); #start 1259 end 1442 time 2018-03-04 18:02:57
INSERT INTO `hch`.`hch`(`cname`, `id`) VALUES ('hch', 1); #start 1259 end 1442 time 2018-03-04 18:02:57
[root@hch binlog2sql]# mysql -uroot -pmysql123 <roll_1.sql

查看數據已經恢復

root@localhost:mysql3306.sock [hch]>select * from hch;
+----+-------+
| id | cname |
+----+-------+
|  1 | hch   |
|  2 | tom   |
|  3 | jerry |
+----+-------+
3 rows in set (0.00 sec)

 

參考

binlog2sql之MySQL數據閃回實踐 - GoogSQL - 博客園
https://www.cnblogs.com/xuanzhi201111/p/6602489.html

binlog2sql使用總結 - iVictor - 博客園
http://www.cnblogs.com/ivictor/p/6418409.html

送給mysql dba們一顆速效救心丸,閃回之binlog2sql - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412654

原創工具binlog2sql:從MySQL binlog得到你要的SQL - CSDN博客
http://blog.csdn.net/shudaqi2010/article/details/54412895

MySQL誤操作后如何快速恢復數據 - arun_yh - 博客園

http://www.cnblogs.com/itcomputer/articles/6184454.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM