1. 背景python
* 爲了數據安全,搭建了主從。實時主從備份只能防止硬件問題,好比主庫的硬盤損壞。但對於誤操做,則無能爲力。好比在主庫誤刪一張表,或者一個update語句沒有指定where條件,致使全表被更新。當操做被同步到從庫上後,則主從都「迴天無力」。
mysql
* 閃回用於快速恢復因爲誤操做丟失的數據。在DBA誤操做時,能夠把數據庫恢復到之前某個時間點(或者說某個binlog的某個pos)。好比忘了帶where條件的update、delete操做,傳統的恢復方式是利用全備+二進制日誌前滾進行恢復,相比於傳統的全備+增備,flashback顯然更爲快速、簡單。git
2. 測試環境github
mysql> show variables like 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.6.36-log | +---------------+------------+ 1 row in set (0.03 sec) mysql> show variables like 'datadir'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | datadir | /data/mysql_data6/ | +---------------+--------------------+ 1 row in set (0.00 sec) mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec) mysql> show variables like 'binlog_row_p_w_picpath'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | binlog_row_p_w_picpath | FULL | +------------------+-------+ 1 row in set (0.00 sec)
3. 閃回實戰sql
* 建立數據庫與測試表,並插入數據數據庫
mysql> create table users( -> id BIGINT NOT NULL AUTO_INCREMENT, -> name VARCHAR(255) NOT NULL, -> sex ENUM('M', 'F') NOT NULL DEFAULT 'M', -> age INT UNSIGNED NOT NULL DEFAULT '0', -> PRIMARY KEY (id) -> )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; Query OK, 0 rows affected (0.04 sec) mysql> insert into users values(null, 'tom', 'M', 25), (null, 'jak', 'F', 32), (null, 'ses', 'M', 45), (null, 'lisea', 'M', 35); Query OK, 4 rows affected (0.13 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from users; +----+-------+-----+-----+ | id | name | sex | age | +----+-------+-----+-----+ | 1 | tom | M | 25 | | 2 | jak | F | 32 | | 3 | ses | M | 45 | | 4 | lisea | M | 35 | +----+-------+-----+-----+ 4 rows in set (0.00 sec)
* 下載閃回工具binlog2sql[ 由上海美團DBA團隊出品 ]安全
[root@MySQL ~]# git clone https://github.com/danfengcao/binlog2sql.git Initialized empty Git repository in /root/binlog2sql/.git/ remote: Counting objects: 244, done. remote: Total 244 (delta 0), reused 0 (delta 0), pack-reused 244 Receiving objects: 100% (244/244), 121.72 KiB | 27 KiB/s, done. Resolving deltas: 100% (124/124), done.
* 安裝相關依賴bash
[root@MySQL ~]# yum install pip -y [root@MySQL ~]# pip install --upgrade pip [root@MySQL ~]# pip install -r binlog2sql/requirements.txt
* 提早刷新binlog [ 測試中好區分文件 ]app
mysql> flush logs; Query OK, 0 rows affected (0.02 sec)
* 查看當前binlog信息ide
mysql> show master status; +------------+----------+--------------+------------------+-------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------+----------+--------------+------------------+-------------------------------------------+ | bin.000006 | 191 | | | c7f82640-6b2d-11e7-9316-000c29f0b169:1-22 | +------------+----------+--------------+------------------+-------------------------------------------+ 1 row in set (0.01 sec)
* 誤操做,delete沒帶where條件
mysql> delete from users; Query OK, 4 rows affected (0.01 sec)
* binlog2sql工具經過文件輸出操做信息,定位SQL開始位置與結束位置
可經過--start-datetime與--stop-datetime定位時間
由此獲得開始position爲239,結束position爲483
[root@MySQL ~]# python binlog2sql/binlog2sql/binlog2sql.py -hlocalhost -P3306 -uroot -p'123' -dmytest -tusers --start-file='bin.000006' DELETE FROM `mytest`.`users` WHERE `age`=25 AND `sex`='M' AND `id`=1 AND `name`='tom' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49 DELETE FROM `mytest`.`users` WHERE `age`=32 AND `sex`='F' AND `id`=2 AND `name`='jak' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49 DELETE FROM `mytest`.`users` WHERE `age`=45 AND `sex`='M' AND `id`=3 AND `name`='ses' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49 DELETE FROM `mytest`.`users` WHERE `age`=35 AND `sex`='M' AND `id`=4 AND `name`='lisea' LIMIT 1; #start 239 end 483 time 2017-07-19 01:02:49
* binlog2sql經過flashback生成回滾SQL
[root@MySQL ~]# python binlog2sql/binlog2sql/binlog2sql.py -hlocalhost -P3306 -uroot -p'123' -dmytest -tusers --start-file='bin.000006' --start-position=239 --stop-position=483 -B > rollback.sql
* 導入回滾SQL [ 導入前檢查SQL語句是否正常 ]
[root@MySQL ~]# mysql -hlocalhost -uroot -p'123' < rollback.sql
* 查看
mysql> select * from mytest.users; +----+-------+-----+-----+ | id | name | sex | age | +----+-------+-----+-----+ | 1 | tom | M | 25 | | 2 | jak | F | 32 | | 3 | ses | M | 45 | | 4 | lisea | M | 35 | +----+-------+-----+-----+ 4 rows in set (0.00 sec)
4. 總結
以需求驅動技術,技術自己沒有優略之分,只有業務之分。