1.什么是二进制日志:
Binary Log Files二进制日志是记录MySQL服务器数据修改信息的一组文件。它包含描述数据库更改的"事件",如表创建操作或表数据变更。除非使用基于行的日志记录方式,否则二进制日志还会记录可能已产生更改的语句事件(例如未匹配任何行的DELETE语句)。
2.二进制日志主要作用:
二进制日志还包含每个更新数据语句所耗时的信息,其主要作用包括: (1)数据复制: 复制源服务器上的二进制日志记录了要发送到副本的数据更改记录。源服务器将二进制日志中的信息发送给副本,副本重放这些事务以实现与源服务器相同的数据更改。 (2)数据恢复: 某些数据恢复操作需要使用二进制日志。备份恢复后,会重新执行备份时间点之后记录在二进制日志中的事件,使数据库从备份状态更新到最新。
3.二进制日志的加密:
启用二进制日志会使服务器性能略有下降,但其在复制和恢复方面的优势通常远超过这种轻微性能影响。 二进制日志具有抗意外中断能力,仅记录或读取完整事件或事务。写入二进制日志的语句中的密码会被服务器重写,避免以明文形式出现。 从MySQL 8.0.14开始,支持对二进制日志文件和中继日志文件进行加密,通过设置binlog_encryption=ON启用加密功能。
4.二进制日志的启动和关闭:
二进制日志默认启用(log_bin系统变量设置为ON),但使用mysqld手动初始化数据目录时默认禁用。 可通过指定–log-bin选项启用,或使用–skip-log-bin/–disable-log-bin禁用。 使用–log-bin[=base_name]指定日志文件基础名。未指定时默认使用"binlog"。 具有足够权限的客户端可使用SET sql_log_bin=OFF禁用自身语句的二进制日志记录。
mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec)
5.二进制日志文件切换场景:
服务器通过追加数字扩展名生成有序的日志文件系列,在以下情况下会创建新文件: (1)MySQL启动或重启 (2)MySQL刷新日志 (3)当前日志文件达到max_binlog_size
mysql> show variables like 'max_binlog_size'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | max_binlog_size | 536870912 | +-----------------+-----------+ 1 row in set (0.00 sec)
6.二进制日志索引文件:
为跟踪已使用的二进制日志文件,mysqld还会创建二进制日志索引文件(默认扩展名为".index")。
mysql> show variables like 'log_bin_index'; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | log_bin_index | /mysqldata/13309/binlog/mysql-bin.index | +---------------+-----------------------------------------+ 1 row in set (0.00 sec) mysql> system cat /mysqldata/13309/binlog/mysql-bin.index /mysqldata/13309/binlog/mysql-bin.000004 /mysqldata/13309/binlog/mysql-bin.000005
7.二进制日志文件的位置:
二进制日志文件默认位于数据目录,可通过–log-bin指定替代路径。
mysql> show variables like 'log_bin%'; +---------------------------------+-----------------------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------------------+ | log_bin | ON | | log_bin_basename | /mysqldata/13309/binlog/mysql-bin | | log_bin_index | /mysqldata/13309/binlog/mysql-bin.index | | log_bin_trust_function_creators | ON | | log_bin_use_v1_row_events | OFF | +---------------------------------+-----------------------------------------+ 5 rows in set (0.00 sec)
8.二进制日志写入失败处理方式:
若服务器无法写入或同步二进制日志,binlog_error_action系统变量控制错误处理方式:ABORT_SERVER(默认)使服务器停止并关闭,IGNORE_ERROR提供向后兼容性。
9.二进制日志文件的落盘:
二进制日志默认每次写入都同步磁盘(sync_binlog=1)。通过InnoDB对XA事务两阶段提交的支持,结合sync_binlog=1,可确保二进制日志与InnoDB数据文件同步。
mysql> show variables like 'sync_binlog'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sync_binlog | 1 | +---------------+-------+ 1 row in set (0.00 sec)
10.二进制日志格式:
(1)STATEMENT (2)ROW(默认) (3)MIXED查询:
mysql> show variables like 'binlog_format'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec)
MIXED混合日志记录。在混合日志记录模式下,默认使用基于语句STATEMENT的日志记录,但在某些情况下(如下所述)日志模式会自动切换为基于行ROW。 使用基于语句的复制时,复制非确定性语句可能会出现问题。 在判断某条语句是否适用于基于语句的复制时,MySQL会评估是否能保证该语句可通过基于语句的日志记录安全复制。 如果MySQL无法提供此保证,则会将语句标记为潜在不可靠,并发出警告:“Statement may not be safe to log in statement format”。 您可以通过改用MySQL基于行的复制来避免这些问题。 全局设置
mysql> SET GLOBAL binlog_format = 'STATEMENT'; mysql> SET GLOBAL binlog_format = 'ROW'; mysql> SET GLOBAL binlog_format = 'MIXED';
会话级别设置
mysql> SET SESSION binlog_format = 'STATEMENT'; mysql> SET SESSION binlog_format = 'ROW'; mysql> SET SESSION binlog_format = 'MIXED';
11.MIXED格式下,默认使用STATEMENT,哪些场景下,会自动切换为ROW:
在MySQL的混合日志记录模式下,当遇到特定情况,尤其是可能引发主从复制数据不一致的非确定性语句时,服务器会自动从基于语句的日志记录切换到基于行的日志记录。 使用非确定性函数:这些函数在不同服务器上或不同时间执行时,可能产生不同结果。
UUID() USER(), CURRENT_USER(), CURRENT_USER FOUND_ROWS(), ROW_COUNT() LOAD_FILE()
涉及特定结构和操作:这些操作在基于语句的复制中难以准确重放。 当更新具有AUTO_INCREMENT列的表并调用触发器或存储函数时; 当创建视图的语句本身需要行级复制时(例如视图定义中使用了UUID()函数); 当语句涉及mysql数据库中的日志表时;引用系统变量: 大多数情况下,语句中引用了系统变量会触发切换。 但存在一个例外:当会话级别的 auto_increment_increment 和 auto_increment_offset 被使用时,不会引起格式切换;
12.二进制文件相关参数有哪些:
一共48个,参数详细信息,查看:
https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html
--binlog-row-event-max-size=#
--log-bin=file_name
--log-bin-index=file_name
--binlog-do-db=name
--binlog-ignore-db=name
--binlog-checksum=type
--max-binlog-dump-events=#
--sporadic-binlog-dump-fail[={OFF|ON}]
--binlog-cache-size=#
--binlog-direct-non-transactional-updates[={OFF|ON}]
--binlog-encryption[={OFF|ON}]
--binlog-error-action[=value]
--binlog-expire-logs-seconds=#
--binlog-expire-logs-auto-purge={ON|OFF}
--binlog-format=format
--binlog-group-commit-sync-delay=#
--binlog-group-commit-sync-no-delay-count=#
--binlog-max-flush-queue-time=#
--binlog-order-commits[={OFF|ON}]
--binlog-rotate-encryption-master-key-at-startup[={OFF|ON}]
--binlog-row-event-max-size=#
--binlog-row-image=image_type
--binlog-row-metadata=metadata_type
--binlog-row-value-options=#
--binlog-rows-query-log-events[={OFF|ON}]
--binlog-stmt-cache-size=#
--binlog-transaction-compression[={OFF|ON}]
--binlog-transaction-compression-level-zstd=#
--binlog-transaction-dependency-tracking=value
--binlog-transaction-dependency-history-size=#
--expire-logs-days=#
log_bin
log_bin_basename
--log-bin-index=file_name
--log-bin-trust-function-creators[={OFF|ON}]
--log-bin-use-v1-row-events[={OFF|ON}]
--log-replica-updates[={OFF|ON}]
--log-slave-updates[={OFF|ON}]
--log-statements-unsafe-for-binlog[={OFF|ON}]
--master-verify-checksum[={OFF|ON}]
--max-binlog-cache-size=#
--max-binlog-size=#
--max-binlog-stmt-cache-size=#
original_commit_timestamp
--source-verify-checksum[={OFF|ON}]
sql_log_bin
--sync-binlog=#
--transaction-write-set-extraction[=value]
13.查看binlog
列出服务器上的二进制日志文件。该语句作为第15.4.1.1节“PURGE BINARY LOGS语句”中描述流程的组成部分,用于确定哪些日志可以被清除。执行SHOW BINARY LOGS需要REPLICATION CLIENT权限(或已弃用的SUPER权限)。加密的二进制日志文件包含512字节的文件头,其中存储文件加解密所需信息。该头文件大小会计入SHOW BINARY LOGS显示的文件尺寸中。Encrypted列标示二进制日志文件是否已加密。当服务器设置binlog_encryption=ON时,二进制日志加密功能即被激活。若在服务器运行期间启用或停用二进制日志加密,现有二进制日志文件不会随之进行加密或解密转换。
SHOW BINARY LOGS; 等价 SHOW MASTER LOGS;
mysql> SHOW BINARY LOGS; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000004 | 41083 | No | | mysql-bin.000005 | 237 | No | +------------------+-----------+-----------+ 2 rows in set (0.00 sec) mysql> SHOW MASTER LOGS; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000004 | 41083 | No | | mysql-bin.000005 | 237 | No | +------------------+-----------+-----------+ 2 rows in set (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ | mysql-bin.000005 | 2113 | | | 0a77b073-9672-11f0-be88-000c294205fa:1-118, 0d363d72-9672-11f0-bbd9-000c297fcfae:1 | +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
14.查看二进制日志文件事件:
语法如下:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
新增测试数据:
mysql> create table cjc.t3(id int,name varchar(10),time time); Query OK, 0 rows affected (0.01 sec) mysql> insert into cjc.t3 values(1,'x',now()); Query OK, 1 row affected (0.00 sec) mysql> insert into cjc.t3 values(2,'y',now()); Query OK, 1 row affected (0.00 sec) mysql> update cjc.t3 set name='z' where id=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> delete from cjc.t3 where id=3; Query OK, 0 rows affected (0.00 sec) mysql> alter table cjc.t3 add column age int; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> insert into cjc.t3 values(3,'a',now(),100); Query OK, 1 row affected (0.00 sec) mysql> select * from cjc.t3; +------+------+----------+------+ | id | name | time | age | +------+------+----------+------+ | 1 | x | 00:48:25 | NULL | | 2 | z | 00:48:30 | NULL | | 3 | a | 00:49:44 | 100 | +------+------+----------+------+ 3 rows in set (0.00 sec)
查看: 不知道具体binlog file,默认查看的是第一个binlog file;
mysql> show binlog events limit 3; +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | mysql-bin.000004 | 4 | Format_desc | 244101 | 126 | Server ver: 8.0.36, Binlog ver: 4 | | mysql-bin.000004 | 126 | Previous_gtids | 244101 | 237 | 0a77b073-9672-11f0-be88-000c294205fa:1-109, 0d363d72-9672-11f0-bbd9-000c297fcfae:1 | | mysql-bin.000004 | 237 | Gtid | 244101 | 314 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:110' | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)
指定binlog file,查看全部数据:
mysql> show binlog events in "mysql-bin.000005"; +------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | mysql-bin.000005 | 4 | Format_desc | 244101 | 126 | Server ver: 8.0.36, Binlog ver: 4 | | mysql-bin.000005 | 126 | Previous_gtids | 244101 | 237 | 0a77b073-9672-11f0-be88-000c294205fa:1-112, 0d363d72-9672-11f0-bbd9-000c297fcfae:1 | | mysql-bin.000005 | 237 | Gtid | 244101 | 314 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:113' | | mysql-bin.000005 | 314 | Query | 244101 | 459 | use `cjc`; create table cjc.t3(id int,name varchar(10),time time) /* xid=43 */ | | mysql-bin.000005 | 459 | Gtid | 244101 | 538 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:114' | | mysql-bin.000005 | 538 | Query | 244101 | 625 | BEGIN | | mysql-bin.000005 | 625 | Rows_query | 244101 | 687 | # insert into cjc.t3 values(1,'x',now()) | | mysql-bin.000005 | 687 | Table_map | 244101 | 742 | table_id: 204 (cjc.t3) | | mysql-bin.000005 | 742 | Write_rows | 244101 | 787 | table_id: 204 flags: STMT_END_F | | mysql-bin.000005 | 787 | Xid | 244101 | 818 | COMMIT /* xid=44 */ | | mysql-bin.000005 | 818 | Gtid | 244101 | 897 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:115' | | mysql-bin.000005 | 897 | Query | 244101 | 984 | BEGIN | | mysql-bin.000005 | 984 | Rows_query | 244101 | 1046 | # insert into cjc.t3 values(2,'y',now()) | | mysql-bin.000005 | 1046 | Table_map | 244101 | 1101 | table_id: 204 (cjc.t3) | | mysql-bin.000005 | 1101 | Write_rows | 244101 | 1146 | table_id: 204 flags: STMT_END_F | | mysql-bin.000005 | 1146 | Xid | 244101 | 1177 | COMMIT /* xid=45 */ | | mysql-bin.000005 | 1177 | Gtid | 244101 | 1256 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:116' | | mysql-bin.000005 | 1256 | Query | 244101 | 1344 | BEGIN | | mysql-bin.000005 | 1344 | Rows_query | 244101 | 1405 | # update cjc.t3 set name='z' where id=2 | | mysql-bin.000005 | 1405 | Table_map | 244101 | 1460 | table_id: 204 (cjc.t3) | | mysql-bin.000005 | 1460 | Update_rows | 244101 | 1509 | table_id: 204 flags: STMT_END_F | | mysql-bin.000005 | 1509 | Xid | 244101 | 1540 | COMMIT /* xid=46 */ | | mysql-bin.000005 | 1540 | Gtid | 244101 | 1617 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:117' | | mysql-bin.000005 | 1617 | Query | 244101 | 1745 | use `cjc`; alter table cjc.t3 add column age int /* xid=48 */ | | mysql-bin.000005 | 1745 | Gtid | 244101 | 1824 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:118' | | mysql-bin.000005 | 1824 | Query | 244101 | 1911 | BEGIN | | mysql-bin.000005 | 1911 | Rows_query | 244101 | 1977 | # insert into cjc.t3 values(3,'a',now(),100) | | mysql-bin.000005 | 1977 | Table_map | 244101 | 2033 | table_id: 205 (cjc.t3) | | mysql-bin.000005 | 2033 | Write_rows | 244101 | 2082 | table_id: 205 flags: STMT_END_F | | mysql-bin.000005 | 2082 | Xid | 244101 | 2113 | COMMIT /* xid=49 */ | +------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------+ 30 rows in set (0.00 sec)
查看前5行
mysql> show binlog events in "mysql-bin.000005" limit 5; +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ | mysql-bin.000005 | 4 | Format_desc | 244101 | 126 | Server ver: 8.0.36, Binlog ver: 4 | | mysql-bin.000005 | 126 | Previous_gtids | 244101 | 237 | 0a77b073-9672-11f0-be88-000c294205fa:1-112, 0d363d72-9672-11f0-bbd9-000c297fcfae:1 | | mysql-bin.000005 | 237 | Gtid | 244101 | 314 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:113' | | mysql-bin.000005 | 314 | Query | 244101 | 459 | use `cjc`; create table cjc.t3(id int,name varchar(10),time time) /* xid=43 */ | | mysql-bin.000005 | 459 | Gtid | 244101 | 538 | SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:114' | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------+ 5 rows in set (0.00 sec)
查看 POS=1824及以后的所有数据
mysql> show binlog events in "mysql-bin.000005" from 1824; +------------------+------+------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000005 | 1824 | Query | 244101 | 1911 | BEGIN | | mysql-bin.000005 | 1911 | Rows_query | 244101 | 1977 | # insert into cjc.t3 values(3,'a',now(),100) | | mysql-bin.000005 | 1977 | Table_map | 244101 | 2033 | table_id: 205 (cjc.t3) | | mysql-bin.000005 | 2033 | Write_rows | 244101 | 2082 | table_id: 205 flags: STMT_END_F | | mysql-bin.000005 | 2082 | Xid | 244101 | 2113 | COMMIT /* xid=49 */ | +------------------+------+------------+-----------+-------------+----------------------------------------------+ 5 rows in set (0.00 sec)
前两行数据
mysql> show binlog events in "mysql-bin.000005" from 1824 limit 2; +------------------+------+------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000005 | 1824 | Query | 244101 | 1911 | BEGIN | | mysql-bin.000005 | 1911 | Rows_query | 244101 | 1977 | # insert into cjc.t3 values(3,'a',now(),100) | +------------------+------+------------+-----------+-------------+----------------------------------------------+ 2 rows in set (0.00 sec) mysql> show binlog events in "mysql-bin.000005" from 1824 limit 1,2; +------------------+------+------------+-----------+-------------+----------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+------------+-----------+-------------+----------------------------------------------+ | mysql-bin.000005 | 1911 | Rows_query | 244101 | 1977 | # insert into cjc.t3 values(3,'a',now(),100) | | mysql-bin.000005 | 1977 | Table_map | 244101 | 2033 | table_id: 205 (cjc.t3) | +------------------+------+------------+-----------+-------------+----------------------------------------------+ 2 rows in set (0.00 sec)
显示二进制日志中的事件。若未指定’log_name’,则显示第一个二进制日志。 执行SHOW BINLOG EVENTS需要REPLICATION SLAVE权限。 LIMIT子句的语法与SELECT语句相同。 注意:执行不带LIMIT子句的SHOW BINLOG EVENTS可能启动一个非常耗时且占用资源的进程,因为服务器会向客户端返回二进制日志的完整内容(包含服务器执行的所有数据修改语句)。 作为SHOW BINLOG EVENTS的替代方案,可使用mysqlbinlog工具将二进制日志保存到文本文件中供后续检查分析。
15.mysqlbinlog工具查看binlog,恢复数据
使用二进制文件,进行基于时间点/位置点的恢复: point-in-time-recovery 时间点恢复的信息来源是完整备份操作后生成的一组二进制日志文件。因此,要将服务器恢复到某个时间点,必须在其上启用二进制日志记录,这也是 MySQL 8.0 的默认设置。 要从二进制日志恢复数据,必须知道当前二进制日志文件的名称和位置。 默认情况下,服务器在数据目录中创建二进制日志文件,但可以使用 --log-bin 选项指定路径名以将文件放置在不同位置。 要查看所有二进制日志文件的列表,请使用以下语句:
mysql> SHOW BINARY LOGS;
要确定当前二进制日志文件的名称,请发出以下语句:
mysql> SHOW MASTER STATUS;
生成测试数据:
mysql> flush logs; Query OK, 0 rows affected (0.00 sec) mysql> select * from cjc.t3; +------+------+----------+------+ | id | name | time | age | +------+------+----------+------+ | 1 | x | 00:48:25 | NULL | | 2 | z | 00:48:30 | NULL | | 3 | a | 00:49:44 | 100 | +------+------+----------+------+ 3 rows in set (0.00 sec) mysql> insert into cjc.t3 values(4,'y',now(),88); Query OK, 1 row affected (0.00 sec) mysql> insert into cjc.t3 values(5,'c',now(),200); Query OK, 1 row affected (0.00 sec) mysql> SHOW BINARY LOGS; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000004 | 41083 | No | | mysql-bin.000005 | 2160 | No | | mysql-bin.000006 | 972 | No | +------------------+-----------+-----------+ 3 rows in set (0.00 sec) [mysql@cjc-db-01 binlog]$ mysqlbinlog mysql-bin.000006 |more mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'. [mysql@cjc-db-01 binlog]$ mysqlbinlog --no-defaults mysql-bin.000006 |more # The proper term is pseudo_replica_mode, but we use this compatibility alias # to make the statement usable on server versions 8.0.24 and older. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #251013 0:58:59 server id 244101 end_log_pos 126 CRC32 0xdac52574 Start: binlog v 4, server v 8.0.36 created 251013 0:58:59 # Warning: this binlog is either in use or was not closed properly. BINLOG ' U97raA+FuQMAegAAAH4AAAABAAQAOC4wLjM2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYgAEGggAAAAICAgCAAAACgoKKioAEjQA CigAAXQlxdo= '/*!*/; # at 126 #251013 0:58:59 server id 244101 end_log_pos 237 CRC32 0x31431cf8 Previous-GTIDs # 0a77b073-9672-11f0-be88-000c294205fa:1-118, # 0d363d72-9672-11f0-bbd9-000c297fcfae:1 # at 237 #251013 0:59:26 server id 244101 end_log_pos 316 CRC32 0xa2f5d857 GTID last_committed=0 sequence_number=1 rbr_only=yes original_committed_timestamp=176028 8366942294 immediate_commit_timestamp=1760288366942294 transaction_length=367 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1760288366942294 (2025-10-13 00:59:26.942294 CST) # immediate_commit_timestamp=1760288366942294 (2025-10-13 00:59:26.942294 CST) /*!80001 SET @@session.original_commit_timestamp=1760288366942294*//*!*/; /*!80014 SET @@session.original_server_version=80036*//*!*/; /*!80014 SET @@session.immediate_server_version=80036*//*!*/; SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:119'/*!*/; # at 316 #251013 0:59:26 server id 244101 end_log_pos 403 CRC32 0xda2f2041 Query thread_id=15 exec_time=0 error_code=0 SET TIMESTAMP=1760288366/*!*/; SET @@session.pseudo_thread_id=15/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1306525696/*!*/; SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/*!*/; SET @@session.time_zone='SYSTEM'/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; /*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/; BEGIN /*!*/; # at 403 # at 468 #251013 0:59:26 server id 244101 end_log_pos 524 CRC32 0x5a66bc38 Table_map: `cjc`.`t3` mapped to number 205 # has_generated_invisible_primary_key=0 # at 524 #251013 0:59:26 server id 244101 end_log_pos 573 CRC32 0x7723d46a Write_rows: table id 205 flags: STMT_END_F BINLOG ' bt7raBOFuQMAOAAAAAwCAAAAAM0AAAAAAAEAA2NqYwACdDMABAMPEwMDKAAADwEBAAIBLTi8Zlo= bt7raB6FuQMAMQAAAD0CAAAAAM0AAAAAAAEAAgAE/wAEAAAAAXmADtpYAAAAatQjdw== '/*!*/; # at 573 #251013 0:59:26 server id 244101 end_log_pos 604 CRC32 0x3d1d5804 Xid = 70 COMMIT/*!*/; # at 604 #251013 0:59:37 server id 244101 end_log_pos 683 CRC32 0x43470348 GTID last_committed=1 sequence_number=2 rbr_only=yes original_committed_timestamp=176028 8377915129 immediate_commit_timestamp=1760288377915129 transaction_length=368 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1760288377915129 (2025-10-13 00:59:37.915129 CST) # immediate_commit_timestamp=1760288377915129 (2025-10-13 00:59:37.915129 CST) /*!80001 SET @@session.original_commit_timestamp=1760288377915129*//*!*/; /*!80014 SET @@session.original_server_version=80036*//*!*/; /*!80014 SET @@session.immediate_server_version=80036*//*!*/; SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:120'/*!*/; # at 683 #251013 0:59:37 server id 244101 end_log_pos 770 CRC32 0x7a06acc0 Query thread_id=15 exec_time=0 error_code=0 SET TIMESTAMP=1760288377/*!*/; BEGIN /*!*/; # at 770 # at 836 #251013 0:59:37 server id 244101 end_log_pos 892 CRC32 0xa182214f Table_map: `cjc`.`t3` mapped to number 205 # has_generated_invisible_primary_key=0 # at 892 #251013 0:59:37 server id 244101 end_log_pos 941 CRC32 0xc54669a7 Write_rows: table id 205 flags: STMT_END_F BINLOG ' ed7raBOFuQMAOAAAAHwDAAAAAM0AAAAAAAEAA2NqYwACdDMABAMPEwMDKAAADwEBAAIBLU8hgqE= ed7raB6FuQMAMQAAAK0DAAAAAM0AAAAAAAEAAgAE/wAFAAAAAWOADuXIAAAAp2lGxQ== '/*!*/; # at 941 #251013 0:59:37 server id 244101 end_log_pos 972 CRC32 0x4541bf42 Xid = 71 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*/;
添加参数: -vv(–verbose --verbose) 详细输出,显示每行数据的变更 –base64-output=decode-rows 解码 ROW 格式中的二进制数据
[mysql@cjc-db-01 binlog]$ mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql-bin.000006 |more # The proper term is pseudo_replica_mode, but we use this compatibility alias # to make the statement usable on server versions 8.0.24 and older. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #251013 0:58:59 server id 244101 end_log_pos 126 CRC32 0xdac52574 Start: binlog v 4, server v 8.0.36 created 251013 0:58:59 # Warning: this binlog is either in use or was not closed properly. # at 126 #251013 0:58:59 server id 244101 end_log_pos 237 CRC32 0x31431cf8 Previous-GTIDs # 0a77b073-9672-11f0-be88-000c294205fa:1-118, # 0d363d72-9672-11f0-bbd9-000c297fcfae:1 # at 237 #251013 0:59:26 server id 244101 end_log_pos 316 CRC32 0xa2f5d857 GTID last_committed=0 sequence_number=1 rbr_only=yes original_committed_timestamp=176028 8366942294 immediate_commit_timestamp=1760288366942294 transaction_length=367 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1760288366942294 (2025-10-13 00:59:26.942294 CST) # immediate_commit_timestamp=1760288366942294 (2025-10-13 00:59:26.942294 CST) /*!80001 SET @@session.original_commit_timestamp=1760288366942294*//*!*/; /*!80014 SET @@session.original_server_version=80036*//*!*/; /*!80014 SET @@session.immediate_server_version=80036*//*!*/; SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:119'/*!*/; # at 316 #251013 0:59:26 server id 244101 end_log_pos 403 CRC32 0xda2f2041 Query thread_id=15 exec_time=0 error_code=0 SET TIMESTAMP=1760288366/*!*/; SET @@session.pseudo_thread_id=15/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1306525696/*!*/; SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/*!*/; SET @@session.time_zone='SYSTEM'/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; /*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/; BEGIN /*!*/; # at 403 #251013 0:59:26 server id 244101 end_log_pos 468 CRC32 0x70307d0e Rows_query # insert into cjc.t3 values(4,'y',now(),88) # at 468 #251013 0:59:26 server id 244101 end_log_pos 524 CRC32 0x5a66bc38 Table_map: `cjc`.`t3` mapped to number 205 # has_generated_invisible_primary_key=0 # at 524 #251013 0:59:26 server id 244101 end_log_pos 573 CRC32 0x7723d46a Write_rows: table id 205 flags: STMT_END_F ### INSERT INTO `cjc`.`t3` ### SET ### @1=4 /* INT meta=0 nullable=1 is_null=0 */ ### @2='y' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */ ### @3='00:59:26' /* TIME(0) meta=0 nullable=1 is_null=0 */ ### @4=88 /* INT meta=0 nullable=1 is_null=0 */ # at 573 #251013 0:59:26 server id 244101 end_log_pos 604 CRC32 0x3d1d5804 Xid = 70 COMMIT/*!*/; # at 604 #251013 0:59:37 server id 244101 end_log_pos 683 CRC32 0x43470348 GTID last_committed=1 sequence_number=2 rbr_only=yes original_committed_timestamp=176028 8377915129 immediate_commit_timestamp=1760288377915129 transaction_length=368 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1760288377915129 (2025-10-13 00:59:37.915129 CST) # immediate_commit_timestamp=1760288377915129 (2025-10-13 00:59:37.915129 CST) /*!80001 SET @@session.original_commit_timestamp=1760288377915129*//*!*/; /*!80014 SET @@session.original_server_version=80036*//*!*/; /*!80014 SET @@session.immediate_server_version=80036*//*!*/; SET @@SESSION.GTID_NEXT= '0a77b073-9672-11f0-be88-000c294205fa:120'/*!*/; # at 683 #251013 0:59:37 server id 244101 end_log_pos 770 CRC32 0x7a06acc0 Query thread_id=15 exec_time=0 error_code=0 SET TIMESTAMP=1760288377/*!*/; BEGIN /*!*/; # at 770 #251013 0:59:37 server id 244101 end_log_pos 836 CRC32 0x147f904a Rows_query # insert into cjc.t3 values(5,'c',now(),200) # at 836 #251013 0:59:37 server id 244101 end_log_pos 892 CRC32 0xa182214f Table_map: `cjc`.`t3` mapped to number 205 # has_generated_invisible_primary_key=0 # at 892 #251013 0:59:37 server id 244101 end_log_pos 941 CRC32 0xc54669a7 Write_rows: table id 205 flags: STMT_END_F ### INSERT INTO `cjc`.`t3` ### SET ### @1=5 /* INT meta=0 nullable=1 is_null=0 */ ### @2='c' /* VARSTRING(40) meta=40 nullable=1 is_null=0 */ ### @3='00:59:37' /* TIME(0) meta=0 nullable=1 is_null=0 */ ### @4=200 /* INT meta=0 nullable=1 is_null=0 */ # at 941 #251013 0:59:37 server id 244101 end_log_pos 972 CRC32 0x4541bf42 Xid = 71 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*/;
也可以导出到文件:
mysqlbinlog --no-defaults -vv --base64-output=decode-rows -d cjc mysql-bin.000006 > 2.sql
mysqlbinlog 实用程序将二进制日志文件中的事件从二进制格式转换为文本,以便查看或应用。mysqlbinlog 提供了基于事件时间或事件在日志中的位置来选择二进制日志片段的选项。 应用二进制日志中的事件会导致它们所代表的数据修改被重新执行。这使得可以恢复特定时间段内的数据更改。 要应用二进制日志中的事件,请使用 mysql 客户端处理 mysqlbinlog 的输出:
$> mysqlbinlog binlog_files | mysql -u root -p
导入:
[mysql@cjc-db-01 binlog]$ mysqlbinlog --no-defaults --skip-gtids mysql-bin.000006 | mysql -u root -p Enter password: [mysql@cjc-db-01 binlog]$
检查数据,多了两条
mysql> select * from cjc.t3; +------+------+----------+------+ | id | name | time | age | +------+------+----------+------+ | 1 | x | 00:48:25 | NULL | | 2 | z | 00:48:30 | NULL | | 3 | a | 00:49:44 | 100 | | 4 | y | 00:59:26 | 88 | | 5 | c | 00:59:37 | 200 | | 4 | y | 00:59:26 | 88 | | 5 | c | 00:59:37 | 200 | +------+------+----------+------+ 7 rows in set (0.00 sec)
如果二进制日志文件已加密(从 MySQL 8.0.14 开始支持),mysqlbinlog 无法像上例那样直接读取它们,但可以使用 --read-from-remote-server (-R) 选项从服务器读取。例如
$> mysqlbinlog --read-from-remote-server --host=host_name --port=3306 --user=root --password --ssl-mode=required binlog_files | mysql -u root -p
此处使用了 --ssl-mode=required 选项以确保二进制日志文件数据在传输过程中受到保护,因为它是以未加密格式发送给 mysqlbinlog 的。当需要确定事件时间或位置以便在执行事件之前选择部分日志内容时,查看日志内容会很有用。要查看日志中的事件,请将 mysqlbinlog 输出发送到分页程序:
$> mysqlbinlog binlog_files | more
或者,将输出保存到文件中并在文本编辑器中查看该文件:
$> mysqlbinlog binlog_files > tmpfile $> ... 编辑 tmpfile ...
编辑文件后,按以下方式应用内容:
$> mysql -u root -p < tmpfile
如果您有多个二进制日志要在 MySQL 服务器上应用,请使用单个连接来应用要处理的所有二进制日志文件的内容。一种方法如下:
$> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
另一种方法是将整个日志写入单个文件,然后处理该文件:
$> mysqlbinlog binlog.000001 > /tmp/statements.sql $> mysqlbinlog binlog.000002 >> /tmp/statements.sql $> mysql -u root -p -e "source /tmp/statements.sql"
使用二进制文件,进行基于位置点的恢复: Point-in-Time Recovery Using Event Positions 例如,假设在2020年3月11日大约20:06:00执行了一条删除表的SQL语句。 您可以执行时间点恢复,将服务器恢复到表删除之前的状态。 以下是实现此目标的一些示例步骤:恢复在目标时间点(在我们的示例中称为 tp,即2020年3月11日20:06:00)之前创建的最后一个完整备份。 完成后,记下您已恢复服务器所对应的二进制日志位置,以备后续使用,然后重启服务器。注意: 虽然恢复并重启服务器后,InnoDB也会显示最后恢复的二进制日志位置,但这不是获取恢复结束日志位置的可靠方法,因为在显示位置所反映的时间之后可能发生了DDL事件和非InnoDB更改。 您的备份和恢复工具应为您提供恢复所需的最后二进制日志位置: 例如,如果您使用 mysqlbinlog 执行此任务,请检查二进制日志回放的停止位置; 如果您使用 MySQL Enterprise Backup,最后一个二进制日志位置已保存在您的备份中。参见时间点恢复。找到与您希望恢复数据库的目标时间点相对应的精确二进制日志事件位置。 在我们的示例中,鉴于我们知道发生表删除的大致时间(tp),我们可以使用 mysqlbinlog 实用程序检查该时间前后的日志内容来找到日志位置。 使用 --start-datetime 和 --stop-datetime 选项指定 tp 前后的一个短时间段,然后在输出中查找事件。例如:
$> mysqlbinlog --start-datetime="2020-03-11 20:05:00" \ --stop-datetime="2020-03-11 20:08:00" --verbose \ /var/lib/mysql/bin.123456 | grep -C 15 "DROP TABLE"
/*!80014 SET @@session.original_server_version=80019*//*!*/; /*!80014 SET @@session.immediate_server_version=80019*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 232 #200311 20:06:20 server id 1 end_log_pos 355 CRC32 0x2fc1e5ea Query thread_id=16 exec_time=0 error_code=0 SET TIMESTAMP=1583971580/*!*/; SET @@session.pseudo_thread_id=16/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1168113696/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; /*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/; DROP TABLE `pets`.`cats` /* generated by server */ /*!*/; # at 355 #200311 20:07:48 server id 1 end_log_pos 434 CRC32 0x123d65df Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no original_committed_timestamp=1583971668462467 immediate_commit_timestamp=1583971668462467 transaction_length=473 # original_commit_timestamp=1583971668462467 (2020-03-11 20:07:48.462467 EDT) # immediate_commit_timestamp=1583971668462467 (2020-03-11 20:07:48.462467 EDT) /*!80001 SET @@session.original_commit_timestamp=1583971668462467*//*!*/; /*!80014 SET @@session.original_server_version=80019*//*!*/; /*!80014 SET @@session.immediate_server_version=80019*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 434 #200311 20:07:48 server id 1 end_log_pos 828 CRC32 0x57fac9ac Query thread_id=16 exec_time=0 error_code=0 Xid = 217 use `pets`/*!*/; SET TIMESTAMP=1583971668/*!*/; /*!80013 SET @@session.sql_require_primary_key=0*//*!*/; CREATE TABLE dogs
从 mysqlbinlog 的输出中,可以在二进制日志的 # at 232 到 # at 355 之间的区段找到 DROP TABLEpets.cats`` 语句,这意味着该语句在日志位置232之后执行,并且在 DROP TABLE 语句之后日志位于位置355。注意: 仅使用 --start-datetime 和 --stop-datetime 选项来帮助您查找实际感兴趣的事件位置。 不建议使用这两个选项来指定要应用的二进制日志片段范围: 使用这些选项时有更高的遗漏二进制日志事件的风险。请改用 --start-position 和 --stop-position。将二进制日志文件中的事件应用到服务器,从您在步骤1中找到的日志位置(假设为155)开始,到您在步骤2中找到的位于您感兴趣的时间点(tp)之前的位置(即232)结束:
$> mysqlbinlog --start-position=155 --stop-position=232 /var/lib/mysql/bin.123456 \ | mysql -u root -p
此命令恢复从起始位置直到停止位置之前的所有事务。 由于 mysqlbinlog 的输出在每个记录的SQL语句之前包含 SET TIMESTAMP 语句,因此恢复的数据和相关的MySQL日志反映了事务执行的原始时间。 现在,您的数据库已恢复到感兴趣的时间点 tp,即刚删除 pets.cats 表之前的状态。 在已完成的时间点恢复之外,如果您还想重新执行感兴趣时间点之后的所有语句,请再次使用 mysqlbinlog 将 tp 之后的所有事件应用到服务器。 我们在步骤2中注意到,在我们希望跳过的语句之后,日志位于位置355;我们可以将其用于 --start-position 选项,以便包含该位置之后的所有语句:
$> mysqlbinlog --start-position=355 /var/lib/mysql/bin.123456 \ | mysql -u root -p
您的数据库现已恢复到二进制日志文件中记录的最新语句,但跳过了选定的事件。mysqlbinlog参数列表:

16.清理binlog
二进制日志是一组记录MySQL服务器数据修改信息的文件。该日志由一组二进制日志文件及一个索引文件组成。 PURGE BINARY LOGS语句可删除指定日志文件名或日期之前列于日志索引文件中的所有二进制日志文件。BINARY和MASTER是同义词。被删除的日志文件同时会从索引文件记录的列表中移除,从而使指定日志文件成为列表中的首项。 执行PURGE BINARY LOGS需要BINLOG_ADMIN权限。若服务器启动时未启用–log-bin选项来开启二进制日志记录,则该语句不会产生任何效果。 语法如下:
PURGE { BINARY | MASTER } LOGS {
TO 'log_name'
| BEFORE datetime_expr
}
查看:
mysql> show binary logs; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000004 | 41083 | No | | mysql-bin.000005 | 2160 | No | | mysql-bin.000006 | 1989 | No | | mysql-bin.000007 | 284 | No | | mysql-bin.000008 | 284 | No | | mysql-bin.000009 | 284 | No | | mysql-bin.000010 | 284 | No | | mysql-bin.000011 | 284 | No | | mysql-bin.000012 | 284 | No | | mysql-bin.000013 | 284 | No | | mysql-bin.000014 | 284 | No | | mysql-bin.000015 | 237 | No | +------------------+-----------+-----------+ 12 rows in set (0.00 sec)
清理到某个binlog file(不包括指定的这个二进制文件):
mysql> PURGE BINARY LOGS TO 'mysql-bin.000006'; Query OK, 0 rows affected (0.00 sec) mysql> show binary logs; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000006 | 1989 | No | | mysql-bin.000007 | 284 | No | | mysql-bin.000008 | 284 | No | | mysql-bin.000009 | 284 | No | | mysql-bin.000010 | 284 | No | | mysql-bin.000011 | 284 | No | | mysql-bin.000012 | 284 | No | | mysql-bin.000013 | 284 | No | | mysql-bin.000014 | 284 | No | | mysql-bin.000015 | 237 | No | +------------------+-----------+-----------+ 10 rows in set (0.00 sec)
删除某个时间点之前的文件(包含指定的时间点)
[mysql@cjc-db-01 binlog]$ ls -lrth total 72K ...... -rw-r----- 1 mysql mysql 2.0K Oct 13 02:33 mysql-bin.000006 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000007 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000008 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000009 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000010 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000011 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000012 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000013 -rw-r----- 1 mysql mysql 284 Oct 13 02:33 mysql-bin.000014 -rw-r----- 1 mysql mysql 284 Oct 13 02:37 mysql-bin.000015 -rw-r----- 1 mysql mysql 284 Oct 13 02:37 mysql-bin.000016 -rw-r----- 1 mysql mysql 284 Oct 13 02:38 mysql-bin.000017 -rw-r----- 1 mysql mysql 237 Oct 13 02:38 mysql-bin.000018 -rw-r----- 1 mysql mysql 533 Oct 13 02:38 mysql-bin.index mysql> PURGE BINARY LOGS BEFORE '2025-10-13 02:37:00'; Query OK, 0 rows affected (0.00 sec) mysql> show binary logs; +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000015 | 284 | No | | mysql-bin.000016 | 284 | No | | mysql-bin.000017 | 284 | No | | mysql-bin.000018 | 237 | No | +------------------+-----------+-----------+ 4 rows in set (0.00 sec)
参考:
https://dev.mysql.com/doc/refman/8.0/en/show-binary-logs.html https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html https://dev.mysql.com/doc/refman/8.0/en/show-binlog-events.html https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery-binlog.html
欢迎关注我的公众号《 IT小Chen》
