1. 程式人生 > >mysql二進位制日誌詳解

mysql二進位制日誌詳解

一、什麼是二進位制日誌

二進位制日誌主要記錄mysql資料庫的變化,二進位制日誌包含所有更新了資料或者潛在更新了資料(如沒有匹配到任何行的delete語句),語句以時間的形式儲存,描述了資料的更改。二進位制日誌還包含執行每個更新資料庫語句的時間資訊,使用二進位制日誌的主要目的是最大可能的恢復資料庫。因為二進位制日誌包含備份後進行的所有更新,不記錄沒有修改任何資料的語句。

二、開啟和設定二進位制日誌

1、預設情況下二進位制日誌是關閉的,通過配置檔案來啟動和設定二進位制日誌。修改my.cng,插入如下內容,然後重啟mysqld服務。

server-id = 1                                       # mysql5.7必須加,否則mysql服務啟動報錯
log-bin = /data/3306/tmp/binlog/mysql-bin #路徑及命名,預設在data下 expire_logs_days = 10 # 過期時間,二進位制檔案自動刪除的天數,0代表不刪除 max_binlog_size = 100M # 單個日誌檔案大小

2、通過show variables like 'log_bin%'檢視二進位制日誌設定

mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name | Value | +---------------------------------+---------------------------------------+ | log_bin | ON | | log_bin_basename | /data/3306/tmp/binlog/mysql-bin | |
log_bin_index | /data/3306/tmp/binlog/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+---------------------------------------+

3、檢視當前伺服器所有的二進位制日誌檔案 show binary logs  /  show master logs

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       732 |
+------------------+-----------+

4、檢視當前二進位制日誌狀態  show master status

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      732 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

三、二進位制日誌切換方法

每次重啟MySQL服務也會生成一個新的二進位制日誌檔案,相當於二進位制日誌切換。切換二進位制日誌時,你會看到這些number會不斷遞增。另外,除了這些二進位制日誌檔案外,你會看到還生成了一個DB-Server-bin.index的檔案,這個檔案中儲存所有二進位制日誌檔案的清單又稱為二進位制檔案的索引。

執行 flush logs 可以重新整理切換二進位制檔案

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      732 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 四、二進位制檔案的檢視

1、使用show binlog events 可以獲取當前及指定日誌  show binlog events 'mysql-bin.000002'   from 639(只產看639)

mysql> show binlog events;
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.24-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysql-bin.000001 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 219 | Query          |         1 |         291 | BEGIN                                 |
| mysql-bin.000001 | 291 | Table_map      |         1 |         350 | table_id: 108 (test.t_count)          |
| mysql-bin.000001 | 350 | Write_rows     |         1 |         412 | table_id: 108 flags: STMT_END_F       |
| mysql-bin.000001 | 412 | Xid            |         1 |         443 | COMMIT /* xid=5 */                    |
| mysql-bin.000001 | 443 | Anonymous_Gtid |         1 |         508 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000001 | 508 | Query          |         1 |         580 | BEGIN                                 |
| mysql-bin.000001 | 580 | Table_map      |         1 |         639 | table_id: 108 (test.t_count)          |
| mysql-bin.000001 | 639 | Write_rows     |         1 |         701 | table_id: 108 flags: STMT_END_F       |
| mysql-bin.000001 | 701 | Xid            |         1 |         732 | COMMIT /* xid=7 */                    |
| mysql-bin.000001 | 732 | Rotate         |         1 |         779 | mysql-bin.000002;pos=4                |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+

 

2、列印二進位制日誌到一個明文檔案,該檔案記錄的更新了資料的sql,但是在5.7以上已經被加密

mysqlbinlog /data/3306/tmp/binlog/mysql-bin.000001 > mysql-bin.log                                  # 列印日誌檔案
mysqlbinlog --base64-output=decode-rows -v /data/3306/tmp/binlog/mysql-bin.000001 > binlog.sql      # 解密檔案
#  擷取的部分日誌內容,可以看到insert語句
BEGIN
/*!*/; # at 580 #181215 11:12:03 server id 1 end_log_pos 639 CRC32 0xc66c75c3 Table_map: `test`.`t_count` mapped to number 108 # at 639 #181215 11:12:03 server id 1 end_log_pos 701 CRC32 0xf8a50341 Write_rows: table id 108 flags: STMT_END_F ### INSERT INTO `test`.`t_count` ### SET ### @1=533500356 ### @2='W3V' ### @3='fg8rVMuT0' ### @4='2018:08:28' ### @5='2016-08-12 15:36:09' # at 701 #181215 11:12:03 server id 1 end_log_pos 732 CRC32 0xc42a0c0d Xid = 7 COMMIT/*!*/; SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ;

 五、二進位制日誌的刪除

1、reset mstaer 可以刪除所有日誌檔案 (不存在主從複製關係),執行完該語句,所有二進位制日誌被刪除。mysql重新建立二進位制日誌,編號從000001開始

2、purge master logs語句刪除指定日誌檔案

purge binary logs to 'DB-Server-bin.000002';                      # 刪除該日誌檔案之前的所有日誌檔案
purge binary logs before '2017-03-10 10:10:00';                   # 清除該時間點以前的所有日誌檔案
purge master logs before date_sub( now( ), interval 7 day);       # 清除7天前的日誌檔案