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