文章目录
- [MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)](#MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log))
-
- [MySQL二进制日志(Binary log)](#MySQL二进制日志(Binary log))
-
- 二进制日志文件的相关配置
- 二进制日志文件的相关参数的说明
- 二进制日志的格式
- 二进制日志的操作
- [例题1:日志文件binary log](#例题1:日志文件binary log)
- [例题1 解析](#例题1 解析)
- 参考
【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)
MySQL中有多种类型的日志文件,这些日志可用于故障排除、性能调整和审计等目的,帮助找出正在发生的活动。
常见的日志文件包括:
日志类型 | 写入日志的信息 |
---|---|
错误日志(Error log) | 启动、运行或停止mysqld时遇到的问题 |
二进制日志(Binary log) | 更改数据的语句(也用于复制) |
中继日志(Relay log) | 从复制源服务器接收到的数据更改 |
通用查询日志(General query log) | 已建立的客户端连接和从客户端接收到的语句 |
慢查询日志(Slow query log) | 执行时间超过long_query_time秒的查询 |
DDL日志(元数据日志)(DDL log) | DDL语句执行的元数据操作 |
MySQL二进制日志(Binary log)
MySQL的二进制日志(Binary log)是一种记录所有对MySQL数据库进行修改的操作的日志文件。
二进制日志文件主要用于如下目的:
clike
1.用于主从复制(replication)。
主服务器(复制源)将修改操作记录到二进制日志文件中,并将该文件发送到从服务器。
从服务器使用二进制日志文件中的操作记录来更新自己的数据库(重现这些事务,进行的相同数据更改),从而与主服务器保持同步。
2.用于数据恢复操作(point-in-time)。
将所有修改操作记录到一个二进制日志文件中,当需要进行数据恢复时,可以使用二进制日志文件中的操作记录来重建数据库。
例如在备份还原后,重新执行在备份之后记录在二进制日志中的事件,可以将数据库从备份点更新到最新状态。
二进制日志文件的相关配置
通过MySQL的配置文件设置二进制日志文件的路径、日志格式、日志级别等,在配置二进制日志时,需要注意日志文件的大小和保留时间,以免日志文件过大或过旧导致系统性能下降。
二进制日志默认为启用状态(即log_bin系统变量设置为ON)。
clike
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
可以通过如下命令查看二进制日志文件相关的配置参数。
clike
mysql> show variables like '%log_bin%';
mysql> show variables like '%binlog%';
二进制日志文件相关的配置参数输出例:
clike
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/binlog |
| log_bin_index | /var/lib/mysql/binlog.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)
mysql> show variables like '%binlog%';
+------------------------------------------------+----------------------+
| Variable_name | Value |
+------------------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_encryption | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_expire_logs_auto_purge | ON |
| binlog_expire_logs_seconds | 2592000 |
| 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_rotate_encryption_master_key_at_startup | OFF |
| binlog_row_event_max_size | 8192 |
| binlog_row_image | FULL |
| binlog_row_metadata | MINIMAL |
| binlog_row_value_options | |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_compression | OFF |
| binlog_transaction_compression_level_zstd | 3 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
| innodb_api_enable_binlog | OFF |
| log_statements_unsafe_for_binlog | ON |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 104857600 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+------------------------------------------------+----------------------+
30 rows in set (0.00 sec)
二进制日志文件的相关参数的说明
变量名 | 说明 |
---|---|
log_bin | 是否启用二进制日志记录 ,如果设置为ON,则MySQL将记录所有修改数据库的语句到二进制日志中。 |
log_bin_basename | 二进制日志文件的路径和基本名称,MySQL将在该名称后面添加一个数字作为文件名的后缀。例值为/var/lib/mysql/binlog时文件名为 binlog.000037 |
log_bin_index | 二进制日志索引文件的的路径和名称。例 /var/lib/mysql/binlog.index |
log_bin_trust_function_creators | 是否信任二进制日志中的函数创建者,如果设置为OFF,则MySQL将拒绝在二进制日志中记录由未授权的函数创建者创建的函数。 |
log_bin_use_v1_row_events | deprecated。是否使用v1格式的行事件记录,如果设置为ON,则MySQL将使用v1格式的行事件记录(5.5以前),否则将使用v2格式的行事件记录(5.6以后)。 |
sql_log_bin | 是否记录所有修改数据库的语句到二进制日志中,包括非事务性语句。默认开启 |
binlog_cache_size | 二进制日志缓存大小,用于控制二进制日志缓存的大小,避免过多的内存占用。 |
binlog_checksum | 二进制日志校验方式,可以是NONE、CRC32或者SHA256,用于保证二进制日志的完整性。 |
binlog_direct_non_transactional_updates | 默认关闭,是否直接将非事务性更新写入二进制日志,如果设置为ON,则MySQL将直接将非事务性更新写入二进制日志,否则将缓存这些更新,直到事务提交后再写入二进制日志,避免当一个事务包含对事务性表和非事务性表的更新时,复制的不一致性问题。 |
binlog_encryption | 是否启用二进制日志加密 |
binlog_error_action | 二进制日志出错时的处理方式,可以是IGNORE_ERROR、ABORT_SERVER或者ABORT_SLAVE |
binlog_expire_logs_auto_purge | 是否自动清理过期的二进制日志,如果设置为ON,则MySQL将自动清理过期的二进制日志。 |
binlog_expire_logs_seconds | 二进制日志过期时间,单位为秒 ,用于控制二进制日志的过期时间。默认30天。 |
binlog_format | 二进制日志格式,默认值ROW,可以是STATEMENT、ROW或者MIXED 。8.0.34开始deprecated |
binlog_group_commit_sync_delay | 二进制日志组提交同步延迟时间,单位为微秒 |
binlog_group_commit_sync_no_delay_count | 二进制日志组提交同步延迟计数器 |
binlog_gtid_simple_recovery | 是否启用简单的GTID恢复 |
binlog_max_flush_queue_time | deprecated。二进制日志最大刷新队列时间,单位为微秒 |
binlog_order_commits | 是否按照提交顺序记录二进制日志,如果设置为ON,则MySQL将按照提交顺序记录二进制日志。 |
binlog_transaction_compression | 是否启用二进制日志事务压缩。默认OFF |
binlog_transaction_compression_level_zstd | 二进制日志事务压缩级别,可以是1~22之间的整数 |
binlog_transaction_dependency_history_size | 二进制日志事务依赖历史记录大小,用于控制二进制日志事务依赖历史记录的大小 |
binlog_transaction_dependency_tracking | 是否启用二进制日志事务依赖追踪,如果设置为ON,则MySQL将记录事务之间的依赖关系,以便在主从复制时保证数据的一致性。 |
innodb_api_enable_binlog | 是否启用InnoDB API的二进制日志记录 |
log_statements_unsafe_for_binlog | 是否记录不安全的语句到二进制日志中 |
max_binlog_cache_size | 二进制日志缓存的最大大小,用于控制二进制日志缓存的大小,避免过多的内存占用。 |
max_binlog_size | 二进制日志文件的最大大小,用于控制二进制日志文件的大小,避免过多的磁盘占用。 |
max_binlog_stmt_cache_size | 二进制日志语句缓存的最大大小 ,用于控制二进制日志语句缓存的大小,避免过多的内存占用。 |
sync_binlog | 二进制日志同步方式(binlog文件刷新机制),可以是0、1或者N。 0 表示这个同步操作由操作系统根据自身负载自行决定binlog多久写一次磁盘,1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘 |
参考:
17.1.6.4
Binary Logging Options and Variables
https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html
二进制日志的格式
MySQL使用多种日志格式来记录二进制日志中的信息:
-
基于SQL语句的日志格式(statement-based logging)
基于SQL语句的日志格式是基于从主服务器到从服务器的SQL语句进行复制。每一条会修改数据的sql语句都会记录到binlog中。该格式下产生的binlog日志量会比较少,但可能导致主从数据不一致。
-
基于行的日志格式(row-based logging)
在基于行的日志格式中(默认格式),主服务器会将事件写入二进制日志,但不记录每一条具体执行的SQL语句,仅记录哪条数据被修改了,以及修改前后的样子。该格式下产生的binlog日志量会比较大,但优点是会非常清楚的记录下每一行数据修改的细节,主从复制不会出错。
-
混合日志格式(mixed logging)
二进制日志也可以采用混合日志格式。默认情况下,使用基于语句的日志格式,但在某些特殊情况(无法保证复制时一致性的情况)下,日志记录模式会自动切换为基于行的日志格式。
例如,在基于语句的复制中,可能存在复制不确定性语句的问题。在决定是否将给定语句安全地用于基于语句的复制时,MySQL确定是否可以保证使用基于语句的日志格式复制该语句。如果MySQL无法做出此保证,则将该语句标记为潜在不可靠,并发出警告,语句可能不安全以语句格式记录。这时可以通过使用MySQL的基于行的复制来避免这些问题。
设置二进制日志的格式
可以通过binlog_format参数可以设置二进制日志的格式。
全局级别的设置方法:
clike
mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';
会话级别的设置方法:
clike
mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';
例:
clike
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
mysql> SET SESSION binlog_format = 'ROW';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
参考:
5.4.4.1 Binary Logging Formats
https://dev.mysql.com/doc/refman/8.0/en/binary-log-formats.html
二进制日志的操作
二进制日志的操作包括如下命令:
clike
--显示所有可用的二进制日志文件列表,包括文件名、文件大小和是否加密等信息。
show binary logs;
--显示指定二进制日志文件中的事件列表,包括日志文件名、事件类型、位置、执行线程ID等信息。
show binlog events in '<binlog名>';
--显示主服务器的二进制日志状态,包括当前正在使用的二进制日志文件名、当前日志文件的位置等信息。
show master status;
--刷新二进制日志,将当前的二进制日志文件关闭并创建一个新的二进制日志文件。这个命令可以用于手动控制二进制日志文件的大小和数量,以及在备份二进制日志文件时使用。
flush logs;
查看二进制日志例:
clike
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
mysql> delete from city;
Query OK, 4079 rows affected (0.13 sec)
mysql> show binary logs;
+---------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000037 | 201 | No |
| binlog.000038 | 201 | No |
| binlog.000039 | 201 | No |
| binlog.000040 | 201 | No |
| binlog.000041 | 134688 | No |
+---------------+-----------+-----------+
5 rows in set (0.00 sec)
mysql> show binlog events in 'binlog.000041';
+---------------+--------+----------------+-----------+-------------+----------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+--------+----------------+-----------+-------------+----------------------------------------------------+
| binlog.000041 | 4 | Format_desc | 1 | 126 | Server ver: 8.0.33-0ubuntu0.22.04.2, Binlog ver: 4 |
| binlog.000041 | 126 | Previous_gtids | 1 | 157 | |
| binlog.000041 | 157 | Anonymous_Gtid | 1 | 237 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000041 | 237 | Query | 1 | 313 | BEGIN |
| binlog.000041 | 313 | Table_map | 1 | 379 | table_id: 92 (world.city) |
| binlog.000041 | 379 | Delete_rows | 1 | 8580 | table_id: 92 |
| binlog.000041 | 8580 | Delete_rows | 1 | 16762 | table_id: 92 |
| binlog.000041 | 16762 | Delete_rows | 1 | 24977 | table_id: 92 |
| binlog.000041 | 24977 | Delete_rows | 1 | 33192 | table_id: 92 |
| binlog.000041 | 33192 | Delete_rows | 1 | 41377 | table_id: 92 |
| binlog.000041 | 41377 | Delete_rows | 1 | 49584 | table_id: 92 |
| binlog.000041 | 49584 | Delete_rows | 1 | 57796 | table_id: 92 |
| binlog.000041 | 57796 | Delete_rows | 1 | 66005 | table_id: 92 |
| binlog.000041 | 66005 | Delete_rows | 1 | 74215 | table_id: 92 |
| binlog.000041 | 74215 | Delete_rows | 1 | 82422 | table_id: 92 |
| binlog.000041 | 82422 | Delete_rows | 1 | 90629 | table_id: 92 |
| binlog.000041 | 90629 | Delete_rows | 1 | 98819 | table_id: 92 |
| binlog.000041 | 98819 | Delete_rows | 1 | 107031 | table_id: 92 |
| binlog.000041 | 107031 | Delete_rows | 1 | 115242 | table_id: 92 |
| binlog.000041 | 115242 | Delete_rows | 1 | 123443 | table_id: 92 |
| binlog.000041 | 123443 | Delete_rows | 1 | 131632 | table_id: 92 |
| binlog.000041 | 131632 | Delete_rows | 1 | 134657 | table_id: 92 flags: STMT_END_F |
| binlog.000041 | 134657 | Xid | 1 | 134688 | COMMIT /* xid=94 */ |
+---------------+--------+----------------+-----------+-------------+----------------------------------------------------+
23 rows in set (0.00 sec)
mysql>
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000041 | 134688 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000042 | 157 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
例题1:日志文件binary log
clike
Choose the best answer.
You want to log only the changes made to the database objects and data on the MySQL system.
Which log will do this by default?
A) slow query log
B) binary log
C) error log
D) general query log
E) audit log
例题1 解析
Answser:B
MySQL的二进制日志(Binary log)是一种记录所有对MySQL数据库进行修改的操作的日志文件。
参考
https://dev.mysql.com/doc/refman/8.0/en/server-logs.html
17.1.6.4 Binary Logging Options and Variables
https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html