Documentation Home
MySQL 8.0 参考手册  / 第 4 章 MySQL 程序  / 4.6 管理和实用程序  /  4.6.9 mysqlbinlog — 处理二进制日志文件的实用程序

4.6.9 mysqlbinlog — 处理二进制日志文件的实用程序

服务器的二进制日志由包含描述数据库内容修改的事件 的文件组成 。服务器以二进制格式写入这些文件。要以文本格式显示它们的内容,请使用 mysqlbinlog实用程序。您还可以使用 mysqlbinlog来显示复制设置中副本服务器写入的中继日志文件的内容,因为中继日志与二进制日志具有相同的格式。二进制日志和中继日志将在 第 5.4.4 节“二进制日志”第 17.2.4 节“中继日志和复制元数据存储库”中进一步讨论。

像这样调用mysqlbinlog

mysqlbinlog [options] log_file ...

例如,要显示名为 的二进制日志文件的内容binlog.000003,请使用以下命令:

mysqlbinlog binlog.000003

输出包括 中包含的事件 binlog.000003。对于基于语句的日志记录,事件信息包括 SQL 语句、执行它的服务器的 ID、语句执行时的时间戳、花费的时间等等。对于基于行的日志记录,事件指示行更改而不是 SQL 语句。有关日志记录模式的信息 ,请参阅第 17.2.1 节,“复制格式” 。

事件前面有提供附加信息的标题注释。例如:

# at 141
#100309  9:28:36 server id 123  end_log_pos 245
  Query thread_id=3350  exec_time=11  error_code=0

在第一行中,后面的数字at 表示二进制日志文件中事件的文件偏移量或起始位置。

第二行以日期和时间开头,指示语句何时在事件发起的服务器上开始。对于复制,此时间戳会传播到副本服务器。 server idserver_id事件发生的服务器的值。end_log_pos 表示下一个事件的开始位置(即当前事件的结束位置+1)。thread_id 指示哪个线程执行了事件。 exec_time是在复制源服务器上执行事件所花费的时间。在副本上,它是副本上的结束执行时间减去源上的开始执行时间的差值。差异用作复制落后于源多少的指标。 error_code指示执行事件的结果。零意味着没有错误发生。

笔记

使用事件组时,可以将事件的文件偏移量组合在一起,将事件的注释组合在一起。不要将这些分组事件误认为是空白文件偏移量。

可以重新执行 mysqlbinlog 的输出(例如,将其用作mysql的输入)以重做日志中的语句。这对于服务器意外退出后的恢复操作很有用。对于其他使用示例,请参阅本节后面的讨论和第 7.5 节“时间点(增量)恢复”。要执行 mysqlbinlogBINLOG使用的内部使用语句 ,用户需要 特权(或已弃用的特权),或特权加上执行每个日志事件的适当特权。 BINLOG_ADMINSUPERREPLICATION_APPLIER

您可以使用mysqlbinlog直接读取二进制日志文件并将其应用到本地 MySQL 服务器。您还可以使用该 --read-from-remote-server 选项从远程服务器读取二进制日志。要读取远程二进制日志,可以提供连接参数选项以指示如何连接到服务器。这些选项是--host--password--port--protocol--socket--user

当二进制日志文件被加密时,可以从 MySQL 8.0.14 开始完成,mysqlbinlog不能直接读取它们,但可以使用 --read-from-remote-server 选项从服务器读取它们。binlog_encryption当服务器的系统变量设置为时,二进制日志文件被加密 ON。该 SHOW BINARY LOGS语句显示特定的二进制日志文件是加密的还是未加密的。加密和未加密的二进制日志文件也可以使用加密日志文件文件头开头的幻数 ( ) 来区分0xFD62696E,这不同于用于未加密日志文件 ( 0xFE62696E) 的幻数。请注意,从 MySQL 8.0.14 开始, mysqlbinlog如果您尝试直接读取加密的二进制日志文件,则返回一个合适的错误,但旧版本的mysqlbinlog根本不将该文件识别为二进制日志文件。有关二进制日志加密的更多信息,请参阅 第 17.3.2 节,“加密二进制日志文件和中继日志文件”

当二进制日志事务有效载荷被压缩时,这可以从 MySQL 8.0.20 开始完成, 该版本的mysqlbinlog版本自动解压缩和解码事务有效载荷,并像未压缩的事件一样打印它们。旧版本的mysqlbinlog无法读取压缩的事务负载。当服务器的 binlog_transaction_compression 系统变量设置为 时ON,事务负载被压缩,然后作为单个事件 (a) 写入服务器的二进制日志文件 Transaction_payload_event。使用 --verbose选项, mysqlbinlog添加注释说明所使用的压缩算法、最初收到的压缩负载大小以及解压缩后生成的负载大小。

笔记

mysqlbinlog为作为压缩事务负载一部分的单个事件声明 的结束位置 ( end_log_pos) 与原始压缩负载的结束位置相同。因此,多个解压缩事件可以具有相同的结束位置。

如果事务有效负载已经压缩,则 mysqlbinlog自己的连接压缩会减少,但仍对未压缩的事务和标头进行操作。

有关二进制日志事务压缩的更多信息,请参阅 第 5.4.4.5 节,“二进制日志事务压缩”

当针对大型二进制日志运行mysqlbinlog时,请注意文件系统有足够的空间用于生成的文件。要配置 mysqlbinlog用于临时文件的目录,请使用 TMPDIR环境变量。

mysqlbinlog在执行任何 SQL 语句之前pseudo_replica_modeor 的值设置 pseudo_slave_mode此系统变量影响 XA 事务的处理、 original_commit_timestamp复制延迟时间戳和 original_server_version系统变量,以及不支持的 SQL 模式。

mysqlbinlog支持以下选项,可以在命令行或 选项文件的组中指定[mysqlbinlog][client]有关 MySQL 程序使用的选项文件的信息,请参阅第 4.2.2.2 节,“使用选项文件”

表 4.22 mysqlbinlog 选项

选项名称 描述 介绍 弃用
--base64-输出 使用 base-64 编码打印二进制日志条目
--绑定地址 使用指定的网络接口连接到 MySQL 服务器
--binlog-row-event-max-size 二进制日志最大事件大小
--字符集目录 安装字符集的目录
- 压缩 压缩客户端和服务器之间发送的所有信息 8.0.17 8.0.18
--压缩算法 允许的服务器连接压缩算法 8.0.18
--connection-server-id 用于测试和调试。有关适用的默认值和其他详细信息,请参阅文本
- 数据库 仅列出该数据库的条目
--调试 写调试日志
--调试检查 程序退出时打印调试信息
- 调试信息 程序退出时打印调试信息、内存和 CPU 统计信息
--default-auth 要使用的身份验证插件
--defaults-extra-file 除了通常的选项文件外,还读取命名的选项文件
--defaults-文件 只读命名选项文件
--defaults-group-suffix 选项组后缀值
--disable-log-bin 禁用二进制日志记录
--exclude-gtids 不要显示提供的 GTID 集中的任何组
--force-if-open 读取二进制日志文件,即使打开或未正确关闭
--强制阅读 如果 mysqlbinlog 读取了一个它无法识别的二进制日志事件,它会打印一条警告
--get-server-public-key 从服务器请求 RSA 公钥
- 帮助 显示帮助信息并退出
--hexdump 在评论中显示日志的十六进制转储
- 主持人 MySQL 服务器所在的主机
--幂等 使服务器在仅处理来自该会话的二进制日志更新时使用幂等模式
--include-gtids 仅显示提供的 GTID 集中的组
--local-load 在指定目录下为LOAD DATA准备本地临时文件
--登录路径 从 .mylogin.cnf 读取登录路径选项
--no-defaults 不读取选项文件
- 抵消 跳过日志中的前 N ​​个条目
- 密码 连接到服务器时使用的密码
--插件目录 安装插件的目录
- 港口 用于连接的 TCP/IP 端口号
--print-defaults 打印默认选项
--打印表元数据 打印表元数据
- 协议 使用的传输协议
- 生的 以原始(二进制)格式将事件写入输出文件
--从远程主机读取 从 MySQL 复制源服务器读取二进制日志而不是读取本地日志文件 8.0.26
--从远程服务器读取 从 MySQL 服务器读取二进制日志而不是本地日志文件
--read-from-remote-source 从 MySQL 复制源服务器读取二进制日志而不是读取本地日志文件 8.0.26
--require-行格式 需要基于行的二进制日志记录格式 8.0.19
--结果文件 直接输出到命名文件
--rewrite-db 从以基于行的格式编写的日志回放时,为数据库创建重写规则。可以多次使用
--server-id 仅提取由具有给定服务器 ID 的服务器创建的那些事件
--server-id-bits 告诉 mysqlbinlog 当 log 由 server-id-bits 设置为小于最大值的 mysqld 写入时如何解释二进制日志中的服务器 ID;仅由 mysqlbinlog 的 MySQL Cluster 版本支持
--server-public-key-path 包含 RSA 公钥的文件的路径名
--set-字符集 将 SET NAMES charset_name 语句添加到输出
--shared-memory-base-name 共享内存连接的共享内存名称(仅限 Windows)
- 简写 只显示日志中包含的语句
--skip-gtids 不要在输出转储文件中包含二进制日志文件中的 GTID
- 插座 要使用的 Unix 套接字文件或 Windows 命名管道
--ssl-ca 包含可信 SSL 证书颁发机构列表的文件
--ssl-capath 包含受信任的 SSL 证书颁发机构证书文件的目录
--ssl证书 包含 X.509 证书的文件
--ssl密码 连接加密的允许密码
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl-fips-模式 客户端是否开启FIPS模式
--ssl-密钥 包含 X.509 密钥的文件
--ssl模式 连接到服务器的所需安全状态
--ssl 会话数据 包含 SSL 会话数据的文件 8.0.29
--ssl-session-data-continue-on-failed-reuse session重用失败是否建立连接 8.0.29
--开始日期时间 从时间戳等于或晚于 datetime 参数的第一个事件读取二进制日志
--起始位置 从位置等于或大于参数的第一个事件解码二进制日志
--停止日期时间 在时间戳等于或大于 datetime 参数的第一个事件停止读取二进制日志
--永不停止 读取最后一个二进制日志文件后保持与服务器的连接
--stop-never-slave-server-id 连接到服务器时要报告的从属服务器 ID
--停止位置 在位置等于或大于参数的第一个事件处停止解码二进制日志
--tls-密码套件 用于加密连接的允许的 TLSv1.3 密码套件 8.0.16
--tls-版本 加密连接允许的 TLS 协议
--to-last-日志 不要在 MySQL 服务器请求的二进制日志末尾停止,而是继续打印到最后一个二进制日志的末尾
- 用户 连接到服务器时使用的 MySQL 用户名
--冗长 将行事件重构为 SQL 语句
--verify-binlog-校验和 验证二进制日志中的校验和
- 版本 显示版本信息并退出
--zstd-压缩级别 使用 zstd 压缩的服务器连接的压缩级别 8.0.18

您可以将mysqlbinlog 的输出通过管道传输到mysql客户端,以执行二进制日志中包含的事件。当您有旧备份时,此技术用于从意外退出中恢复(请参阅 第 7.5 节,“时间点(增量)恢复”)。例如:

mysqlbinlog binlog.000001 | mysql -u root -p

或者:

mysqlbinlog binlog.[0-9]* | mysql -u root -p

如果mysqlbinlog 产生的语句可能包含BLOB值,这些可能会导致mysql处理它们时出现问题。在这种情况下,使用 选项 调用mysql 。--binary-mode

如果您需要先修改语句日志(例如,删除出于某种原因不想执行的语句),您也可以将mysqlbinlog 的输出重定向 到文本文件。编辑文件后,通过将其用作mysql程序 的输入来执行其中包含的语句:

mysqlbinlog binlog.000001 > tmpfile
... edit tmpfile ...
mysql -u root -p < tmpfile

当使用该选项调用 mysqlbinlog--start-position时,它仅显示二进制日志中偏移量大于或等于给定位置的那些事件(给定位置必须与一个事件的开始匹配)。它还具有在看到具有给定日期和时间的事件时停止和开始的选项。这使您能够使用选项执行时间点恢复 --stop-datetime(例如,可以说将我的数据库前滚到今天上午 10:30 的状态)。

处理多个文件。  如果要在 MySQL 服务器上执行多个二进制日志,安全的方法是使用到服务器的单个连接来处理它们。这是一个演示可能不安全的示例:

mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

CREATE TEMPORARY TABLE如果第一个日志文件包含一个语句而第二个日志包含一个使用临时表的语句,那么使用与 服务器的多个连接以这种方式处理二进制日志会导致问题 。当第一个 mysql进程终止时,服务器会删除临时表。当第二个mysql 进程尝试使用该表时,服务器报告 未知表。

为避免此类问题,请使用单个 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"

从 MySQL 8.0.12 开始,您还可以使用 shell 管道将多个二进制日志文件作为流式输入提供给mysqlbinlog 。压缩二进制日志文件的存档可以解压缩并直接提供给 mysqlbinlog。在本例中, binlog-files_1.gz包含多个二进制日志文件进行处理。管道提取 的内容 binlog-files_1.gz,将二进制日志文件通过管道传输到mysqlbinlog作为标准输入,并将mysqlbinlog的输出通过管道传输到 mysql客户端执行:

gzip -cd binlog-files_1.gz | ./mysqlbinlog - | ./mysql -uroot  -p

您可以指定多个归档文件,例如:

gzip -cd binlog-files_1.gz binlog-files_2.gz | ./mysqlbinlog - | ./mysql -uroot  -p

对于流式输入,不要使用 --stop-position,因为 mysqlbinlog无法识别应用此选项的最后一个日志文件。

加载数据操作。  mysqlbinlog可以产生在LOAD DATA 没有原始数据文件的情况下重现操作的输出。 mysqlbinlog将数据复制到临时文件并写入 LOAD DATA LOCAL引用该文件的语句。写入这些文件的目录的默认位置是系统特定的。要明确指定目录,请使用该 --local-load选项。

由于mysqlbinlogLOAD DATA语句转换为 LOAD DATA LOCAL语句(即添加 LOCAL),因此您用于处理语句的客户端和服务器都必须配置为启用该 LOCAL功能。请参阅 第 6.1.6 节,“LOAD DATA LOCAL 的安全注意事项”

警告

LOAD DATA LOCAL为语句 创建的临时文件 不会 自动删除,因为在您实际执行这些语句之前需要它们。不再需要语句日志后,您应该自行删除临时文件。这些文件可以在临时文件目录中找到,名称类似于 original_file_name-#-#.