二進制日志簡單介紹
MySQL的二進制日志(binary log)是一個二進制文件,主要用於記錄修改數據或有可能引起數據變更的MySQL語句。二進制日志(binary log)中記錄了對MySQL數據庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作數據等其它額外信息,但是它不記錄SELECT、SHOW等那些不修改數據的SQL語句。二進制日志(binary log)主要用於數據庫恢復和主從復制,以及審計(audit)操作。
官方文檔關於二進制日志(binary log)的介紹如下:
The binary log contains “events” that describe database changes such as table creation operations or changes to table data. It also contains events for statements that potentially could have made changes (for example, a DELETE which matched no rows), unless row-based logging is used. The binary log also contains information about how long each statement took that updated data. The binary log has two important purposes:
· For replication, the binary log on a master replication server provides a record of the data changes to be sent to slave servers. The master server sends the events contained in its binary log to its slaves, which execute those events to make the same data changes that were made on the master. See Section 17.2, “Replication Implementation”.
· Certain data recovery operations require use of the binary log. After a backup has been restored, the events in the binary log that were recorded after the backup was made are re-executed. These events bring databases up to date from the point of the backup. See Section 7.5, “Point-in-Time (Incremental) Recovery Using the Binary Log”.
The binary log is not used for statements such as SELECT or SHOW that do not modify data. To log all statements (for example, to identify a problem query), use the general query log. See Section 5.4.3, “The General Query Log”.
Running a server with binary logging enabled makes performance slightly slower. However, the benefits of the binary log in enabling you to set up replication and for restore operations generally outweigh this minor performance decrement.
二進制日志狀態查看
系統變量log_bin的值為OFF表示沒有開啟二進制日志(binary log)。ON表示開啟了二進制日志(binary log)
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
查看當前服務器所有的二進制日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 | 9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)
當然你還可以使用下面命令查看
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 | 9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)
mysql>
查看當前二進制日志文件狀態
mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 373655406 | | | |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
二進制日志開啟方法
查看系統變量log_bin,如果其值為OFF,表示沒有開啟二進制日志(binary log),如果需要開啟二進制日志,則必須在my.cnf中[mysqld]下面添加log-bin [=DIR\[filename]] ,DIR參數指定二進制文件的存儲路徑;filename參數指定二級制文件的文件名。 其中filename可以任意指定,但最好有一定規范。系統變量log_bin是靜態參數,不能動態修改的(因為它不是Dynamic Variable)。如下所示:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global log_bin=mysql_bin;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
mysql>
1:修改my.cnf,在[mysqld]下面增加log_bin=mysql_bin_log,重啟MySQL后,你就會發現log_bin變為了ON,二進制日志(binary log)默認放在數據目錄下(系統變量datadir下),如下所示:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql_bin_log |
| log_bin_index | /var/lib/mysql/mysql_bin_log.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
mysql>
2:如果在my.cnf里面只設置log_bin,但是不指定file_name,然后重啟數據庫。你會發現二進制日志文件名稱為${hostname}-bin 這樣的格式。如下所示:
[mysqld]
log_bin
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/DB-Server-bin |
| log_bin_index | /var/lib/mysql/DB-Server-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
mysql>
3:當然你可以可以指定二進制日志的路徑位置,如下所示:
log_bin=/mysql/bin_log/mysql_binlog
二進制日志切換方法
使用命令flush logs切換二進制日志,如下所示:
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000002 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)
mysql> show master status
-> ;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000003 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
請注意,每次重啟MySQL服務也會生成一個新的二進制日志文件,相當於二進制日志切換。切換二進制日志時,你會看到這些number會不斷遞增。另外,除了這些二進制日志文件外,你會看到還生成了一個DB-Server-bin.index的文件,這個文件中存儲所有二進制日志文件的清單又稱為二進制文件的索引。
[root@DB-Server mysql]# ls -lrt DB-Server-bin*
-rw-rw---- 1 mysql mysql 143 Mar 22 10:55 DB-Server-bin.000001
-rw-rw---- 1 mysql mysql 171 Mar 22 11:20 DB-Server-bin.000002
-rw-rw---- 1 mysql mysql 171 Mar 22 11:23 DB-Server-bin.000003
-rw-rw---- 1 mysql mysql 171 Mar 22 11:24 DB-Server-bin.000004
-rw-rw---- 1 mysql mysql 138 Mar 22 11:24 DB-Server-bin.index
-rw-rw---- 1 mysql mysql 120 Mar 22 11:24 DB-Server-bin.000006
-rw-rw---- 1 mysql mysql 171 Mar 22 11:24 DB-Server-bin.000005
[root@DB-Server mysql]# more DB-Server-bin.index
./DB-Server-bin.000001
./DB-Server-bin.000002
./DB-Server-bin.000003
./DB-Server-bin.000004
./DB-Server-bin.000005
./DB-Server-bin.000006
[root@DB-Server mysql]#
二進制日志刪除方法
二進制日志的刪除可以通過命令手工刪除,也可以設置自動清理。下面簡單介紹一下,如何刪除二進制日志。
1: purge binary logs to xxx; 表示刪除某個日志之前的所有二進制日志文件。這個命令會修改index中相關數據
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000001 | 143 |
| DB-Server-bin.000002 | 171 |
| DB-Server-bin.000003 | 171 |
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
8 rows in set (0.00 sec)
mysql> purge binary logs to 'DB-Server-bin.000002';
Query OK, 0 rows affected (0.02 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000002 | 171 |
| DB-Server-bin.000003 | 171 |
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
7 rows in set (0.00 sec)
mysql> purge binary logs to 'DB-Server-bin.000004';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 120 |
+----------------------+-----------+
5 rows in set (0.00 sec)
mysql>
2: 清除某個時間點以前的二進制日志文件。
mysql> purge binary logs before '2017-03-10 10:10:00';
Query OK, 0 rows affected (0.00 sec)
3: 清除7天前的二進制日志文件
mysql> purge master logs before date_sub( now( ), interval 7 day);
Query OK, 0 rows affected (0.00 sec)
4: 清除所有的二進制日志文件(當前不存在主從復制關系)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000004 | 171 |
| DB-Server-bin.000005 | 171 |
| DB-Server-bin.000006 | 143 |
| DB-Server-bin.000007 | 143 |
| DB-Server-bin.000008 | 143 |
| DB-Server-bin.000010 | 143 |
| DB-Server-bin.000011 | 120 |
+----------------------+-----------+
7 rows in set (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)
mysql> show binary logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| DB-Server-bin.000010 | 120 |
+----------------------+-----------+
1 row in set (0.00 sec)
mysql>
5:另外,我們也可以設置expire_logs_days參數,設置自動清理,其默認值為0,表示不啟用過期自動刪除功能,如果啟用了自動清理功能,表示超出此天數的二進制日志文件將被自動刪除,自動刪除工作通常發生在MySQL啟動時或FLUSH日志時。
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 7 |
+------------------+-------+
1 row in set (0.00 sec)
mysql>
二進制日志相關參數
關於二進制日志(binary log)的一些相關參數,下面一一介紹,如有不足或疏漏之處,敬請指出:
1:系統變量log_bin_basename是MySQL 5.6.2開始引入的。 它表示二進制日志文件名。默認值為datadir + '/' + hostname + '-bin'。 該參數不需要設置,也不能在my.cnf中設置,否則會報錯(實驗環境為MySQL 5.6.20,如有不對,敬請指出!)。
Holds the name and complete path to the binary log file. Unlike the log_bin system variable, log_bin_basename reflects the name set with the --log-bin server option
mysql> show variables like 'log_bin_basename';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| log_bin_basename | /var/lib/mysql/DB-Server-bin |
+------------------+------------------------------+
1 row in set (0.00 sec)
mysql>
2:系統變量log_bin_index是MySQL 5.6.4開始引入的。 它表示二進制日志的索引文件。該參數可以在my.cnf中設置。
mysql> show variables like 'log_bin_index';
+---------------+------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------+
| log_bin_index | /var/lib/mysql/DB-Server-bin.index |
+---------------+------------------------------------+
1 row in set (0.01 sec)
mysql>
3:系統變量log_bin_trust_function_creators,默認為OFF,這個參數開啟會限制存儲過程、Function、觸發器的創建。
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec)
mysql>
4:系統變量sql_log_bin 用於控制會話級別二進制日志功能的開啟或關閉,默認為ON,表示啟用二進制日志功能。
mysql> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
5:系統變量expire_logs_days ,前面已經闡述。在此不做介紹。
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | MIXED |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlogging_impossible_mode | IGNORE_ERROR |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
16 rows in set (0.00 sec)
mysql>
6:系統變量binlog_cache_size 表示為每個客戶端分配binlog_cache_size大小的緩存,默認值32768。二進制日志緩存使用的前提條件是服務器端使用了支持事務的引擎以及開啟了bin log功能,它是MySQL用來提高binlog的效率而設計的一個用於短時間內臨時緩存binlog數據的內存區域。一般來說,如果我們的數據庫中沒有什么大事務,寫入也不是特別頻繁,2MB~4MB是一個合適的選擇。但是如果我們的數據庫大事務較多或多事務語句,寫入量比較大,可適當調高binlog_cache_size。同時,我們可以通過binlog_cache_use 以及 binlog_cache_disk_use來分析設置的binlog_cache_size是否足夠,是否有大量的binlog_cache由於內存大小不夠而使用臨時文件(binlog_cache_disk_use)來緩存了。
mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> show status like 'binlog%';
+----------------------------+---------+
| Variable_name | Value |
+----------------------------+---------+
| Binlog_cache_disk_use | 37 |
| Binlog_cache_use | 1048300 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 2306 |
+----------------------------+---------+
4 rows in set (0.00 sec)
mysql>
如上所示,可以通過查看Binlog_cache_disk_use 與 Binlog_cache_use來判斷binlog_cache_size是否需要調整。
7: 系統變量max_binlog_cache_size 二進制日志能夠使用的最大cache內存大小。當執行多語句事務時,max_binlog_cache_size 如果不夠大,系統可能會報出“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage”的錯誤。
mysql> show variables like 'max_binlog_cache_size';
+-----------------------+----------------------+
| Variable_name | Value |
+-----------------------+----------------------+
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
1 row in set (0.00 sec)
mysql>
8: 系統變量max_binlog_stmt_cache_size
max_binlog_cache_size針對事務語句,max_binlog_stmt_cache_size針對非事務語句,當我們發現Binlog_cache_disk_use或者Binlog_stmt_cache_disk_use比較大時就需要考慮增大cache的大小
max_binlog_stmt_cache_size sets the size for the statement cache only; the upper limit for the transaction cache is governed exclusively by the max_binlog_cache_size system variable.
mysql> show variables like 'max_binlog_stmt_cache_size';
+----------------------------+----------------------+
| Variable_name | Value |
+----------------------------+----------------------+
| max_binlog_stmt_cache_size | 18446744073709547520 |
+----------------------------+----------------------+
1 row in set (0.00 sec)
mysql>
9:系統變量max_binlog_size, 表示二進制日志的最大值,一般設置為512M或1GB,但不能超過1GB。該設置並不能嚴格控制二進制日志的大小,尤其是二進制日志比較靠近為不而又遇到一根比較大事務時, 為了保證事務的完整性,不可能做切換日志的動作,只能將該事務的所有SQL都記錄進當前日志,直到事務結束。
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
mysql>
10:系統變量binlog_checksum 用作復制的主從校檢。 NONE表示不生成checksum,CRC-32表示使用這個算法做校檢。
mysql> show variables like 'binlog_checksum';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| binlog_checksum | CRC32 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
11:系統變量sync_binlog,這個參數對於Mysql系統來說是至關重要的,它不僅影響到二進制日志文件對MySQL所帶來的性能損耗,而且還影響到MySQL中數據的完整性。
sync_binlog=0,當事務提交后,Mysql僅僅是將binlog_cache中的數據寫入binlog文件,但不執行fsync之類的磁盤同步指令通知文件系統將緩存刷新到磁盤,而是讓Filesystem自行決定什么時候來做同步。MySQL中默認的設置是 sync_binlog=0,即不作任何強制性的磁盤刷新指令,這個設置性能是最好的,但風險也是最大的。一旦系統崩潰(Crash),在文件系統緩存中的所有二進制日志信息都會丟失。從而帶來數據不完整問題。
sync_binlog=n,在進行n次事務提交以后,Mysql將執行一次fsync之類的磁盤同步指令,同時文件系統將Binlog文件緩存刷新到磁盤。
可以適當的調整sync_binlog, 在犧牲一定的一致性下,獲取更高的並發和性能。
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
12:系統變量binlog_format 指定二進制日志的類型。分別有STATEMENT、ROW、MIXED三種值。MySQL 5.7.6之前默認為STATEMENT模式。MySQL 5.7.7之后默認為ROW模式。這個參數主要影響主從復制。
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
mysql>
復制的模式有下面幾種:
基於SQL語句的復制(statement-based replication, SBR),
基於行的復制(row-based replication, RBR),
混合模式復制(mixed-based replication, MBR)。
相應地,二進制日志的格式也有三種:STATEMENT,ROW,MIXED。這里限於篇幅和主題,不做展開介紹。后面會單獨總結介紹。
查看二進制日志內容
方法1:使用show binlog events方式可以獲取當前以及指定binlog的日志,不適宜提取大量日志。
SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
方法2: 使用mysqlbinlog命令行查看日志內容(適宜批量提取日志)。
下面我們來通過實驗驗證一下,先看看show binlog events方式的測試:
1: 查看第一個binlog文件的內容(show binlog events)

2: 查看某個特定binglog文件的內容。
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000011 | 120 | | | |
+----------------------+----------+--------------+------------------+-------------------+
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values(21, 'kkk21');
Query OK, 1 row affected (0.02 sec)
mysql> insert into test values(22, 'kkk22');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+-------+
| id | name |
+------+-------+
| 10 | kerry |
| 20 | kern |
| 21 | kkk21 |
| 22 | kkk22 |
+------+-------+
4 rows in set (0.00 sec)
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(12) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000012 | 552 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> show binlog events in 'DB-Server-bin.000012';
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
| DB-Server-bin.000012 | 4 | Format_desc | 1 | 120 | Server ver: 5.6.20-enterprise-commercial-advanced-log, Binlog ver: 4 |
| DB-Server-bin.000012 | 120 | Query | 1 | 197 | BEGIN |
| DB-Server-bin.000012 | 197 | Query | 1 | 305 | use `gsp`; insert into test values(21, 'kkk21') |
| DB-Server-bin.000012 | 305 | Xid | 1 | 336 | COMMIT /* xid=46 */ |
| DB-Server-bin.000012 | 336 | Query | 1 | 413 | BEGIN |
| DB-Server-bin.000012 | 413 | Query | 1 | 521 | use `gsp`; insert into test values(22, 'kkk22') |
| DB-Server-bin.000012 | 521 | Xid | 1 | 552 | COMMIT /* xid=47 */ |
+----------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------+
7 rows in set (0.00 sec)
mysql>
mysql> show binlog events in 'DB-Server-bin.000012' from 336;
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
| DB-Server-bin.000012 | 336 | Query | 1 | 413 | BEGIN |
| DB-Server-bin.000012 | 413 | Query | 1 | 521 | use `gsp`; insert into test values(22, 'kkk22') |
| DB-Server-bin.000012 | 521 | Xid | 1 | 552 | COMMIT /* xid=47 */ |
+----------------------+-----+------------+-----------+-------------+-------------------------------------------------+
3 rows in set (0.00 sec)
mysql>
接下來,我們來看看使用mysqlbinlog命令如何查看二進制日志文件中的的內容
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000012 | 552 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> use gsp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into test values(303, 'kerry');
Query OK, 1 row affected (0.01 sec)
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| DB-Server-bin.000013 | 337 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> system mysqlbinlog /var/lib/mysql/DB-Server-bin.000013;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170323 18:43:17 server id 1 end_log_pos 120 CRC32 0xabfd028f Start: binlog v 4, server v 5.6.20-enterprise-commercial-advanced-log created 170323 18:43:17
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
hU/UWA8BAAAAdAAAAHgAAAABAAQANS42LjIwLWVudGVycHJpc2UtY29tbWVyY2lhbC1hZHZhbmNl
ZC1sb2cAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAY8C
/as=
'/*!*/;
# at 120
#170323 18:43:46 server id 1 end_log_pos 197 CRC32 0xc5ff49de Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1490309026/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 197
#170323 18:43:46 server id 1 end_log_pos 306 CRC32 0x75c26223 Query thread_id=4 exec_time=0 error_code=0
use `gsp`/*!*/;
SET TIMESTAMP=1490309026/*!*/;
insert into test values(303, 'kerry')
/*!*/;
# at 306
#170323 18:43:46 server id 1 end_log_pos 337 CRC32 0x6ea837f4 Xid = 80
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysql>
2: 解析DB-Server-bin.000013並將內容輸出到test.sql
[root@DB-Server ~]# mysqlbinlog /var/lib/mysql/DB-Server-bin.000013 > test.sql;
[root@DB-Server ~]# more test.sql
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170323 18:43:17 server id 1 end_log_pos 120 CRC32 0xabfd028f Start: binlog v 4, server v 5.6.20-enterprise-commercial-advanced-log created 170323 18:43:17
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
hU/UWA8BAAAAdAAAAHgAAAABAAQANS42LjIwLWVudGVycHJpc2UtY29tbWVyY2lhbC1hZHZhbmNl
ZC1sb2cAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAY8C
/as=
'/*!*/;
# at 120
#170323 18:43:46 server id 1 end_log_pos 197 CRC32 0xc5ff49de Query thread_id=4 exec_time=0 error_code=0
SET TIMESTAMP=1490309026/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 197
#170323 18:43:46 server id 1 end_log_pos 306 CRC32 0x75c26223 Query thread_id=4 exec_time=0 error_code=0
use `gsp`/*!*/;
SET TIMESTAMP=1490309026/*!*/;
insert into test values(303, 'kerry')
/*!*/;
# at 306
#170323 18:43:46 server id 1 end_log_pos 337 CRC32 0x6ea837f4 Xid = 80
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysqlbinlog有許多參數,你可以分析、提取指定position位置的binlog日志;也可以按指定時間恢復數據;也可以導出的腳本文件;或者壓縮處理等等,非常靈活強大。在這里不做詳細展開,后面將單獨的寫一篇總結介紹。
開啟二進制日志影響性能嗎?
開啟MySQL的二進制日志會影響服務器性能嗎?答案是會有一些性能損耗,但是性能開銷非常小(slightly slower),另外,開啟binlog帶來的好處要遠遠超過帶來的性能開銷。官方文檔的介紹如下所示:
Running a server with binary logging enabled makes performance slightly slower. However, the benefits of the binary log in enabling you to set up replication and for restore operations generally outweigh this minor performance decrement.
參考資料:
https://dev.mysql.com/doc/refman/5.6/en/binary-log.html
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_log_bin_basename
http://pangge.blog.51cto.com/6013757/1319304