1. 程式人生 > >Mysql binlog日誌及binlog恢復數據庫操作

Mysql binlog日誌及binlog恢復數據庫操作

llb ase 一次 end 定時 列表 row head code

初識MySQL 日誌binlog
MySQL重要log,二進制日誌文件,記錄所有DDL和DML語句(除select),事件形式記錄,包含語句所執行的消耗時間,事務安全型。
DDL(數據庫定義語言),主要命令有create、alter、drop等。DDL主要定義或改變表table的結構、數據類型。建表時使用。
MDL(數據操縱語言),主要命令有select、update、insert、delete。

mysqlbinlog常見選項:
--start-datetime:從二進制中讀取指定時間戳。
--stop-datetime:從二進制中讀取指定時間戳。
--start-position:從二進制中讀取指定position事件位置。

--stop-position:從二進制中讀取指定position事件位置。

binlog日誌使用場景:
1)MySQL主從復制:MySQL在replication在Master端開啟binlog,master將二進制文件傳遞給slaves來達到master-slave數據一致。
2)數據恢復:通過mysqlbinlog工具恢復數據
binlog日誌包括兩類文件:
1)二進制日誌索引文件(文件後綴名.index)用於記錄所有二進制文件
2)二進制日誌文件(文件後綴名.00000)記錄數據庫所有DDL和DML(select除)語句事件

開啟binlog日誌和基本操作

開啟binlog:
/etc/my.cnf文件
log-bin=mysql-bin

mysql命令操作:

查看日誌開啟
mysql>show variables like ‘log_%‘;

查看所有binlog列表
mysql>show master logs;

查看master狀態,最後一個binlog日誌的編號名稱,及最後一個操作事件pos結束點(position)值。
mysql>show master status;

刷新log日誌,開始產生一新的編號的binlog日誌文件
mysql>flush logs;
註:mysqld服務重啟時,也會執行此命令,刷新binlog日誌。

重置(清空)所有binlog
mysql>reset master;

MySQL binlog日誌內容查看
binlog日誌為二進制文件,cat、vim等工具無法打開,使用自帶的mysqlbinlog命令查看

binlog內容分析:

# at 28226679
#181116 0:20:01 server id 776499703 end_log_pos 28226710 CRC32 0xb12373d2 Xid = 54012151
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/;
# at 28226710
#181116 0:20:35 server id 3095565156 end_log_pos 28226757 CRC32 0x05f2d78a Rotate to mysql-bin.001121 pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

server id :數據庫主機服務號
end_log_pos:數據庫SQL結束時pos節點

binlog日誌查看命令:
mysql> show binlog events in ‘mysql-bin.001120’\G;

binlog 從pos點100開始查,查詢10條
mysql> show binlog events in ‘mysql-bin.001120’ from 100 limit 10\G;

利用binlog日誌恢復數據庫
1)恢復就近的完整備份庫
mysql -uusername -p -v db_test -h 192.168.1.100 < ./db_test .sql

2)通過binlog找到要恢復的--stop-position點 和 --stop-position
binlog:mysql-bin.001118 、mysql-bin.001119 、mysql-bin.001120

mysqlbinlog -v --base64-output=DECODE-ROWS  /data/binlog/mysql-bin.001118 | head -10
mysqlbinlog -v --base64-output=DECODE-ROWS /data/binlog/mysql-bin.001120 | grep -C 30 -i "22:05:01"

3)binlog恢復
/bin/mysqlbinlog --start-position=120 --stop-position=2174941 /data/binlog/mysql-bin.001118 /data/binlog/mysql-bin.001119 /data/binlog/mysql-bin.001120 |/bin/mysql -uusername -p -v db_test -h 192.168.1.100
--start-position是備份後記錄下的pos點, --stop-position是誤操前的pos點,如果批多個binlog文件,那麽start-position是第一個binlog文件的pos點,stop-position是最後一個binlog的pos點

總結:所謂恢復,就是用mysql保存的binlog日誌中指定的區間段的sql語句進行重新執行一次。

Mysql binlog日誌及binlog恢復數據庫操作