文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  mysqlbinlog — 用于处理二进制日志文件的实用程序

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

服务器的二进制日志由包含描述数据库内容修改的“事件”的文件组成。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 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

    命令行格式 --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

    命令行格式 --bind-address=ip_address

    在具有多个网络接口的计算机上,使用此选项选择用于连接到 MySQL 服务器的接口。

  • --binlog-row-event-max-size=N

    命令行格式 --binlog-row-event-max-size=#
    类型 数字
    默认值 4294967040
    最小值 256
    最大值 18446744073709547520

    指定基于行的二进制日志事件的最大大小(以字节为单位)。如果可能,行将分组到小于此大小的事件中。该值应为 256 的倍数。默认值为 4GB。

  • --character-sets-dir=dir_name

    命令行格式 --character-sets-dir=dir_name
    类型 目录名称

    安装字符集的目录。请参见 第 12.15 节,“字符集配置”

  • --compress

    命令行格式 --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_nameUSE 选择为默认数据库时发生的。

    --database 选项用于 mysqlbinlog 类似于 --binlog-do-db 选项用于 mysqld,但只能用于指定一个数据库。如果 --database 被多次给出,则只使用最后一次实例。

    此选项的效果取决于使用基于语句的日志记录格式还是基于行的日志记录格式,与 --binlog-do-db 的效果取决于使用基于语句的日志记录还是基于行的日志记录的方式相同。

    基于语句的日志记录。 --database 选项的工作原理如下

    • db_name 是默认数据库时,无论语句是否修改 db_name 或其他数据库中的表,都会输出语句。

    • 除非 db_name 被选为默认数据库,否则不会输出语句,即使它们修改了 db_name 中的表也是如此。

    • 对于 CREATE DATABASEALTER DATABASEDROP 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

    命令行格式 --debug-check
    类型 布尔值
    默认值 FALSE

    在程序退出时打印一些调试信息。

    此选项仅在使用 WITH_DEBUG 构建 MySQL 时可用。Oracle 提供的 MySQL 发布版二进制文件 没有 使用此选项进行构建。

  • --debug-info

    命令行格式 --debug-info
    类型 布尔值
    默认值 FALSE

    在程序退出时打印调试信息以及内存和 CPU 使用情况统计信息。

    此选项仅在使用 WITH_DEBUG 构建 MySQL 时可用。Oracle 提供的 MySQL 发布版二进制文件 没有 使用此选项进行构建。

  • --default-auth=plugin

    命令行格式 --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

    命令行格式 --defaults-file=file_name
    类型 文件名

    仅使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果file_name不是绝对路径名,则将其解释为相对于当前目录。

    例外:即使使用--defaults-file,客户端程序也会读取.mylogin.cnf

    有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”

  • --defaults-group-suffix=str

    命令行格式 --defaults-group-suffix=str
    类型 字符串

    不仅读取通常的选项组,还读取具有通常名称和str后缀的组。例如,mysqlbinlog通常读取[client][mysqlbinlog]组。如果此选项给出为--defaults-group-suffix=_othermysqlbinlog还会读取[client_other][mysqlbinlog_other]组。

    有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”

  • --disable-log-bin, -D

    命令行格式 --disable-log-bin

    禁用二进制日志记录。如果您使用--to-last-log选项并将输出发送到同一个MySQL服务器,这对于避免无休止循环很有用。此选项在意外退出后恢复时也很有用,以避免您已记录的语句重复。

    此选项会导致mysqlbinlog在其输出中包含一个SET sql_log_bin = 0语句,以禁用对剩余输出的二进制日志记录。操作sql_log_bin系统变量的会话值是一个受限操作,因此此选项要求您具有设置受限会话变量的足够权限。请参见第 7.1.9.1 节,“系统变量权限”

  • --exclude-gtids=gtid_set

    命令行格式 --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

    命令行格式 --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

    命令行格式 --idempotent
    类型 布尔值
    默认值 true

    告诉MySQL服务器在处理更新时使用幂等模式;这会导致在处理更新时服务器在当前会话中遇到的任何重复键或键不存在错误被抑制。此选项在需要或必须将一个或多个二进制日志重新播放到可能不包含日志所引用的所有数据的MySQL服务器时可能很有用。

    此选项的作用范围仅包括当前的mysqlbinlog客户端和会话。

  • --include-gtids=gtid_set

    命令行格式 --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

    命令行格式 --login-path=name
    类型 字符串

    .mylogin.cnf登录路径文件中的命名登录路径读取选项。一个登录路径是一个选项组,其中包含指定要连接的MySQL服务器和要以其身份进行身份验证的帐户的选项。要创建或修改登录路径文件,请使用mysql_config_editor实用程序。请参见第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”

    有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”

  • --no-login-paths

    命令行格式 --no-login-paths

    跳过从登录路径文件读取选项。

    请参见--login-path以获取相关信息。

    有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”

  • --no-defaults

    命令行格式 --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=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

    命令行格式 --plugin-dir=dir_name
    类型 目录名称

    查找插件的目录。如果使用--default-auth选项指定身份验证插件,但mysqlbinlog找不到它,则指定此选项。请参阅第 8.2.17 节,“可插拔身份验证”

  • --port=port_num, -P port_num

    命令行格式 --port=port_num
    类型 数字
    默认值 3306

    用于连接到远程服务器的 TCP/IP 端口号。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序名称及其从选项文件获取的所有选项。

    有关此选项和其他选项文件选项的更多信息,请参见 第 6.2.2.3 节,“影响选项文件处理的命令行选项”

  • --print-table-metadata

    命令行格式 --print-table-metadata

    从二进制日志中打印与表相关的元数据。使用binlog-row-metadata配置二进制日志记录的与表相关的元数据量。

  • --protocol={TCP|SOCKET|PIPE|MEMORY}

    命令行格式 --protocol=type
    类型 字符串
    默认值 [参见文本]
    有效值

    TCP

    SOCKET

    PIPE

    MEMORY

    用于连接到服务器的传输协议。当其他连接参数通常会导致使用除您想要的协议之外的协议时,它很有用。有关允许值的详细信息,请参阅第 6.2.7 节,“连接传输协议”

  • --raw

    命令行格式 --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-GTIDSBINLOG-DUMP-GTIDS分别使用COM_BINLOG_DUMPCOM_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权限。

    此选项类似于--read-from-remote-source=BINLOG-DUMP-NON-GTIDS

  • --result-file=name, -r name

    命令行格式 --result-file=name

    在没有--raw选项的情况下,此选项指示mysqlbinlog写入文本输出的文件。使用--rawmysqlbinlog为从服务器传输的每个日志文件写入一个二进制输出文件,默认情况下将它们写入当前目录,并使用与原始日志文件相同的名称。在这种情况下,--result-file选项值将被视为修改输出文件名的前缀。

  • --require-row-format

    命令行格式 --require-row-format
    类型 布尔值
    默认值 false

    要求基于行的二进制日志格式用于事件。此选项强制mysqlbinlog输出基于行的复制事件。使用此选项生成的事件流将被使用CHANGE REPLICATION SOURCE TO语句的REQUIRE_ROW_FORMAT选项保护的复制通道接受。服务器上必须设置binlog_format=ROW,其中写入二进制日志。当您指定此选项时,如果mysqlbinlog遇到任何在REQUIRE_ROW_FORMAT限制下不允许的事件,包括LOAD DATA INFILE指令、创建或删除临时表、INTVARRANDUSER_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启动,则对数据库mydbyourdb中任何表的更新都包含在输出中。另一方面,如果它使用--rewrite-db='mydb->yourdb' --database=mydb启动,则mysqlbinlog根本不输出任何语句:由于对mydb的所有更新在应用--database选项之前首先被重写为对yourdb的更新,因此没有更新匹配--database=mydb

  • --server-id=id

    命令行格式 --server-id=id
    类型 数字

    仅显示具有给定服务器 ID 的服务器创建的事件。

  • --server-id-bits=N

    命令行格式 --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_passwordcaching_sha2_password身份验证插件进行身份验证的客户端。对于不使用这些插件之一进行身份验证的帐户,此选项将被忽略。如果未使用基于 RSA 的密码交换,则此选项也会被忽略,例如,当客户端使用安全连接连接到服务器时。

    如果给出--server-public-key-path=file_name并指定有效的公钥文件,它将优先于--get-server-public-key

    对于sha256_password,此选项仅在使用 OpenSSL 构建 MySQL 时才适用。

    有关sha256_passwordcaching_sha2_password插件的信息,请参阅第 8.4.1.2 节,“SHA-256 可插拔身份验证”第 8.4.1.1 节,“缓存 SHA-2 可插拔身份验证”.

  • --set-charset=charset_name

    命令行格式 --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)]

    命令行格式 --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 密钥和证书。请参阅加密连接的命令选项.

  • --ssl-fips-mode={OFF|ON|STRICT}

    命令行格式 --ssl-fips-mode={OFF|ON|STRICT}
    已弃用
    类型 枚举
    默认值 OFF
    有效值

    OFF

    ON

    STRICT

    控制是否在客户端启用 FIPS 模式。--ssl-fips-mode选项与其他--ssl-xxx选项不同,它不用于建立加密连接,而是影响允许哪些加密操作。请参阅第 8.8 节,“FIPS 支持”.

    允许以下--ssl-fips-mode

    • OFF:禁用 FIPS 模式。

    • ON:启用 FIPS 模式。

    • STRICT:启用“严格”FIPS 模式。

    注意

    如果 OpenSSL FIPS 对象模块不可用,则--ssl-fips-mode唯一允许的值为OFF。在这种情况下,将--ssl-fips-mode设置为ONSTRICT会导致客户端在启动时产生警告,并在非 FIPS 模式下运行。

    此选项已过时。预计它将在未来版本的 MySQL 中被删除。

  • --start-datetime=datetime

    命令行格式 --start-datetime=datetime
    类型 日期时间

    从具有等于或晚于datetime参数的时间戳的第一个事件开始读取二进制日志。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值应采用DATETIMETIMESTAMP数据类型接受的格式。例如

    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

    命令行格式 --stop-datetime=datetime

    在具有等于或晚于datetime参数的时间戳的第一个事件停止读取二进制日志。有关datetime值的信息,请参阅--start-datetime选项的说明。

    此选项对于特定时间点恢复很有用。请参阅第 9.5 节,“特定时间点(增量)恢复”.

  • --stop-never

    命令行格式 --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

    命令行格式 --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

    命令行格式 --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, -c

    命令行格式 --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 选项。

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

警告

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