溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql閃回工具binlog2sql的安裝使用過程是怎樣的

發(fā)布時間:2021-09-28 11:51:03 來源:億速云 閱讀:138 作者:柒染 欄目:MySQL數(shù)據(jù)庫

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)mysql閃回工具binlog2sql的安裝使用過程是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

軟件包下載地址:鏈接:https://pan.baidu.com/s/15dDeGufVWOgVrfATGWBzaA 密碼:gnz8

DBA或開發(fā)人員,有時會誤刪或者誤更新數(shù)據(jù),如果是線上環(huán)境會影響較大,這就需要能快速回滾;而MySQL閃回(flashback)利用binlog能直接進行回滾,并且能快速恢復(fù)數(shù)據(jù)(MySQL閃回現(xiàn)在只支持DML語句進行閃回)。

利用binlog閃回需要的條件:

Mysql參數(shù)設(shè)置:

log_bin = /目錄/mysql-bin.log(開啟)

binlog_format = row

binlog_row_image = full(默認是full)

工作原理主要是對于delete操作,從binlog取出delete信息,生成insert的回滾語句。對于insert操作,回滾SQL是delete。對于update操作,回滾sql應(yīng)該交換SET和WHERE的值。

安裝:

環(huán)境準備安裝各種依賴的工具包列表

將python換成python3.6版本 (python版本升級參考博客:https://blog.csdn.net/wwwdaan5com/article/details/78218277)

python-pip ,

PyMySQL ,

python-mysql-replication,

wheel argparse

1、binlog2sql下載

https://github.com/danfengcao/binlog2sql

2、binlog2sql依賴包安裝

(1)PyMySQL-0.8.0安裝

https://pypi.python.org/pypi/PyMySQL/

[root@node1 binlogsql]# tar -xzvf PyMySQL-0.8.0.tar.gz 

[root@node1 binlogsql]# cd PyMySQL-0.8.0

[root@node1 PyMySQL-0.8.0]# python setup.py install

(2)wheel-0.31.0安裝

https://pypi.python.org/pypi/wheel/

[root@node1 binlogsql]# tar -xzvf wheel-0.31.0.tar.gz 

[root@node1 binlogsql]# cd wheel-0.31.0

[root@node1 wheel-0.31.0]# python setup.py install

(3)python-mysql-replication安裝

https://github.com/noplay/python-mysql-replication

[root@node1 binlogsql]# unzip python-mysql-replication-master.zip 

[root@node1 binlogsql]# cd python-mysql-replication-master

[root@node1 python-mysql-replication-master]# python setup.py  install

(4)可以通過pip安裝相應(yīng)的依賴包

https://pypi.python.org/pypi/pip

[root@node1 tools]# tar -xzvf pip-10.0.1.tar.gz 

[root@node1 tools]# cd pip-10.0.1

[root@node1 pip-10.0.1]# python setup.py install

[root@node1 binlog2sql-master]# pip install  -r requirements.txt 

可能會出錯誤。

FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.6/site-packages/mysql_replication-0.18-py3.6.egg'

依賴包版本問題。

執(zhí)行。。pip install mysql-replication

再執(zhí)行 pip install  -r requirements.txt

mysql閃回工具binlog2sql的安裝使用過程是怎樣的

顯示都已安裝完成。

實戰(zhàn)演練:

1.查看測試數(shù)據(jù):

MariaDB [test]> select * from t;

+----+--------------+

| id | name         |

+----+--------------+

|  1 | ga           |

| 31 | ga           |

| 38 | ga           |

| 45 | ga           |

| 52 | hg           |

| 59 | hh           |

| 61 | 規(guī)劃如果     |

| 68 | 干點啥       |

| 73 | ww           |

| 80 | ww           |

| 87 | gg           |

| 94 | gg           |

+----+--------------+

12 rows in set (0.00 sec)

2.刪除部分數(shù)據(jù):

MariaDB [test]> delete from t where id > 50;

Query OK, 8 rows affected (0.18 sec)

MariaDB [test]> select * from t;

+----+------+

| id | name |

+----+------+

|  1 | ga   |

| 31 | ga   |

| 38 | ga   |

| 45 | ga   |

+----+------+

4 rows in set (0.00 sec)

刪了8條記錄。

3.查看master的日志位置。

MariaDB [test]> show master status;

+------------------+-----------+--------------+------------------+

| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+-----------+--------------+------------------+

| mysql-bin.000029 | 468829331 |              |                  |

+------------------+-----------+--------------+------------------+

1 row in set (0.01 sec)

4.根據(jù)誤操作的大概時間找出相應(yīng)的誤操作語句

[root@localhost binlog2sql]# python binlog2sql.py -h272.168.1.201 -P3306 -uroot -p123456 -dtest -tt --start-file='mysql-bin.000029' --start-datetime='2018-05-10 11:00:00' --stop-datetime='2018-05-10 11:10:00' > a.sql

[root@localhost binlog2sql]# cat a.sql

DELETE FROM `test`.`t` WHERE `id`=52 AND `name`='hg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=59 AND `name`='hh' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=61 AND `name`='規(guī)劃如果' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=68 AND `name`='干點啥' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=73 AND `name`='ww' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=80 AND `name`='ww' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=87 AND `name`='gg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

DELETE FROM `test`.`t` WHERE `id`=94 AND `name`='gg' LIMIT 1; #start 468829113 end 468829304 time 2018-05-10 11:06:52

從a.sql中可以查到這個事物在binlog中的start和end(binlog2sql對于同一個事務(wù)會輸出同樣的start position)

5.根據(jù)上一步中的位置點生成相應(yīng)的insert恢復(fù)語句

使用 -B 選項生成回滾sql,檢查回滾sql是否正確。(注:真實場景下,生成的回滾SQL經(jīng)常會需要進一步篩選,查看里面是否有別的表的dml語句以及本表的非delete操作的語句,結(jié)合grep、編輯器等)

[root@localhost binlog2sql]# python binlog2sql.py -h272.168.1.201 -P3306 -uroot -p123456 -dtest -tt --start-file='mysql-bin.000029' --start-position=468829113 --stop-position=468829304 -B > b.sql

[root@localhost binlog2sql]# cat b.sql

INSERT INTO `test`.`t`(`id`, `name`) VALUES (94, 'gg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (87, 'gg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (80, 'ww'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (73, 'ww'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (68, '干點啥'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (61, '規(guī)劃如果'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (59, 'hh'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

INSERT INTO `test`.`t`(`id`, `name`) VALUES (52, 'hg'); #start 468829113 end 468829304 time 2018-05-10 11:06:52

和刪除語句進行對比  剛好8條。

6、與開發(fā)確認回滾sql沒問題后,執(zhí)行回滾語句并確認回滾成功。

MariaDB [test]> source /home/binlog2sql-master/binlog2sql/b.sql

Query OK, 1 row affected (0.06 sec)

Query OK, 1 row affected (0.06 sec)

Query OK, 1 row affected (0.09 sec)

Query OK, 1 row affected (0.05 sec)

Query OK, 1 row affected (0.05 sec)

Query OK, 1 row affected (0.05 sec)

Query OK, 1 row affected (0.05 sec)

Query OK, 1 row affected (0.05 sec)

MariaDB [test]> select * from t;

+----+--------------+

| id | name         |

+----+--------------+

|  1 | ga           |

| 31 | ga           |

| 38 | ga           |

| 45 | ga           |

| 52 | hg           |

| 59 | hh           |

| 61 | 規(guī)劃如果     |

| 68 | 干點啥       |

| 73 | ww           |

| 80 | ww           |

| 87 | gg           |

| 94 | gg           |

+----+--------------+

12 rows in set (0.00 sec)

7。

(1)閃回的關(guān)鍵是快速篩選出真正需要回滾的SQL。

(2)先根據(jù)庫、表、時間做一次過濾,再根據(jù)位置做更準確的過濾。

(3)由于數(shù)據(jù)一直在寫入,要確?;貪Lsql中不包含其他數(shù)據(jù)。可根據(jù)是否是同一事務(wù)、誤操作行數(shù)、字段值的特征等等來幫助判斷。

(4)執(zhí)行回滾sql時如有報錯,需要查實具體原因,一般是因為對應(yīng)的數(shù)據(jù)已發(fā)生變化。由于是嚴格的行模式,只要有唯一鍵(包括主鍵)存在,就只會報某條數(shù)據(jù)不存在的錯,不必擔心會更新不該操作的數(shù)據(jù)。

(5)如果待回滾的表與其他表有關(guān)聯(lián),要與開發(fā)說明回滾和不回滾各自的副作用,再確定方案。

(6)最重要的兩點:篩選出正確SQL!與開發(fā)溝通清楚!

上述就是小編為大家分享的mysql閃回工具binlog2sql的安裝使用過程是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI