二進制日誌簡單介紹 html
MySQL的二進制日誌(binary log)是一個二進制文件,主要用於記錄修改數據或有可能引發數據變動的MySQL語句。二進制日誌(binary log)中記錄了對MySQL數據庫執行更改的全部操做,而且記錄了語句發生時間、執行時長、操做數據等其它額外信息,可是它不記錄SELECT、SHOW等那些不修改數據的SQL語句。二進制日誌(binary log)主要用於數據庫恢復和主從複製,以及審計(audit)操做。 mysql
官方文檔關於二進制日誌(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: sql
· 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」. api
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. 服務器
二進制日誌狀態查看 session
系統變量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