mysqlbinlog檢視與恢復與修改
mysql的binlog日誌作用是什麼:
用來記錄mysql內部增刪改等對Mysql資料庫有更新的內容記錄。(注意:不會記錄select日誌)
如何開啟binlog功能:
[[email protected] 3306]# grep log-bin my.cnf
log-bin=mysql-bin
檢視binlog日誌:
mysqlbinlog mysql-bin.000005
指定庫(分庫)檢視,例如指定test庫:
mysqlbinlog -d test mysql-bin.000005
匯出為sql語句:
mysqlbinlog -d test mysql-bin.000005 >test.sql
可以對比匯出所有與只匯出test庫的sql檔案,檢視:
vimdiff test.sql all.sql
指定位置恢復:
例如我們要恢復插入大米米這個語句,我們從binlog日誌中找到這段話:
# at 199
#171220 8:59:03 server id 1 end_log_pos 310 CRC32 0x9f7c1c05 Query thread_id=1 exec_time=0 error_code=0
use `chao`/*!*/;
SET TIMESTAMP=1513731543/*!*/;
insert into user values ("大米米")
/*!*/;
# at 310
#171220 8:59:03 server id 1 end_log_pos 341 CRC32 0x8c4a3509 Xid = 9
COMMIT/*!*/;
# at 341
#171220 9:05:16 server id 1 end_log_pos 450 CRC32 0x1c582ca9 Query thread_id=1 exec_time=0 error_code=0
其中at 199代表起始位置,at 310 代表結束位置:
mysqlbinlog mysql-bin.000005 --start-position=199 --stop-position=310 -r pos.sql
less pos.sql 可以發現只匯出了我們指定的insert語句
指定時間恢復:
還是恢復插入大米米這條語句,
可以觀察起始時間是171220 8:59:03,結束時間是171220 9:05:16
mysqlbinlog mysql-bin.000005 --start-datetime='2017-12-20 8:59:03' --stop-datetime='2017-12-20 9:05:16' -r time.sql
less time.sql 檢視可以發現匯出了我們指定的sql語句。
指定時間不夠精確,因為一秒鐘的時間可能有很多條語句執行
注意:如果不給結束時間就是匹配到結尾,反之,不給開始時間就是從最開始匹配
binlog 模式:
mysql> show variables like "%binlog_format";
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
線上修改模式
mysql> SET GLOBAL binlog_format=”ROW”; //行級模式
或者: SET GLOBAL binlog_format=”MIXED”; //綜合模式
然後退出重進:
重新整理生成新開始記錄的binlog日誌:
mysqladmin -uroot -pqb123 -S /data/3306/mysql.sock flush-logs
去資料庫更新一條記錄:
mysql> update test set name=”改變” where name =”ff”;
檢視修改後的binlog
mysqlbinlog –base64-output=decode-rows -v mysql-bin.000012