服务器的二进制日志由包含描述数据库内容修改的“事件”的文件组成。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 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
后面的数字表示事件在二进制日志文件中的文件偏移量或起始位置。
第二行以日期和时间开头,指示事件起源的服务器上语句开始的时间。对于复制,此时间戳会传播到复制服务器。 server id
是事件起源的服务器的 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 统计信息 |
--defaults-extra-file | 除了通常的选项文件之外,还读取指定的选项文件 |
--defaults-file | 仅读取指定的选项文件 |
--defaults-group-suffix | 选项组后缀值 |
--disable-log-bin | 禁用二进制日志记录 |
--force-if-open | 即使二进制日志文件已打开或未正确关闭,也读取它们 |
--force-read | 如果 mysqlbinlog 读取它无法识别的二进制日志事件,它将打印警告 |
--get-server-public-key | 从服务器请求 RSA 公钥 |
--help | 显示帮助消息并退出 |
--hexdump | 在注释中显示日志的十六进制转储 |
--host | MySQL 服务器所在的主机 |
--idempotent | 使服务器仅对来自此会话的二进制日志更新使用幂等模式 |
--local-load | 在指定的目录中为 LOAD DATA 准备本地临时文件 |
--login-path | 从 .mylogin.cnf 读取登录路径选项 |
--no-defaults | 不读取任何选项文件 |
--no-login-paths | 不从登录路径文件读取登录路径 |
--offset | 跳过日志中的前 N 个条目 |
--password | 连接到服务器时使用的密码 |
--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 如何在二进制日志中解释服务器 ID,当日志是由其 server-id-bits 设置为小于最大值的 mysqld 写入时;仅由 MySQL 集群版本的 mysqlbinlog 支持 |
--server-public-key-path | 包含 RSA 公钥的文件的路径名 |
--set-charset | 在输出中添加 SET NAMES charset_name 语句 |
--shared-memory-base-name | 共享内存连接的共享内存名称(仅限 Windows) |
--short-form | 仅显示日志中包含的语句 |
--socket | 要使用的 Unix 套接字文件或 Windows 命名管道 |
--ssl-ca | 包含受信任的 SSL 证书颁发机构列表的文件 |
--ssl-capath | 包含受信任的 SSL 证书颁发机构证书文件的目录 |
--ssl-cert | 包含 X.509 证书的文件 |
--ssl-cipher | 允许连接加密的密码 |
--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 您希望将行事件解码并显示为带注释的 SQL 语句,方法是同时指定--verbose
选项。与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 输出来自二进制日志(仅限本地日志)的条目,这些条目是在
db_name
被USE
选择为默认数据库时发生的。--database
选项用于 mysqlbinlog 类似于--binlog-do-db
选项用于 mysqld,但只能用于指定一个数据库。如果--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
之后的 3 条INSERT
语句。mysqlbinlog --database=db2 不会输出前两个
INSERT
语句,因为没有默认数据库。它不会输出USE test
之后的 3 条INSERT
语句,但会输出USE db2
之后的 3 条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=file_name
类型 文件名 在全局选项文件之后,但在(在 Unix 上)用户选项文件之前读取此选项文件。如果文件不存在或无法访问,则会发生错误。如果
file_name
不是绝对路径名,则将其解释为相对于当前目录的路径名。有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --defaults-file=file_name
类型 文件名 仅使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果
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.1 节,“缓存 SHA-2 可插拔身份验证”。 --hexdump
,-H
命令行格式 --hexdump
以注释形式显示日志的十六进制转储,如第 6.6.9.1 节,“mysqlbinlog 十六进制转储格式”中所述。十六进制输出对于复制调试可能很有用。
--host=
,host_name
-h
host_name
命令行格式 --host=host_name
类型 字符串 默认值 localhost
从给定主机上的MySQL服务器获取二进制日志。
-
命令行格式 --idempotent
类型 布尔值 默认值 true
告诉MySQL服务器在处理更新时使用幂等模式;这会导致在处理更新时服务器在当前会话中遇到的任何重复键或键不存在错误被抑制。此选项在需要或必须将一个或多个二进制日志重新播放到可能不包含日志所引用的所有数据的MySQL服务器时可能很有用。
此选项的作用范围仅包括当前的mysqlbinlog客户端和会话。
-
命令行格式 --include-gtids=gtid_set
类型 字符串 默认值 仅显示
gtid_set
中列出的组。 --local-load=
,dir_name
-l
dir_name
命令行格式 --local-load=dir_name
类型 目录名称 对于与
LOAD DATA
语句相对应的加载数据操作,mysqlbinlog从二进制日志事件中提取文件,将它们作为临时文件写入本地文件系统,并写入LOAD DATA LOCAL
语句以使文件被加载。默认情况下,mysqlbinlog将这些临时文件写入操作系统特定的目录。--local-load
选项可用于显式指定mysqlbinlog应准备本地临时文件的目录。由于其他进程可以将文件写入默认的系统特定目录,因此建议对mysqlbinlog指定
--local-load
选项来为数据文件指定不同的目录,然后通过对mysql指定--load-data-local-dir
选项来指定该目录,当处理来自mysqlbinlog的输出时。例如mysqlbinlog --local-load=/my/local/data ... | mysql --load-data-local-dir=/my/local/data ...
重要这些临时文件不会被mysqlbinlog或任何其他MySQL程序自动删除。
-
命令行格式 --login-path=name
类型 字符串 从
.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[=password]
类型 字符串 用于连接到服务器的MySQL帐户的密码。密码值是可选的。如果没有给出,mysqlbinlog会提示输入一个。如果给出,
--password=
或-p
与其后的密码之间必须没有空格。如果没有指定密码选项,默认情况下不发送密码。在命令行中指定密码被认为是不安全的。为了避免在命令行中提供密码,请使用选项文件。请参阅第 8.1.2.1 节,“密码安全用户指南”。
要明确指定没有密码,并且mysqlbinlog不应该提示输入密码,请使用
--skip-password
选项。-
命令行格式 --plugin-dir=dir_name
类型 目录名称 查找插件的目录。如果使用
--default-auth
选项指定身份验证插件,但mysqlbinlog找不到它,则指定此选项。请参阅第 8.2.17 节,“可插拔身份验证”。 --port=
,port_num
-P
port_num
命令行格式 --port=port_num
类型 数字 默认值 3306
用于连接到远程服务器的 TCP/IP 端口号。
-
命令行格式 --print-defaults
打印程序名称及其从选项文件获取的所有选项。
有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”。
-
命令行格式 --print-table-metadata
从二进制日志中打印与表相关的元数据。使用
binlog-row-metadata
配置二进制日志记录的与表相关的元数据量。 --protocol={TCP|SOCKET|PIPE|MEMORY}
命令行格式 --protocol=type
类型 字符串 默认值 [参见文本]
有效值 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=type
此选项通过将选项值设置为
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=type
已弃用 是 --read-from-remote-source
的已弃用同义词。--read-from-remote-server=
,file_name
-R
命令行格式 --read-from-remote-server=file_name
从 MySQL 服务器读取二进制日志,而不是读取本地日志文件。此选项要求远程服务器正在运行。它仅适用于远程服务器上的二进制日志文件,而不适用于中继日志文件。这接受二进制日志文件名(包括数字后缀),但不包括文件路径。
连接参数选项与此选项或
--read-from-remote-source
选项一起使用。这些选项是--host
、--password
、--port
、--protocol
、--socket
和--user
。如果未指定任何远程选项,则连接参数选项将被忽略。使用此选项需要
REPLICATION SLAVE
权限。--result-file=
,name
-r
name
命令行格式 --result-file=name
在没有
--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='oldname->newname'
类型 字符串 默认值 [无]
从基于行或基于语句的日志读取时,将所有出现的
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
选项应用,使用重写后的数据库名称。选项提供的顺序在这方面没有区别。这意味着,例如,如果mysqlbinlog使用
--rewrite-db='mydb->yourdb' --database=yourdb
启动,则对数据库mydb
和yourdb
中任何表的更新都包含在输出中。另一方面,如果它使用--rewrite-db='mydb->yourdb' --database=mydb
启动,则mysqlbinlog根本不输出任何语句:由于对mydb
的所有更新在应用--database
选项之前首先被重写为对yourdb
的更新,因此没有更新匹配--database=mydb
。-
命令行格式 --server-id=id
类型 数字 仅显示具有给定服务器 ID 的服务器创建的事件。
-
命令行格式 --server-id-bits=#
类型 数字 默认值 32
最小值 7
最大值 32
仅使用
server_id
的前N
位来标识服务器。如果二进制日志是由mysqld写入的,并且server-id-bits
设置为小于32,用户数据存储在最高有效位,则运行mysqlbinlog并将--server-id-bits
设置为32可以使这些数据可见。此选项仅受与 NDB 集群分发版一起提供的mysqlbinlog版本或使用 NDB 集群支持构建的版本支持。
--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.2 节,“SHA-256 可插拔身份验证”和第 8.4.1.1 节,“缓存 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。它可以用来避免与副本服务器的 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 协议的扩展(OpenSSL 必须使用 TLS 扩展编译才能使此选项起作用)。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
当 mysqlbinlog 使用 --start-position
选项调用时,它只显示二进制日志中偏移量大于或等于给定位置的事件(给定位置必须与某个事件的开始位置匹配)。它还具有选项在看到具有给定日期和时间的事件时停止和启动。这使您可以使用 --stop-datetime
选项执行时间点恢复(例如,您可以在时间点恢复中说“将我的数据库回滚到今天上午 10:30 的状态”)。
处理多个文件。如果您要执行的二进制日志不止一个,安全方法是使用单个连接到服务器来处理它们。以下示例演示了可能 不安全 的操作
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
语句创建的临时文件 不会 自动删除,因为在您实际执行这些语句之前,它们是必需的。在不再需要语句日志后,您应该自己删除临时文件。这些文件可以在临时文件目录中找到,其名称类似于 original_file_name-#-#
。