服务器的二进制日志由包含描述数据库内容修改的“事件”的文件组成。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 mysqlbinlog 实用程序。您还可以使用 mysqlbinlog 显示复制设置中副本服务器写入的中继日志文件的内容,因为中继日志的格式与二进制日志相同。二进制日志和中继日志在 第 7.4.4 节“二进制日志” 和 第 19.2.4 节“中继日志和复制元数据存储库” 中有更详细的讨论。
像这样调用 mysqlbinlog
mysqlbinlog [options] log_file ...
例如,要显示名为 binlog.000003
的二进制日志文件的内容,请使用以下命令
mysqlbinlog binlog.000003
输出包括 binlog.000003
中包含的事件。对于基于语句的日志记录,事件信息包括 SQL 语句、执行该语句的服务器的 ID、执行该语句的时间戳、花费的时间等等。对于基于行的日志记录,事件指示行更改而不是 SQL 语句。有关日志记录模式的信息,请参阅 第 19.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
后面的数字表示二进制日志文件中事件的文件偏移量或起始位置。
第二行以日期和时间开头,表示语句在事件 originating 的服务器上开始的时间。对于复制,此时间戳会传播到副本服务器。server id
是事件 originating 的服务器的 server_id
值。end_log_pos
表示下一个事件的开始位置(即,它是当前事件的结束位置 + 1)。thread_id
表示执行事件的线程。exec_time
是在复制源服务器上执行事件所花费的时间。在副本上,它是副本上的结束执行时间减去源上的开始执行时间的差值。该差值可作为复制落后于源的程度的指标。error_code
表示执行事件的结果。零表示没有发生错误。
使用事件组时,事件的文件偏移量可能会组合在一起,事件的注释也可能会组合在一起。不要将这些组合的事件误认为是空白文件偏移量。
mysqlbinlog 的输出可以重新执行(例如,通过将其用作 mysql 的输入)以重做日志中的语句。这在服务器意外退出后对恢复操作很有用。有关其他使用示例,请参阅本节后面和 第 9.5 节“时间点(增量)恢复” 中的讨论。要执行 mysqlbinlog 使用的内部使用 BINLOG
语句,用户需要 BINLOG_ADMIN
权限(或已弃用的 SUPER
权限)或 REPLICATION_APPLIER
权限以及执行每个日志事件的适当权限。
您可以使用 mysqlbinlog 直接读取二进制日志文件并将它们应用于本地 MySQL 服务器。您还可以使用 --read-from-remote-server
选项从远程服务器读取二进制日志。要读取远程二进制日志,可以提供连接参数选项以指示如何连接到服务器。这些选项是 --host
、--password
、--port
、--protocol
、--socket
和 --user
。
当二进制日志文件已加密时,mysqlbinlog 无法直接读取它们,但可以使用 --read-from-remote-server
选项从服务器读取它们。当服务器的 binlog_encryption
系统变量设置为 ON
时,二进制日志文件将被加密。SHOW BINARY LOGS
语句显示特定二进制日志文件是加密的还是未加密的。加密和未加密的二进制日志文件也可以使用加密日志文件的文件头开头的魔术数字 (0xFD62696E
) 来区分,该数字与未加密日志文件使用的魔术数字 (0xFE62696E
) 不同。请注意,如果您尝试直接读取加密的二进制日志文件,mysqlbinlog 会返回一个合适的错误,但旧版本的 mysqlbinlog 根本无法将该文件识别为二进制日志文件。有关二进制日志加密的更多信息,请参见 第 19.3.2 节“加密二进制日志文件和中继日志文件”。
当二进制日志事务负载已被压缩时,mysqlbinlog 会自动解压缩和解码事务负载,并像打印未压缩事件一样打印它们。当 binlog_transaction_compression
设置为 ON
时,事务负载会被压缩,然后作为单个事件(Transaction_payload_event
)写入服务器的二进制日志文件。使用 --verbose
选项,mysqlbinlog 会添加注释,说明所使用的压缩算法、最初接收到的压缩负载大小以及解压缩后的负载大小。
mysqlbinlog 为作为压缩事务负载的一部分的单个事件声明的结束位置 (end_log_pos
) 与原始压缩负载的结束位置相同。因此,多个解压缩事件可以具有相同的结束位置。
如果事务负载已经被压缩,mysqlbinlog 自身的连接压缩效果会降低,但仍会对未压缩的事务和标头进行操作。
有关二进制日志事务压缩的更多信息,请参见 第 7.4.4.5 节“二进制日志事务压缩”。
在针对大型二进制日志运行 mysqlbinlog 时,请注意文件系统是否有足够的空间用于生成的文件。要配置 mysqlbinlog 用于临时文件的目录,请使用 TMPDIR
环境变量。
mysqlbinlog 在执行任何 SQL 语句之前将 pseudo_replica_mode
的值设置为 true。此系统变量会影响 XA 事务、original_commit_timestamp
复制延迟时间戳和 original_server_version
系统变量以及不受支持的 SQL 模式的处理。
mysqlbinlog 支持以下选项,这些选项可以在命令行或选项文件的 [mysqlbinlog]
和 [client]
组中指定。有关 MySQL 程序使用的选项文件的信息,请参见 第 6.2.2.2 节“使用选项文件”。
表 6.20 mysqlbinlog 选项
选项名称 | 说明 |
---|---|
--base64-output | 使用 base-64 编码打印二进制日志条目 |
--bind-address | 使用指定的网络接口连接到 MySQL 服务器 |
--binlog-row-event-max-size | 二进制日志最大事件大小 |
--character-sets-dir | 字符集安装目录 |
--compress | 压缩客户端和服务器之间发送的所有信息 |
--compression-algorithms | 允许连接到服务器的压缩算法 |
--connection-server-id | 用于测试和调试。有关适用的默认值和其他详细信息,请参见文本 |
--database | 仅列出此数据库的条目 |
--debug | 写入调试日志 |
--debug-check | 程序退出时打印调试信息 |
--debug-info | 程序退出时打印调试信息、内存和 CPU 统计信息 |
--default-auth | 要使用的身份验证插件 |
--defaults-extra-file | 除了常用选项文件外,还要读取指定的选项文件 |
--defaults-file | 仅读取指定的选项文件 |
--defaults-group-suffix | 选项组后缀值 |
--disable-log-bin | 禁用二进制日志记录 |
--exclude-gtids | 不显示提供的 GTID 集中的任何组 |
--force-if-open | 即使打开或未正确关闭,也要读取二进制日志文件 |
--force-read | 如果 mysqlbinlog 读取到无法识别的二进制日志事件,它会打印警告 |
--get-server-public-key | 从服务器请求 RSA 公钥 |
--help | 显示帮助消息并退出 |
--hexdump | 在注释中显示日志的十六进制转储 |
--host | MySQL 服务器所在的主机 |
--idempotent | 使服务器仅在此会话处理二进制日志更新时使用幂等模式 |
--include-gtids | 仅显示提供的 GTID 集中的组 |
--local-load | 在指定目录中为 LOAD DATA 准备本地临时文件 |
--login-path | 从 .mylogin.cnf 读取登录路径选项 |
--no-defaults | 不读取任何选项文件 |
--no-login-paths | 不从登录路径文件读取登录路径 |
--offset | 跳过日志中的前 N 个条目 |
--password | 连接到服务器时使用的密码 |
--plugin-dir | 插件安装目录 |
--port | 连接的 TCP/IP 端口号 |
--print-defaults | 打印默认选项 |
--print-table-metadata | 打印表元数据 |
--protocol | 要使用的传输协议 |
--raw | 以原始(二进制)格式将事件写入输出文件 |
--read-from-remote-master | 从 MySQL 复制源服务器读取二进制日志,而不是读取本地日志文件 |
--read-from-remote-server | 从 MySQL 服务器读取二进制日志,而不是本地日志文件 |
--read-from-remote-source | 从 MySQL 复制源服务器读取二进制日志,而不是读取本地日志文件 |
--require-row-format | 需要基于行的二进制日志记录格式 |
--result-file | 将输出定向到指定的文件 |
--rewrite-db | 从以基于行的格式编写的日志回放时,为数据库创建重写规则。可以使用多次 |
--server-id | 仅提取具有给定服务器 ID 的服务器创建的事件 |
--server-id-bits | 告诉 mysqlbinlog 在 mysqld 的 server-id-bits 设置为小于最大值时如何解释二进制日志中的服务器 ID;仅受 MySQL 集群版本的 mysqlbinlog 支持 |
--server-public-key-path | 包含 RSA 公钥的文件的路径名 |
--set-charset | 向输出添加 SET NAMES charset_name 语句 |
--shared-memory-base-name | 共享内存连接的共享内存名称(仅限 Windows) |
--short-form | 仅显示日志中包含的语句 |
--skip-gtids | 不将二进制日志文件中的 GTID 包含在输出转储文件中 |
--socket | 要使用的 Unix 套接字文件或 Windows 命名管道 |
--ssl-ca | 包含受信任 SSL 证书颁发机构列表的文件 |
--ssl-capath | 包含受信任 SSL 证书颁发机构证书文件的目录 |
--ssl-cert | 包含 X.509 证书的文件 |
--ssl-cipher | 允许的连接加密密码 |
--ssl-crl | 包含证书吊销列表的文件 |
--ssl-crlpath | 包含证书吊销列表文件的目录 |
--ssl-fips-mode | 是否在客户端启用 FIPS 模式 |
--ssl-key | 包含 X.509 密钥的文件 |
--ssl-mode | 与服务器连接的所需安全状态 |
--ssl-session-data | 包含 SSL 会话数据的文件 |
--ssl-session-data-continue-on-failed-reuse | 如果会话重用失败,是否建立连接 |
--start-datetime | 从时间戳等于或晚于 datetime 参数的第一个事件开始读取二进制日志 |
--start-position | 从位置等于或大于参数的第一个事件开始解码二进制日志 |
--stop-datetime | 在时间戳等于或大于 datetime 参数的第一个事件处停止读取二进制日志 |
--stop-never | 读取最后一个二进制日志文件后保持与服务器的连接 |
--stop-never-slave-server-id | 连接到服务器时要报告的从服务器 ID |
--stop-position | 在位置等于或大于参数的第一个事件处停止解码二进制日志 |
--tls-ciphersuites | 允许的加密连接的 TLSv1.3 密码套件 |
--tls-sni-servername | 客户端提供的服务器名称 |
--tls-version | 允许的加密连接的 TLS 协议 |
--to-last-log | 不要在从 MySQL 服务器请求的二进制日志的末尾停止,而是继续打印到最后一个二进制日志的末尾 |
--user | 连接到服务器时使用的 MySQL 用户名 |
--verbose | 将行事件重构为 SQL 语句 |
--verify-binlog-checksum | 验证二进制日志中的校验和 |
--version | 显示版本信息并退出 |
--zstd-compression-level | 使用 zstd 压缩连接到服务器的压缩级别 |
--help
,-?
命令行格式 --help
显示帮助消息并退出。
-
命令行格式 --base64-output=value
类型 字符串 默认值 AUTO
有效值 AUTO
NEVER
DECODE-ROWS
此选项确定何时应使用
BINLOG
语句将事件显示为编码为 base-64 字符串。该选项具有以下允许值(不区分大小写)AUTO
(“自动”)或UNSPEC
(“未指定”)在必要时自动显示BINLOG
语句(即,对于格式描述事件和行事件)。如果没有给出--base64-output
选项,则效果与--base64-output=AUTO
相同。注意如果您打算使用 mysqlbinlog 的输出重新执行二进制日志文件内容,则自动
BINLOG
显示是唯一安全的行为。其他选项值仅用于调试或测试目的,因为它们可能会生成不包含可执行形式的所有事件的输出。NEVER
会导致不显示BINLOG
语句。如果找到必须使用BINLOG
显示的行事件,则 mysqlbinlog 将会报错退出。DECODE-ROWS
向 mysqlbinlog 指定您希望将行事件解码并通过指定--verbose
选项将其显示为注释的 SQL 语句。与NEVER
一样,DECODE-ROWS
会抑制BINLOG
语句的显示,但与NEVER
不同,如果找到行事件,它不会报错退出。
有关显示
--base64-output
和--verbose
对行事件输出的影响的示例,请参阅 第 6.6.9.2 节,“mysqlbinlog 行事件显示”。 -
命令行格式 --bind-address=ip_address
在具有多个网络接口的计算机上,使用此选项可以选择用于连接到 MySQL 服务器的接口。
-
命令行格式 --binlog-row-event-max-size=#
类型 数字 默认值 4294967040
最小值 256
最大值 18446744073709547520
指定基于行的二进制日志事件的最大大小(以字节为单位)。如果可能,行将被分组到小于此大小的事件中。该值应为 256 的倍数。默认值为 4GB。
-
命令行格式 --character-sets-dir=dir_name
类型 目录名 安装字符集的目录。请参阅 第 12.15 节,“字符集配置”。
-
命令行格式 --compress[={OFF|ON}]
已弃用 是 类型 布尔值 默认值 OFF
如果可能,压缩客户端和服务器之间发送的所有信息。请参阅 第 6.2.8 节,“连接压缩控制”。
此选项已弃用。预计在未来版本的 MySQL 中会被移除。请参阅 配置旧版连接压缩。
--compression-algorithms=
value
命令行格式 --compression-algorithms=value
类型 设置 默认值 未压缩
有效值 zlib
zstd
未压缩
允许连接到服务器的压缩算法。可用算法与
protocol_compression_algorithms
系统变量的算法相同。默认值为uncompressed
。有关详细信息,请参阅 第 6.2.8 节,“连接压缩控制”。
--connection-server-id=
server_id
命令行格式 --connection-server-id=#]
类型 整数 默认值 0 (1)
最小值 0 (1)
最大值 4294967295
--connection-server-id
指定 mysqlbinlog 在连接到服务器时报告的服务器 ID。它可用于避免与副本服务器或另一个 mysqlbinlog 进程的 ID 冲突。如果指定了
--read-from-remote-server
选项,mysqlbinlog 将报告服务器 ID 为 0,这会告诉服务器在发送最后一个日志文件后断开连接(非阻塞行为)。如果还指定了--stop-never
选项以维护与服务器的连接,mysqlbinlog 默认情况下会报告服务器 ID 为 1 而不是 0,并且如果需要,可以使用--connection-server-id
替换该服务器 ID。请参阅 第 6.6.9.4 节,“指定 mysqlbinlog 服务器 ID”。--database=
,db_name
-d
db_name
命令行格式 --database=db_name
类型 字符串 此选项会导致 mysqlbinlog 从二进制日志(仅限本地日志)中输出在
USE
语句将db_name
选择为默认数据库时发生的条目。mysqlbinlog 的
--database
选项类似于 mysqld 的--binlog-do-db
选项,但只能用于指定一个数据库。如果多次指定--database
,则仅使用最后一个实例。此选项的效果取决于使用的是基于语句的日志记录格式还是基于行的日志记录格式,这与
--binlog-do-db
的效果取决于使用的是基于语句的日志记录还是基于行的日志记录相同。**基于语句的日志记录。**
--database
选项的工作方式如下:当
db_name
是默认数据库时,无论语句是修改db_name
中的表还是其他数据库中的表,都会输出语句。除非
db_name
被选为默认数据库,否则即使语句修改了db_name
中的表,也不会输出语句。CREATE DATABASE
、ALTER DATABASE
和DROP DATABASE
是例外。在确定是否输出语句时,将要 *创建、修改或删除* 的数据库视为默认数据库。
假设二进制日志是通过使用基于语句的日志记录执行以下语句创建的:
INSERT INTO test.t1 (i) VALUES(100); INSERT INTO db2.t2 (j) VALUES(200); USE test; INSERT INTO test.t1 (i) VALUES(101); INSERT INTO t1 (i) VALUES(102); INSERT INTO db2.t2 (j) VALUES(201); USE db2; INSERT INTO test.t1 (i) VALUES(103); INSERT INTO db2.t2 (j) VALUES(202); INSERT INTO t2 (j) VALUES(203);
mysqlbinlog --database=test 不会输出前两个
INSERT
语句,因为没有默认数据库。它会输出USE test
之后的三个INSERT
语句,但不会输出USE db2
之后的三个INSERT
语句。mysqlbinlog --database=db2 不会输出前两个
INSERT
语句,因为没有默认数据库。它不会输出USE test
之后的三个INSERT
语句,但会输出USE db2
之后的三个INSERT
语句。**基于行的日志记录。** mysqlbinlog 仅输出更改属于
db_name
的表的条目。默认数据库对此没有影响。假设刚刚描述的二进制日志是使用基于行的日志记录而不是基于语句的日志记录创建的。mysqlbinlog --database=test 仅输出修改 test 数据库中t1
的条目,而不管是否发出了USE
语句或默认数据库是什么。如果服务器在运行时将
binlog_format
设置为MIXED
,并且您希望能够将 mysqlbinlog 与--database
选项一起使用,则必须确保要修改的表位于USE
语句选择的数据库中。(特别是不应使用跨数据库更新。)当与
--rewrite-db
选项一起使用时,将首先应用--rewrite-db
选项;然后应用--database
选项,使用重写的数据库名称。选项提供的顺序对此没有影响。--debug[=
,debug_options
]-# [
debug_options
]命令行格式 --debug[=debug_options]
类型 字符串 默认值 d:t:o,/tmp/mysqlbinlog.trace
写入调试日志。典型的
debug_options
字符串是d:t:o,
。默认值为file_name
d:t:o,/tmp/mysqlbinlog.trace
。仅当使用
WITH_DEBUG
构建 MySQL 时,此选项才可用。Oracle 提供的 MySQL 发行版二进制文件 *未* 使用此选项构建。-
命令行格式 --debug-check
类型 布尔值 默认值 FALSE
程序退出时打印一些调试信息。
仅当使用
WITH_DEBUG
构建 MySQL 时,此选项才可用。Oracle 提供的 MySQL 发行版二进制文件 *未* 使用此选项构建。 -
命令行格式 --debug-info
类型 布尔值 默认值 FALSE
程序退出时打印调试信息以及内存和 CPU 使用情况统计信息。
仅当使用
WITH_DEBUG
构建 MySQL 时,此选项才可用。Oracle 提供的 MySQL 发行版二进制文件 *未* 使用此选项构建。 -
命令行格式 --default-auth=plugin
类型 字符串 有关使用哪个客户端身份验证插件的提示。参见 第 8.2.17 节,“可插拔身份验证”。
--defaults-extra-file=
file_name
命令行格式 --defaults-extra-file=文件名
类型 文件名 在全局选项文件之后但(在 Unix 上)在用户选项文件之前读取此选项文件。如果文件不存在或无法访问,则会发生错误。如果
file_name
不是绝对路径名,则相对于当前目录解释。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --defaults-file=文件名
类型 文件名 仅使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果
file_name
不是绝对路径名,则相对于当前目录解释。例外:即使使用
--defaults-file
,客户端程序也会读取.mylogin.cnf
。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --defaults-group-suffix=str
类型 字符串 不仅读取通常的选项组,还读取具有通常名称和后缀
str
的组。例如,mysqlbinlog 通常读取[client]
和[mysqlbinlog]
组。如果将此选项指定为--defaults-group-suffix=_other
,则 mysqlbinlog 还会读取[client_other]
和[mysqlbinlog_other]
组。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --disable-log-bin
禁用二进制日志记录。如果您使用
--to-last-log
选项并将输出发送到同一 MySQL 服务器,这对于避免无限循环非常有用。在意外退出后恢复时,此选项也很有用,可以避免重复记录已记录的语句。此选项会导致 mysqlbinlog 在其输出中包含
SET sql_log_bin = 0
语句,以禁用其余输出的二进制日志记录。操作sql_log_bin
系统变量的会话值是一个受限操作,因此此选项要求您具有设置受限会话变量的足够权限。参见 第 7.1.9.1 节,“系统变量权限”。 -
命令行格式 --exclude-gtids=gtid_set
类型 字符串 默认值 不显示
gtid_set
中列出的任何组。 --force-if-open
,-F
命令行格式 --force-if-open
即使二进制日志文件已打开或未正确关闭(设置了
IN_USE
标志),也要读取它们;如果文件以截断的事件结尾,则不要失败。IN_USE
标志仅针对服务器当前正在写入的二进制日志设置;如果服务器已崩溃,则该标志将保持设置状态,直到服务器重新启动并恢复二进制日志。如果没有此选项,mysqlbinlog 将拒绝处理设置了此标志的文件。由于服务器可能正在写入文件,因此最后一个事件的截断被认为是正常的。--force-read
,-f
命令行格式 --force-read
使用此选项,如果 mysqlbinlog 读取到无法识别的二进制日志事件,它将打印警告,忽略该事件并继续。如果没有此选项,mysqlbinlog 将在读取到此类事件时停止。
-
命令行格式 --get-server-public-key
类型 布尔值 从服务器请求基于 RSA 密钥对的密码交换所需的公钥。此选项适用于使用
caching_sha2_password
身份验证插件进行身份验证的客户端。对于该插件,除非请求,否则服务器不会发送公钥。对于未使用该插件进行身份验证的帐户,将忽略此选项。如果未使用基于 RSA 的密码交换,例如客户端使用安全连接连接到服务器时,也会忽略此选项。如果给出了
--server-public-key-path=
并指定了有效的公钥文件,则它优先于file_name
--get-server-public-key
。有关
caching_sha2_password
插件的信息,请参见 第 8.4.1.2 节,“缓存 SHA-2 可插拔身份验证”。 --hexdump
,-H
命令行格式 --hexdump
如 第 6.6.9.1 节,“mysqlbinlog 十六进制转储格式” 中所述,在注释中显示日志的十六进制转储。十六进制输出有助于复制调试。
--host=
,host_name
-h
host_name
命令行格式 --host=主机名
类型 字符串 默认值 localhost
从给定主机上的 MySQL 服务器获取二进制日志。
-
命令行格式 --idempotent
类型 布尔值 默认值 true
告诉 MySQL 服务器在处理更新时使用幂等模式;这会导致抑制服务器在当前会话中处理更新时遇到的任何重复键或键未找到错误。每当需要或有必要将一个或多个二进制日志重放到可能不包含日志所引用所有数据的 MySQL 服务器时,此选项都可能很有用。
此选项的影响范围仅包括当前的 mysqlbinlog 客户端和会话。
-
命令行格式 --include-gtids=gtid_set
类型 字符串 默认值 仅显示
gtid_set
中列出的组。 --local-load=
,dir_name
-l
dir_name
命令行格式 --local-load=目录名
类型 目录名 对于与
LOAD DATA
语句对应的数据加载操作,mysqlbinlog 从二进制日志事件中提取文件,将它们作为临时文件写入本地文件系统,并写入LOAD DATA LOCAL
语句以加载文件。默认情况下,mysqlbinlog 将这些临时文件写入特定于操作系统的目录。--local-load
选项可用于显式指定 mysqlbinlog 应在其中准备本地临时文件的目录。因为其他进程可以将文件写入默认的系统特定目录,建议指定
--local-load
选项到 mysqlbinlog 以指定不同的数据文件目录,然后通过在处理来自 mysqlbinlog 的输出时为 mysql 指定--load-data-local-dir
选项来指定相同的目录。例如mysqlbinlog --local-load=/my/local/data ... | mysql --load-data-local-dir=/my/local/data ...
重要这些临时文件不会被 mysqlbinlog 或任何其他 MySQL 程序自动删除。
-
命令行格式 --login-path=名称
类型 字符串 从
.mylogin.cnf
登录路径文件中的命名登录路径读取选项。““登录路径””是一个选项组,其中包含指定要连接到的 MySQL 服务器和要进行身份验证的帐户的选项。要创建或修改登录路径文件,请使用 mysql_config_editor 实用程序。参见 第 6.6.7 节,“mysql_config_editor - MySQL 配置实用程序”。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --no-login-paths
跳过从登录路径文件读取选项。
有关相关信息,请参见
--login-path
。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --no-defaults
不读取任何选项文件。如果程序启动由于从选项文件读取未知选项而失败,则可以使用
--no-defaults
来防止读取它们。例外是,如果
.mylogin.cnf
文件存在,则在所有情况下都会读取它。这允许以比在命令行上更安全的方式指定密码,即使在使用--no-defaults
时也是如此。要创建.mylogin.cnf
,请使用 mysql_config_editor 实用程序。参见 第 6.6.7 节,“mysql_config_editor - MySQL 配置实用程序”。有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
--offset=
,N
-o
N
命令行格式 --offset=#
类型 数字 跳过日志中的前
N
个条目。-
命令行格式 --open-files-limit=#
类型 数字 默认值 8
最小值 1
最大值 [平台相关]
指定要保留的打开文件描述符的数量。
--password[=
,password
]-p[
password
]命令行格式 --password[=密码]
类型 字符串 用于连接服务器的 MySQL 帐户的密码。密码值是可选的。如果未给出,mysqlbinlog 会提示您输入。如果给出,
--password=
或-p
与其后的密码之间必须没有空格。如果没有指定密码选项,则默认情况下不发送密码。在命令行上指定密码应被视为不安全的。为了避免在命令行上提供密码,请使用选项文件。请参阅 第 8.1.2.1 节“密码安全的最终用户指南”。
要明确指定没有密码并且 mysqlbinlog 不应提示输入密码,请使用
--skip-password
选项。-
命令行格式 --plugin-dir=目录名
类型 目录名 要在其中查找插件的目录。如果使用
--default-auth
选项指定身份验证插件,但 mysqlbinlog 找不到它,请指定此选项。请参阅 第 8.2.17 节“可插拔身份验证”。 --port=
,port_num
-P
port_num
命令行格式 --port=端口号
类型 数字 默认值 3306
用于连接到远程服务器的 TCP/IP 端口号。
-
命令行格式 --print-defaults
打印程序名称及其从选项文件中获取的所有选项。
有关此选项文件选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --print-table-metadata
从二进制日志中打印与表相关的元数据。使用
binlog-row-metadata
配置二进制记录的与表相关的元数据量。 --protocol={TCP|SOCKET|PIPE|MEMORY}
命令行格式 --protocol=类型
类型 字符串 默认值 [参见正文]
有效值 TCP
SOCKET
PIPE
MEMORY
用于连接到服务器的传输协议。当其他连接参数通常导致使用您不想要的协议以外的协议时,此选项很有用。有关允许值的详细信息,请参阅 第 6.2.7 节“连接传输协议”。
-
命令行格式 --raw
类型 布尔值 默认值 FALSE
默认情况下,mysqlbinlog 读取二进制日志文件并以文本格式写入事件。
--raw
选项告诉 mysqlbinlog 以其原始二进制格式写入它们。它的使用要求也使用--read-from-remote-server
,因为文件是从服务器请求的。 mysqlbinlog 为从服务器读取的每个文件写入一个输出文件。--raw
选项可用于备份服务器的二进制日志。使用--stop-never
选项时,备份是“实时”的,因为 mysqlbinlog 保持连接到服务器。默认情况下,输出文件写入当前目录,名称与原始日志文件相同。可以使用--result-file
选项修改输出文件名。有关更多信息,请参阅 第 6.6.9.3 节“使用 mysqlbinlog 备份二进制日志文件”。 --read-from-remote-source=
type
命令行格式 --read-from-remote-source=类型
此选项通过将选项值分别设置为
BINLOG-DUMP-NON-GTIDS
或BINLOG-DUMP-GTIDS
,使用COM_BINLOG_DUMP
或COM_BINLOG_DUMP_GTID
命令从 MySQL 服务器读取二进制日志。如果--read-from-remote-source=BINLOG-DUMP-GTIDS
与--exclude-gtids
结合使用,则可以在源头上过滤掉事务,从而避免不必要的网络流量。连接参数选项与这些选项或
--read-from-remote-server
选项一起使用。这些选项是--host
、--password
、--port
、--protocol
、--socket
和--user
。如果没有指定任何远程选项,则忽略连接参数选项。使用这些选项需要
REPLICATION SLAVE
权限。--read-from-remote-master=
type
命令行格式 --read-from-remote-master=类型
已弃用 是 --read-from-remote-source
的已弃用同义词。--read-from-remote-server=
,file_name
-R
命令行格式 --read-from-remote-server=文件名
从 MySQL 服务器读取二进制日志,而不是读取本地日志文件。此选项要求远程服务器正在运行。它仅适用于远程服务器上的二进制日志文件,不适用于中继日志文件。这接受二进制日志文件名(包括数字后缀)而不带文件路径。
连接参数选项与该选项或
--read-from-remote-source
选项一起使用。这些选项是--host
、--password
、--port
、--protocol
、--socket
和--user
。如果未指定任何远程选项,则忽略连接参数选项。使用此选项需要
REPLICATION SLAVE
权限。--result-file=
,name
-r
name
命令行格式 --result-file=名称
如果没有
--raw
选项,此选项指示 mysqlbinlog 写入文本输出的文件。使用--raw
时,mysqlbinlog 为从服务器传输的每个日志文件写入一个二进制输出文件,默认情况下,使用与原始日志文件相同的名称将它们写入当前目录。在这种情况下,--result-file
选项值被视为修改输出文件名的前缀。-
命令行格式 --require-row-format
类型 布尔值 默认值 false
需要基于行的二进制日志记录格式的事件。此选项对 mysqlbinlog 输出强制执行基于行的复制事件。使用此选项生成的事件流将被使用
CHANGE REPLICATION SOURCE TO
语句的REQUIRE_ROW_FORMAT
选项保护的复制通道接受。必须在写入二进制日志的服务器上设置binlog_format=ROW
。指定此选项时,如果 mysqlbinlog 遇到任何在REQUIRE_ROW_FORMAT
限制下不允许的事件,包括LOAD DATA INFILE
指令、创建或删除临时表、INTVAR
、RAND
或USER_VAR
事件以及 DML 事务中的非基于行的事件,它将停止并显示错误消息。 mysqlbinlog 还会在其输出的开头打印SET @@session.require_row_format
语句,以便在执行输出时应用限制,并且不打印SET @@session.pseudo_thread_id
语句。 --rewrite-db='
from_name
->to_name
'命令行格式 --rewrite-db='旧名称->新名称'
类型 字符串 默认值 [无]
从基于行或基于语句的日志读取时,将所有出现的
from_name
重写为to_name
。重写在基于行的日志的行上以及基于语句的日志的USE
子句上进行。警告使用此选项时,表名用数据库名称限定的语句不会重写为使用新名称。
用作此选项值的重写规则是一个字符串,其格式为
'
,如前所示,因此必须用引号引起来。from_name
->to_name
'要使用多个重写规则,请多次指定该选项,如下所示
mysqlbinlog --rewrite-db='dbcurrent->dbold' --rewrite-db='dbtest->dbcurrent' \ binlog.00001 > /tmp/statements.sql
当与
--database
选项一起使用时,首先应用--rewrite-db
选项;然后应用--database
选项,使用重写的数据库名称。选项提供的顺序对此没有任何影响。这意味着,例如,如果使用
--rewrite-db='mydb->yourdb' --database=yourdb
启动 mysqlbinlog,那么对数据库mydb
和yourdb
中任何表的更新都将包含在输出中。另一方面,如果使用--rewrite-db='mydb->yourdb' --database=mydb
启动它,那么 mysqlbinlog 将不会输出任何语句:因为在应用--database
选项之前,对mydb
的所有更新都会先被重写为对yourdb
的更新,因此没有与--database=mydb
匹配的更新。-
命令行格式 --server-id=id
类型 数字 仅显示由具有给定服务器 ID 的服务器创建的事件。
-
命令行格式 --server-id-bits=#
类型 数字 默认值 32
最小值 7
最大值 32
仅使用
server_id
的前N
位来标识服务器。如果二进制日志是由server-id-bits
设置小于 32 且用户数据存储在最高有效位的 mysqld 编写的,则运行将--server-id-bits
设置为 32 的 mysqlbinlog 可以查看此数据。此选项仅受 NDB Cluster 发行版提供的或使用 NDB Cluster 支持构建的 mysqlbinlog 版本支持。
--server-public-key-path=
file_name
命令行格式 --server-public-key-path=file_name
类型 文件名 PEM 格式文件的路径名,该文件包含服务器为基于 RSA 密钥对的密码交换所需的客户端公钥副本。此选项适用于使用
sha256_password
(已弃用)或caching_sha2_password
身份验证插件进行身份验证的客户端。对于未使用其中一个插件进行身份验证的帐户,将忽略此选项。如果未使用基于 RSA 的密码交换(例如,当客户端使用安全连接连接到服务器时),也将忽略此选项。如果给出了
--server-public-key-path=
并指定了有效的公钥文件,则它优先于file_name
--get-server-public-key
。对于
sha256_password
(已弃用),此选项仅在使用 OpenSSL 构建 MySQL 时适用。有关
sha256_password
和caching_sha2_password
插件的信息,请参阅 第 8.4.1.3 节“SHA-256 可插拔身份验证” 和 第 8.4.1.2 节“缓存 SHA-2 可插拔身份验证”。-
命令行格式 --set-charset=charset_name
类型 字符串 向输出添加
SET NAMES
语句以指定用于处理日志文件的字符集。charset_name
--shared-memory-base-name=
name
命令行格式 --shared-memory-base-name=name
平台特定 Windows 在 Windows 上,用于使用共享内存连接到本地服务器的共享内存名称。默认值为
MYSQL
。共享内存名称区分大小写。仅当使用启用了
shared_memory
系统变量的服务器启动以支持共享内存连接时,此选项才适用。--short-form
,-s
命令行格式 --short-form
仅显示日志中包含的语句,而不显示任何额外信息或基于行的事件。这仅用于测试,不应在生产系统中使用。它已被弃用,您应该预料它将在未来的版本中被删除。
-
命令行格式 --skip-gtids[=true|false]
类型 布尔值 默认值 false
不要在输出转储文件中包含来自二进制日志文件的 GTID。例如
mysqlbinlog --skip-gtids binlog.000001 > /tmp/dump.sql mysql -u root -p -e "source /tmp/dump.sql"
通常,您不应在生产或恢复中使用此选项,除非在特定且罕见的情况下,您积极不需要 GTID。例如,管理员可能希望将选定的交易(例如表定义)从一个部署复制到另一个不相关的部署,而该部署不会与原始部署进行复制或从原始部署进行复制。在这种情况下,可以使用
--skip-gtids
使管理员能够像应用新交易一样应用交易,并确保部署保持不相关。但是,仅当包含 GTID 会导致您的用例出现已知问题时,才应使用此选项。 --socket=
,path
-S
path
命令行格式 --socket={file_name|pipe_name}
类型 字符串 对于与
localhost
的连接,要使用的 Unix 套接字文件,或者在 Windows 上,要使用的命名管道的名称。在 Windows 上,仅当使用启用了
named_pipe
系统变量的服务器启动以支持命名管道连接时,此选项才适用。此外,进行连接的用户必须是named_pipe_full_access_group
系统变量指定的 Windows 组的成员。以
--ssl
开头的选项指定是否使用加密连接到服务器,并指示在何处找到 SSL 密钥和证书。请参阅 加密连接的命令选项。--ssl-fips-mode={OFF|ON|STRICT}
命令行格式 --ssl-fips-mode={OFF|ON|STRICT}
已弃用 是 类型 枚举 默认值 OFF
有效值 OFF
ON
STRICT
控制是否在客户端启用 FIPS 模式。
--ssl-fips-mode
选项与其他--ssl-
选项的不同之处在于,它不是用于建立加密连接,而是用于影响允许哪些加密操作。请参阅 第 8.8 节“FIPS 支持”。xxx
允许使用以下
--ssl-fips-mode
值OFF
:禁用 FIPS 模式。ON
:启用 FIPS 模式。STRICT
:启用“严格”FIPS 模式。
注意如果 OpenSSL FIPS 对象模块不可用,则
--ssl-fips-mode
唯一允许的值为OFF
。在这种情况下,将--ssl-fips-mode
设置为ON
或STRICT
会导致客户端在启动时发出警告,并在非 FIPS 模式下运行。此选项已弃用。预计它将在未来的 MySQL 版本中被删除。
-
命令行格式 --start-datetime=datetime
类型 日期时间 从时间戳等于或晚于
datetime
参数的第一个事件开始读取二进制日志。datetime
值相对于运行 mysqlbinlog 的计算机上的本地时区。该值应采用DATETIME
或TIMESTAMP
数据类型接受的格式。例如mysqlbinlog --start-datetime="2005-12-25 11:25:56" binlog.000003
此选项对时间点恢复很有用。请参阅 第 9.5 节“时间点(增量)恢复”。
--start-position=
,N
-j
N
命令行格式 --start-position=#
类型 数字 从日志位置
N
开始解码二进制日志,并在输出中包含从位置N
或之后开始的任何事件。该位置是日志文件中的字节点,而不是事件计数器;它需要指向事件的起始位置才能生成有用的输出。此选项适用于命令行中命名的第一个日志文件。此选项支持的最大值为 18446744073709551616 (264-1),除非还使用了
--read-from-remote-server
或--read-from-remote-source
,在这种情况下,最大值为 4294967295。此选项对时间点恢复很有用。请参阅 第 9.5 节“时间点(增量)恢复”。
-
命令行格式 --stop-datetime=datetime
在时间戳等于或晚于
datetime
参数的第一个事件处停止读取二进制日志。有关datetime
值的信息,请参阅--start-datetime
选项的说明。此选项对时间点恢复很有用。请参阅 第 9.5 节“时间点(增量)恢复”。
-
命令行格式 --stop-never
类型 布尔值 默认值 FALSE
此选项与
--read-from-remote-server
一起使用。它告诉 mysqlbinlog 保持与服务器的连接。否则,当最后一个日志文件已从服务器传输后,mysqlbinlog 将退出。--stop-never
意味着--to-last-log
,因此只需要在命令行中命名要传输的第一个日志文件。--stop-never
通常与--raw
一起使用以进行实时二进制日志备份,但也可以在不使用--raw
的情况下使用,以在服务器生成日志事件时维护日志事件的连续文本显示。使用
--stop-never
时,默认情况下,mysqlbinlog 在连接到服务器时报告服务器 ID 为 1。使用--connection-server-id
显式指定要报告的备用 ID。它可用于避免与副本服务器或其他 mysqlbinlog 进程的 ID 发生冲突。请参阅 第 6.6.9.4 节“指定 mysqlbinlog 服务器 ID”。 --stop-never-slave-server-id=
id
命令行格式 --stop-never-slave-server-id=#
类型 数字 默认值 65535
最小值 1
此选项已弃用;预计在未来版本中删除。请改用
--connection-server-id
选项来指定 mysqlbinlog 要报告的服务器 ID。-
命令行格式 --stop-position=#
类型 数字 在日志位置
N
处停止解码二进制日志,从输出中排除从位置N
或之后开始的所有事件。该位置是日志文件中的字节点,而不是事件计数器;它需要指向您希望包含在输出中的最后一个事件的起始位置之后的某个点。在位置N
之前开始并在该位置或之后结束的事件是要处理的最后一个事件。此选项适用于命令行中命名的最后一个日志文件。此选项对时间点恢复很有用。请参阅 第 9.5 节“时间点(增量)恢复”。
--tls-ciphersuites=
ciphersuite_list
命令行格式 --tls-ciphersuites=ciphersuite_list
类型 字符串 使用 TLSv1.3 的加密连接允许使用的密码套件。该值是一个或多个以冒号分隔的密码套件名称列表。可以为此选项命名的密码套件取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参阅 第 8.3.2 节,“加密连接 TLS 协议和密码”。
--tls-sni-servername=
server_name
命令行格式 --tls-sni-servername=server_name
类型 字符串 指定时,名称将使用
mysql_options()
的MYSQL_OPT_TLS_SNI_SERVERNAME
选项传递给libmysqlclient
C API 库。服务器名称不区分大小写。要显示客户端为当前会话指定的服务器名称(如果有),请检查Tls_sni_server_name
状态变量。服务器名称指示 (SNI) 是 TLS 协议的扩展(必须使用 TLS 扩展编译 OpenSSL 才能使此选项起作用)。MySQL 对 SNI 的实现仅代表客户端。
-
命令行格式 --tls-version=protocol_list
类型 字符串 默认值 TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
(OpenSSL 1.1.1 或更高版本)TLSv1,TLSv1.1,TLSv1.2
(否则)加密连接允许使用的 TLS 协议。该值是一个或多个以逗号分隔的协议名称列表。可以为此选项命名的协议取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参阅 第 8.3.2 节,“加密连接 TLS 协议和密码”。
--to-last-log
,-t
命令行格式 --to-last-log
不要在来自 MySQL 服务器的请求的二进制日志的末尾停止,而是继续打印直到最后一个二进制日志的末尾。如果您将输出发送到同一个 MySQL 服务器,这可能会导致无限循环。此选项需要
--read-from-remote-server
。--user=
,user_name
-u
user_name
命令行格式 --user=user_name,
类型 字符串 连接到远程服务器时要使用的 MySQL 帐户的用户名。
如果您正在使用
Rewriter
插件,则应向该用户授予SKIP_QUERY_REWRITE
权限。--verbose
,-v
命令行格式 --verbose
重建行事件并将其显示为带注释的 SQL 语句,并在适用的情况下显示表分区信息。如果此选项被指定两次(通过传入“-vv”或“--verbose --verbose”),则输出将包含注释,以指示列数据类型和一些元数据,以及信息性日志事件,例如行查询日志事件(如果
binlog_rows_query_log_events
系统变量设置为TRUE
)。有关显示
--base64-output
和--verbose
对行事件输出的影响的示例,请参阅 第 6.6.9.2 节,“mysqlbinlog 行事件显示”。-
命令行格式 --verify-binlog-checksum
验证二进制日志文件中的校验和。
--version
,-V
命令行格式 --version
显示版本信息并退出。
--zstd-compression-level=
level
命令行格式 --zstd-compression-level=#
类型 整数 用于连接到使用
zstd
压缩算法的服务器的压缩级别。允许的级别从 1 到 22,较大的值表示更高的压缩级别。默认的zstd
压缩级别为 3。压缩级别设置对不使用zstd
压缩的连接没有影响。有关详细信息,请参阅 第 6.2.8 节,“连接压缩控制”。
您可以将 mysqlbinlog 的输出通过管道传输到 mysql 客户端,以执行二进制日志中包含的事件。当您有旧备份时,此技术用于从意外退出中恢复(请参阅 第 9.5 节,“时间点(增量)恢复”)。例如
mysqlbinlog binlog.000001 | mysql -u root -p
或
mysqlbinlog binlog.[0-9]* | mysql -u root -p
如果 mysqlbinlog 生成的语句可能包含 BLOB
值,则当 mysql 处理它们时,这些值可能会导致问题。在这种情况下,请使用 --binary-mode
选项调用 mysql。
您也可以将 mysqlbinlog 的输出重定向到文本文件,如果您需要先修改语句日志(例如,删除您由于某种原因不想执行的语句)。编辑文件后,使用该文件作为 mysql 程序的输入来执行其中包含的语句
mysqlbinlog binlog.000001 > tmpfile
... edit tmpfile ...
mysql -u root -p < tmpfile
当使用 --start-position
选项调用 mysqlbinlog 时,它仅显示二进制日志中偏移量大于或等于给定位置的事件(给定位置必须与一个事件的开始匹配)。它还具有在看到具有给定日期和时间的事件时停止和启动的选项。这使您能够使用 --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"
您还可以使用 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 无法识别要应用此选项的最后一个日志文件。
LOAD DATA 操作。 mysqlbinlog 可以生成输出,在没有原始数据文件的情况下复制 LOAD DATA
操作。 mysqlbinlog 将数据复制到一个临时文件,并写入一个引用该文件的 LOAD DATA LOCAL
语句。写入这些文件的目录的默认位置是特定于系统的。要显式指定目录,请使用 --local-load
选项。
因为 mysqlbinlog 会将 LOAD DATA
语句转换为 LOAD DATA LOCAL
语句(也就是说,它会添加 LOCAL
),所以您用于处理语句的客户端和服务器都必须配置为启用 LOCAL
功能。请参阅 第 8.1.6 节,“LOAD DATA LOCAL 的安全注意事项”。
为 LOAD DATA LOCAL
语句创建的临时文件不会自动删除,因为在您实际执行这些语句之前需要使用它们。 在您不再需要语句日志后,您应该自己删除这些临时文件。 这些文件可以在临时文件目录中找到,并且文件名类似于 原始文件名-#-#
。