MySQL日志--二進制日志(binlog)


(一)什么是二進制日志

二進制日志(binlog)記錄了數據庫中所有的DDL和DML操作,但是不包括select語句,語句以“事件”的形式保存,記錄了數據庫的更改變化,在主從復制(replication)和數據恢復中起着重要的作用。對比來看,MySQL的二進制日志作用相當於Oracle數據庫的redo log + archive log。

 

(二)開啟二進制日志及參數配置

二進制日志開啟需要在配置文件里面配置相關參數,然后重啟數據庫,或者開啟數據庫的時候添加相關參數。主要參數如下:

(2.1)log_bin

該參數控制binlog文件存放的位置,用法log_bin=path/file_name。如果沒有給出路徑,則默認路徑為數據文件存放地址(datadir),如果沒有給出文件名稱,默認文件名為“主機名-bin.num”。初始文件是hostname-bin-000001,每次啟動MySQL服務或者刷新時,自動遞增編號創建二進制日志文件。

(2.1)binlog_format

該參數控制二進制日志文件的格式,可選格式有:

  • STATEMENT:日志中記錄的是執行的SQL語句,日志量小,但是復制會出現主從不一致的情況
  • ROW:日志記錄每一行數據的變化,日志量大,好處是主從復制數據不會出現不一致的情況,推薦使用這種方式
  • MIXED:結合STATEMENT和ROW的日志格式。

(2.3)expire_logs_days

該參數控制二進制日志保留天數,過了指定的天數后,日志將會自動刪除。

(2.4)max_binlog_size

該參數控制二進制日志文件的大小,當日志文件達到該參數指定的大小時,就會創建新的二進制日志文件。不過,實際上二進制日志文件可能會超過該值,比如當二進制日志快要寫滿時,執行一個超大事物,由於事物特性決定相關事件必須連續,這種情況下,事件必須寫到同一個日志文件,就會出現日志大於 max_binlog_size值的現象。

(2.5)binlog_do_db

該參數控制要保存二進制日志的數據庫,如果有多個數據庫,需要多次使用該參數,不能使用逗號分隔。

image

(2.6)binlog_ignore_db

該參數控制要不保存二進制日志的數據庫,如果有多個數據庫,需要多次使用該參數,不能使用逗號分隔。

(2.7)sync_binlog

該參數控制二進制日志刷新到磁盤的頻率,單位為秒(s)。

(2.8)server_id

如果要在MySQL5.7版本中開啟binlog,必須設置該參數,否則實例無法啟動。


一個簡單的參數配置如圖:

image


(三)二進制日志的作用

(3.1)復制

MySQL Master端的二進制日志發送到slave端,slave端根據日志進行重做,達到主從復制的目的。

(3.2)恢復

不管是使用mysqldump還是xtrabackup,我們都只能將數據庫恢復到有備份的時刻,如果要將數據庫恢復到任何時刻,則需要使用二進制日志。

 

(四)相關命令

(4.1)binlog清理

如果業務量較大,binlog日志增長很快,需要定期清理,有好幾種方法可以清理日志。

方法1:執行“reset master”命令,該命令將刪除所有的binlog日志,新日志編號從“000001”開始

mysql> reset master;
Query OK, 0 rows affected (0.00 sec)

方法2:執行“purge master logs to ‘hostname-bin.******’ ”命令,該命令將刪除******之前的日志

# 刪除'master-bin.000007'之前的日志 
 
[root@masterdb binlog]# ls -lrt
total 36
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000001
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000002
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000003
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000004
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000005
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000006
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
-rw-r----- 1 mysql mysql 154 Feb 13 00:20 master-bin.000008
-rw-r----- 1 mysql mysql 256 Feb 13 00:20 master-bin.index
[root@masterdb binlog]# 

mysql> purge master logs to 'master-bin.000007';
Query OK, 0 rows affected (0.00 sec)


[root@masterdb binlog]# ls -lrt
total 12
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
-rw-r----- 1 mysql mysql 154 Feb 13 00:20 master-bin.000008
-rw-r----- 1 mysql mysql  64 Feb 13 00:22 master-bin.index

方法3:執行“purge master logs before‘yyyy-mm-dd hh24:mi:ss’ ”命令,該命令將刪除指定日志之前的日志

# 刪除2020-02-13 00:24:00之前的日志

mysql> system ls -lrt /mysql/binlog
total 36
-rw-r----- 1 mysql mysql 202 Feb 13 00:20 master-bin.000007
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000008
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000009
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000010
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000011
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000012
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000013
-rw-r----- 1 mysql mysql 154 Feb 13 00:25 master-bin.000014
-rw-r----- 1 mysql mysql 256 Feb 13 00:25 master-bin.index
mysql> purge master logs before '2020-02-13 00:24:00';
Query OK, 0 rows affected (0.00 sec)

mysql> system ls -lrt /mysql/binlog
total 32
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000008
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000009
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000010
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000011
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000012
-rw-r----- 1 mysql mysql 202 Feb 13 00:25 master-bin.000013
-rw-r----- 1 mysql mysql 154 Feb 13 00:25 master-bin.000014
-rw-r----- 1 mysql mysql 224 Feb 13 00:29 master-bin.index

方法4:在配置文件中添加“expire_logs_days”參數,指定過期天數,到期會自動刪除。


(4.2)binlog切換

可以使用flush logs或者flush binary logs切換日志。

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000017 |      154 | db1,db2,db3  | db4              |                   |
+-------------------+----------+--------------+------------------+-------------------+
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 |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000018 |      154 | db1,db2,db3  | db4              |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

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

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000019 |      154 | db1,db2,db3  | db4              |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

 

(4.3)查看binlog events

mysql> show binlog events in 'master-bin.000019';
+-------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name          | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+-------------------+-----+----------------+-----------+-------------+---------------------------------------+
| master-bin.000019 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.24-log, Binlog ver: 4 |
| master-bin.000019 | 123 | Previous_gtids |         1 |         154 |                                       |
+-------------------+-----+----------------+-----------+-------------+---------------------------------------+
2 rows in set (0.00 sec)

 

(4.4)查看當前biblog位置

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000019 |      154 | db1,db2,db3  | db4              |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)




相關文檔集合:

1.MySQL日志--二進制日志(binlog)                  
2.使用mysqlbinlog查看二進制日志                  
3.MySQL使用mysqldump+binlog完整恢復被刪除的數據庫
4.使用binlog2sql工具來恢復數據庫                 
5.MySQL閃回工具—MyFlash                          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM