mysql 誤刪除mysql
本次使用的原美團開源Mysql 數據閃回工具git
傳送門:https://github.com/Meituan-Dianping/MyFlashgithub
MyFlash的前身是binlong2,後續是由美團點評公司技術工程部開發維護的一個回滾DML操做的工具。該工具經過解析V4版本的二進制日誌,完成回滾操做。相對已有的回滾工具,其增長了更多的過濾選項,讓回滾更加容易。 該工具已經在美團點評內部使用sql
git clone https://github.com/Meituan-Dianping/MyFlash.git cd MyFlash/ [root@gitlab MyFlash]# yum install glib2* [root@gitlab MyFlash]# gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback #動態編譯
[root@gitlab mysql]# cat /etc/my.cnf|grep "log_bin*" # log_bin log-bin=mysql-bin #名字前綴 log_bin=/var/lib/mysql/mysql-bin #路徑 log_bin_index=/var/lib/mysql/mysql-bin.index #索引 binlog_format=row #binlog模式 (行、混合、sql語句) max_binlog_size = 512M #單個文件大小 expire_logs_day = 30 #保留最近30天 server-id = 1 #ID編號 [root@gitlab mysql]# /etc/init.d/mysqld restart Restarting mysqld (via systemctl): [ OK ] 登錄mysql 查看binlog開啓狀況 mysql> show variables like '%log_bin%'
注意:此工具必須使用row 行級模式數據庫
show variables like 'binlog%'; ##行級模式缺點,binlog日誌會增大 原來的3倍 優勢:相對安全
cd binary ./flashback --help Usage: flashback [OPTION...] Help Options: -?, --help Show help options Application Options: --databaseNames 指定須要回滾的數據庫名。多個數據庫能夠用「,」隔開。若是不指定該參數,至關於指定了全部數據庫。 --tableNames 指定須要回滾的表名。多個表能夠用「,」隔開。若是不指定該參數,至關於指定了全部表。 --start-position 指定回滾開始的位置。如不指定,從文件的開始處回滾。請指定正確的有效的位置,不然沒法回滾 --stop-position 指定回滾結束的位置。如不指定,回滾到文件結尾。請指定正確的有效的位置,不然沒法回滾 --start-datetime 指定回滾的開始時間。注意格式必須是 「2016-11-17 14:40:00。 如不指定,則不限定時間 --stop-datetime 指定回滾的結束時間。注意格式必須是 %Y-%m-%d %H:%M:%S。 如不指定,則不限定時間 --sqlTypes 指定須要回滾的sql類型。目前支持的過濾類型是INSERT, UPDATE ,DELETE。多個類型能夠用「,」隔開。 --maxSplitSize 一旦指定該參數,對文件進行固定尺寸的分割(單位爲M),過濾條件有效,但不進行回滾操做。該參數主要用來將大的binlog文件切割,防止單次應用的binlog尺寸過大,對線上形成壓力 --binlogFileNames 指定須要回滾的binlog文件,目前只支持單個文件,後續會增長多個文件支持 --outBinlogFileNameBase 指定輸出的binlog文件前綴,如不指定,則默認爲binlog_output_base.flashback --logLevel 僅供開發者使用,默認級別爲error級別。在生產環境中不要修改這個級別,不然輸出過多 --include-gtids 指定須要回滾的gtid,支持gtid的單個和範圍兩種形式。 --exclude-gtids 指定不須要回滾的gtid,用法同include-gtids(跳過)
1) 測試環境介紹:安全
[root@gitlab binary]# cat /etc/redhat-release #系統版本7.4 CentOS Linux release 7.4.1708 (Core) [root@gitlab binary]# uname -a #系統內核3.10 64位 Linux gitlab.example.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [root@gitlab binary]# mysql -V #mysql 版本 mysql Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using EditLine wrapper
2)模擬數據
我這裏把測試庫的一些數據拿啦,直接導入sql做爲案例使用app
SELECT * FROM `sys_member_msg` WHERE id <=666
3) 模擬誤刪除運維
delete from `sys_member_msg` where id<=666 #在查看id小於666的就顯示空了
4)回滾指定文件中的全部【插入、刪除、修改】語句
row行級模式 查看binlong,須要添加參數(--base64-output=decode-rows -v)對輸出結果解碼。ide
4.1 查看開啓binlong工具
mysql> show variables like 'log_%'; +----------------------------------------+--------------------------------+ | Variable_name | Value | +----------------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql_bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | 13 rows in set (0.00 sec)
4.2 查看最新binlog位置
mysql> show master status; #查看最新binlog位置 +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql_bin.000007 | 16696881 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
4.3 生成回滾數據文件
[root@gitlab binary]# time ./flashback --sqlTypes='DELETE' --binlogFileNames=/var/lib/mysql/mysql_bin.000007 real 0m0.053s user 0m0.015s sys 0m0.035s #參數意思 看上面用法介紹 #好比:開始時間 -結束時間 --DML語句類型(增刪改)、post點、大數據要拆分 #默認產生一個binlog_output_base.flashback文件
4.4 恢復到數據庫
[root@gitlab binary]# mysqlbinlog binlog_output_base.flashback |mysql -uroot -p Enter password: #輸入mysql密碼 #沒有反饋,應該OK了
SELECT * FROM `sys_member_msg` WHERE id <=666
1,myflash 只支持 row 模式,若是你如今的binlog是其它模式,切換的時候,會影響主從同步
2,row模式很安全,可是binlog數據量會增長 3-5倍
3,查看row模式下的binlog 須要添加參數(--base64-output=decode-rows -v)對輸出結果解碼
4,必要給開發生產數據庫開放權限,讓他們select去吧
5,篩選恢復數據有不少好比:開始時間 -結束時間 --DML語句類型(增刪改)、post點、大數據要拆分後逐去恢復 等等