MySQL的二進制日誌(binlog)使用分析(1)——binlog日誌的格式及配置

MySQL的二進制日誌(binlog)使用分析(1)——binlog日誌的格式及配置

Mysql的二進制日誌(binlog)作用是用來記錄對mysql數據庫的更新,對數據庫的查詢select或show等不會被binlog日誌記錄。其主要用於數據庫的主從複製以及增量恢復。可以使用mysqlbinlog命令查看二進制日誌的內容。

一、MySQL binlog的三種格式

1、STATMENT

STATMENT格式是MySQL默認的二進制日誌格式,基於SQL語句的複製(statement-based replication,SBR),把修改修改數據的每一條sql語句記錄到binlog中。該日誌模式只記錄修改數據的sql語句,而不記錄具體的數據變化。

2、ROW

基於行的複製(row-based replication,RBR):記錄哪條數據被修改,以及修改前和修改後的數據。而不記錄具體執行的sql語句。ROW的格式是事務性或稱爲行的二進制日誌,會將當前對數據的操作以事務的方式記錄下來。

3、MIXED

混合模式複製(mixed-based replication,MBR):以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog,對於STATEMENT模式無法複製的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日誌保存方式。MIXED是基於ROW的,也可能是STATEMENT格式,是一種混合格式,但以ROW格式爲主。

說明:如果是replication環境,那麼binlog_format建議設置爲ROW格式,即以事務的格式來記錄,並且replicaton環境要使用事務型引擎而不要使用非事務型引擎。

二、和binlog相關的配置

1、基本配置

[mysqld]
##打開binlog日誌,同時指定日誌的路徑及基本文件名
log-bin=/var/lib/mysql/mysql-bin
server-id=1  ## 爲服務器指定一個編號

2、和binlog有關的其他設置

#設置日誌格式,該選項可以設置爲statement、row、mixed
binlog_format = mixed
#設置binlog清理時間
expire_logs_days = 7
#設置binlog每個日誌文件的最大大小
max_binlog_size = 100m
#設置binlog緩存大小
binlog_cache_size = 4m
#最大binlog緩存大小
max_binlog_cache_size = 512m

重啓MySQL使設置生效。

三、日誌操作命令

1、查看日誌文件信息

使用show binary logs或者show master logs可以查看日誌文件的名稱以及大小等信息。

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |      2206 |
| mysql-bin.000005 |       718 |
+------------------+-----------+
5 rows in set (0.01 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |      2206 |
| mysql-bin.000005 |       718 |
+------------------+-----------+
5 rows in set (0.00 sec)

2、查看與日誌相關的參數

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
6 rows in set (0.01 sec)

--說明:
--log_bin:開啓或關閉日誌
--log_bin_basename:日誌文件的位置和名稱
--log_bin_index:日誌文件的索引文件位置和名稱

mysql> show variables like '%binlog%';
+--------------------------------------------+----------------------+
| Variable_name                              | Value                |
+--------------------------------------------+----------------------+
| binlog_cache_size                          | 32768                |
| binlog_checksum                            | CRC32                |
| binlog_direct_non_transactional_updates    | OFF                  |
| binlog_error_action                        | ABORT_SERVER         |
| binlog_format                              | ROW                  |
| binlog_group_commit_sync_delay             | 0                    |
| binlog_group_commit_sync_no_delay_count    | 0                    |
| binlog_gtid_simple_recovery                | ON                   |
| 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                |
| binlog_transaction_dependency_history_size | 25000                |
| binlog_transaction_dependency_tracking     | COMMIT_ORDER         |
| innodb_api_enable_binlog                   | OFF                  |
| innodb_locks_unsafe_for_binlog             | OFF                  |
| log_statements_unsafe_for_binlog           | ON                   |
| max_binlog_cache_size                      | 18446744073709547520 |
| max_binlog_size                            | 1073741824           |
| max_binlog_stmt_cache_size                 | 18446744073709547520 |
| sync_binlog                                | 1                    |
+--------------------------------------------+----------------------+
22 rows in set (0.00 sec)

--說明:
--binlog_format:日誌文件的格式,包括:statement,row,mixed三種。

3、查看master狀態

利用show master status命令可以查看最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)的位置。

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

4、刷新log日誌

使用flush logs命令,產生一個新編號的binlog日誌文件。

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |      2206 |
| mysql-bin.000005 |       718 |
+------------------+-----------+
5 rows in set (0.01 sec)

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

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |       177 |
| mysql-bin.000004 |      2206 |
| mysql-bin.000005 |       765 |
| mysql-bin.000006 |       154 |
+------------------+-----------+
6 rows in set (0.00 sec)

5、重置(清空)所有binlog日誌

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

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+
1 row in set (0.00 sec)

6、查看二進制日誌的信息

二進制日誌文件中是二進制的數據,因此不能直接使用文本命令或工具查看,需要使用專門的工具。mysql自帶的mysqlbinlog就是一個用於查看二進制日誌文件的工具,使用方式如下:

[root@localhost ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000002
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#200704  9:56:25 server id 2  end_log_pos 123 CRC32 0x20e2ab6b 	Start: binlog v 4, server v 5.7.27-log created 200704  9:56:25 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
yeH/Xg8CAAAAdwAAAHsAAAABAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADJ4f9eEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AWur4iA=
'/*!*/;
# at 123
#200704  9:56:25 server id 2  end_log_pos 154 CRC32 0x00ab9ec4 	Previous-GTIDs
# [empty]
# at 154
#200704 10:11:38 server id 2  end_log_pos 219 CRC32 0xfa0d8cf1 	Anonymous_GTID	last_committed=0	sequence_number=1      rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#200704 10:11:38 server id 2  end_log_pos 298 CRC32 0x3d6a80da 	Query	thread_id=2	exec_time=0	error_code=0
SET TIMESTAMP=1593828698/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
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=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 298
#200704 10:11:38 server id 2  end_log_pos 397 CRC32 0xa994d353 	Query	thread_id=2	exec_time=0	error_code=0
use `hist`/*!*/;
SET TIMESTAMP=1593828698/*!*/;
update t2 set id=id+10000
/*!*/;
# at 397
#200704 10:11:38 server id 2  end_log_pos 428 CRC32 0x1976aede 	Xid = 11
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

二進制日誌中的每條記錄是從一個【at 數字】開始到一個【at 數字】結束,之間是一條二進制日誌記錄。每條記錄的end_log_pos的值與記錄結束的at後的值是一致的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章