Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  mysqlbinlog — Utility for Processing Binary Log Files

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 idserver_ id值,该事件源自的服务器。end_log_pos表示下一个事件开始的地方(即当前事件结束位置 + 1)。thread_id指示执行该事件的线程。exec_time是源复制服务器上执行事件所花费的时间。在副本服务器上,它是源服务器上开始执行事件的时间戳和副本服务器上结束执行事件的时间戳之间的差值。这个差异作为一个指示复制落后于源的程度的指标。error_code表示执行事件时的结果。零意味着没有错误发生。

Note

当使用事件组时,可能会将事件的文件偏移量分组在一起,并且可能会将事件的注释分组在一起。不要将这些分组的事件误认为是空的文件偏移量。

mysqlbinlog的输出中,可以重新执行(例如,将其作为输入给mysql)以重做日志中的语句。这对于在意外服务器退出后进行恢复操作非常有用。有关其他使用示例的讨论,请参阅本节稍后和第9.5节,“点时间(增量)恢复”。要执行BINLOG用于mysqlbinlog的内部使用语句,用户需要拥有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节,“加密二进制日志文件和中继日志文件”

当二进制日志事务payload被压缩时,mysqlbinlog 会自动解压和解码事务payload,并以未压缩事件的方式打印它们。当binlog_transaction_compression 设置为ON时,事务payload会被压缩并作为单个事件(一个Transaction_payload_event)写入服务器的二进制日志文件。使用--verbose选项时,mysqlbinlog 会添加注释,说明使用的压缩算法、接收到的原始压缩payload大小以及解压后的payload大小。

Note

对于mysqlbinlog 一个事件的结束位置(end_log_pos),如果该事件是压缩事务payload的一部分,那么这个位置与原始压缩payload的结束位置相同。因此,多个解压后的事件可以有相同的结束位置。

mysqlbinlog 的连接压缩在事务payload已经被压缩时会减少,但仍然作用于未压缩的事务和头部。

有关二进制日志事务压缩的更多信息,请参阅mysqlbinlog

当运行mysqlbinlog 时,特别是对一个大型的二进制日志文件,请注意文件系统有足够空间来存储结果文件。要配置mysqlbinlog 用于临时文件的目录,请使用TMPDIR环境变量。

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

mysqlbinlog 支持以下选项,可以在命令行或mysqlbinlogmysqlbinlog 组中的选项文件中指定。有关MySQL程序使用的选项文件的信息,请参阅mysqlbinlog

表格 6.20 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 用于测试和调试。请参阅适用默认值及其它详细信息
--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 如果mysqldump读取到它不认识的二进制日志事件,它会打印一个警告
--get-server-public-key 从服务器请求RSA公钥
--help 显示帮助信息并退出
--hexdump 在注释中显示日志的十六进制.dump
--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如何解释在MySQL集群版本中写入日志时由mysqld服务器使用的服务器ID位数;仅支持MySQL集群版本的mysqlbinlog。
--server-public-key-path 公钥文件路径名。
--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 不在请求的二进制日志文件结束时停止,而是继续打印到最后一个二进制日志文件。
--user 用于连接服务器的MySQL用户名。
--verbose 重建行事件作为SQL语句
--verify-binlog-checksum 验证二进制日志中的校验和
--version 显示版本信息并退出
--zstd-compression-level 用于连接到使用ZSTD压缩的服务器的压缩级别

  • --help, -?

    Command-Line Format --help

    显示帮助信息并退出。

  • --base64-output=value

    Command-Line Format --base64-output=value
    Type 字符串
    Default Value AUTO
    Valid Values

    AUTO

    NEVER

    DECODE-ROWS

    这个选项决定了何时应该以base64编码的字符串形式显示事件,使用BINLOG语句。该选项有以下可接受值(不区分大小写):

    • 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 Row Event Display”

  • --bind-address=ip_address

    Command-Line Format --bind-address=ip_地址

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

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

    Command-Line Format --binlog-row-event-max-size=#
    Type 数字
    Default Value 4294967040
    Minimum Value 256
    Maximum Value 18446744073709547520

    指定行基于的二进制日志事件的最大大小,单位为字节。行被分组到小于或等于该大小的事件中,如果可能的话。值必须是256的倍数。默认值为4GB。

  • --character-sets-dir=dir_name

    Command-Line Format --character-sets-dir=dir_name
    Type 目录名称

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

  • --compress

    Command-Line Format --compress[={OFF|ON}]
    Deprecated 是的
    Type 布尔值
    Default Value OFF

    如果可能,压缩客户端和服务器之间发送的所有信息。请参阅第6.2.8节,“连接压缩控制”

    此选项已被弃用。预计将在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”

  • --database=db_name, -d db_name

    Command-Line Format --database=db_name
    Type 字符串

    这项选项会导致 mysqlbinlog 输出来自二进制日志(仅限本地日志)的条目,这些条目在 db_ name 被选为 USE 语句的默认数据库时发生。

    对于 --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 语句,因为没有默认数据库。它输出后面三个 INSERT 语句,紧随 USE test,但不输出后面三个 INSERT 语句,紧随 USE db2

    mysqlbinlog --database=db2 不输出前两个 INSERT 语句,因为没有默认数据库。它不输出后面三个 INSERT 语句,紧随 USE test,但输出后面三个 INSERT 语句,紧随 USE db2

    行日志格式。 mysqlbinlog 只输出更改 db_ name 中表的条目。默认数据库对此无影响。假设上述二进制日志在使用行日志格式而不是语句日志格式时创建。 mysqlbinlog --database=test 只输出修改 test 数据库中 t1 表的条目,无论是否发出 USE 语句或默认数据库是什么。

    如果服务器正在运行,并且binlog_格式设置为MIXED,并且您希望能够使用mysqlbinlog工具,并且使用--database选项,您必须确保被修改的表位于通过USE语句选择的数据库中。特别是,不应该使用跨库更新。

    当与--rewrite-db选项一起使用时,--rewrite-db选项会首先应用,然后是--database选项,使用重写后的数据库名称。这些选项的顺序并不重要。

  • --debug[=调试选项], -#[调试选项]

    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发布版本是使用此选项构建的。

  • --debug-check

    Command-Line Format --debug-check
    Type 布尔值
    Default Value FALSE

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

    这个选项只有在MySQL使用WITH_DEBUG时才可用。Oracle提供的MySQL发布版本是使用此选项构建的。

  • --debug-info

    Command-Line Format --debug-info
    Type 布尔值
    Default Value FALSE

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

    这个选项只有在MySQL使用WITH_DEBUG时才可用。Oracle提供的MySQL发布版本是使用此选项构建的。

  • --default-auth=插件

    Command-Line Format --default-auth=plugin
    Type 字符串

    关于哪个客户端认证插件应该使用的提示。请参阅第 8.2.17 节,“可插拔认证”

  • --defaults-extra-file=文件名

    Command-Line Format --defaults-extra-file=file_name
    Type 文件名

    在全局选项文件之后读取这个选项文件,但是在用户选项文件之前(在 Unix 上)。如果file_name不存在或无法访问,会发生错误。如果file_name不是绝对路径名,它将被解释为相对于当前目录的路径。

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

  • --defaults-file=文件名

    Command-Line Format --defaults-file=file_name
    Type 文件名

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

    异常:即使使用--defaults-file,客户端程序仍然读取.mylogin.cnf

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

  • --defaults-group-suffix=str

    Command-Line Format --defaults-group-suffix=str
    Type 字符串

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

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

  • --disable-log-bin, -D

    Command-Line Format --disable-log-bin

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

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

  • --exclude-gtids=gtid_set

    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读取到这样的事件,它会停止。

  • --get-server-public-key

    Command-Line Format --get-server-public-key
    Type 布尔值

    从服务器请求所需的公钥,以便进行基于RSA密钥对的密码交换。这一选项适用于使用缓存SHA-2插件进行身份验证的客户端。对于该插件,服务器不会发送公钥,除非被请求。这一选项对不使用RSA密码交换的客户端(即通过安全连接与服务器通信的客户端)无效。

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

    有关缓存SHA-2插件的信息,请参阅第8.4.1.2节,“缓存SHA-2插件”

  • --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服务器上获取二进制日志。

  • --idempotent

    Command-Line Format --idempotent
    Type 布尔值
    Default Value true

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

    这一选项的作用范围仅限于当前mysqlbinlog客户端和会话。

  • --include-gtids=gtid_set

    Command-Line Format --include-gtids=gtid_set
    Type 字符串
    Default Value

    只显示列表中的组。

  • --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选项来指定mysqlbinlog一个不同的目录用于数据文件,并且在处理mysqlbinlog的输出时,使用相同的目录指定给--load-data-local-dir选项给mysql。例如:

    mysqlbinlog --local-load=/my/local/data ...
        | mysql --load-data-local-dir=/my/local/data ...
    Important

    这些临时文件不会自动由mysqlbinlog或任何其他MySQL程序删除。

  • --login-path=name

    Command-Line Format --login-path=name
    Type 字符串

    从命名的登录路径中读取选项。一个“登录路径”是一个包含指定连接到哪个MySQL服务器以及以何种身份进行认证的选项组。在创建或修改登录路径文件时,使用mysql_config_editor工具。请参阅第6.6.7节,“mysql_config_editor — MySQL配置工具”

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

  • --no-login-paths

    Command-Line Format --no-login-paths

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

    请参阅--login-path的相关信息。

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

  • --no-defaults

    Command-Line Format --no-defaults

    不要读取任何选项文件。如果程序启动失败,因为从选项文件中读取了未知的选项,--no-defaults可以用来防止它们被读取。

    异常情况是,即使使用了--no-defaults,也会读取.mylogin.cnf文件。这允许在密码上使用更安全的方式,即使不使用命令行参数。要创建.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条记录。

  • --open-files-limit=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选项。

  • --plugin-dir=dir_name

    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端口号。

  • --print-defaults

    Command-Line Format --print-defaults

    打印程序名称及其来自选项文件的所有选项。

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

  • --print-table-metadata

    Command-Line Format --print-table-metadata

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

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

    Command-Line Format --protocol=type
    Type 字符串
    Default Value [see text]
    Valid Values

    TCP

    SOCKET

    PIPE

    MEMORY

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

  • --raw

    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服务器读取二进制日志,使用--read-from-remote-source=BINLOG-DUMP-NON-GTIDS--read-from-remote-source=BINLOG-DUMP-GTIDS设置选项值为BINLOG-DUMP-NON-GTIDSBINLOG-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权限。

    这与--read-from-remote-source=BINLOG-DUMP-NON-GTIDS相同。

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

    Command-Line Format --result-file=name

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

  • --require-row-format

    Command-Line Format --require-row-format
    Type 布尔值
    Default Value false

    要求行级二进制日志格式用于事件。该选项强制实施行级复制事件对于mysqlbinlog的输出。产生的事件流将被接受由使用CHANGE REPLICATION SOURCE TO语句安全的复制通道。服务器上必须设置binlog_ format=ROW,在该服务器上写入二进制日志。当您指定此选项时,如果mysqlbinlog遇到任何不符合REQUIRE_ROW_FORMAT限制的事件,包括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]

    当从行级或语句级日志读取时,将所有USE子句的mysqlbinlog中的表名替换为USE子句的新名称。对于行级日志,重写也应用于行;对于语句级日志,重写应用于USE子句。

    Warning

    在使用此选项时,不会对包含数据库名称的表名进行重写,以便使用新名称的语句。

    要应用多个重写规则,请指定该选项多次,如下所示:

    当与--database选项一起使用时,--rewrite-db选项首先应用;然后应用--database选项,使用重写后的数据库名称。这些选项的顺序对结果没有影响。

    mysqlbinlog --rewrite-db='dbcurrent->dbold' --rewrite-db='dbtest->dbcurrent' \
        binlog.00001 > /tmp/statements.sql

    这意味着,如果mysqlbinlog--rewrite-db='mydb->yourdb' --database=yourdb'的形式启动,则输出将包含任何表在数据库mydbyourdb中的更新。另一方面,如果它以--rewrite-db='mydb->yourdb' --database=mydb'的形式启动,则mysqlbinlog将不输出任何语句:由于所有对mydb的更新首先被重写为对yourdb的更新,然后应用--database选项,剩下的没有匹配--database=mydb'的更新。

    --server-id=id

  • --server-id=id

    Command-Line Format 数字
    Type 仅显示由给定服务器ID创建的事件。

    --server-id-bits=N

  • --server-id-bits=#

    Command-Line Format 数字
    Type 32
    Default Value 7
    Minimum Value 32
    Maximum Value 32

    使用仅前 N 位的 server_ id 来标识服务器。如果由一个具有 server-id-bits 设置为小于 32 的 mysqld 运行,并且用户数据存储在最重要位上,运行 mysqlbinlog 时使用 --server-id-bits 设置为 32,可以使得这些数据可见。

    这个选项仅由 NDB 集群分发版本的 mysqlbinlog 支持,或者构建有 NDB 集群支持的版本。

  • --server-public-key-path=file_name

    Command-Line Format --server-public-key-path=file_name
    Type 文件名

    指定一个包含客户端侧的 RSA 密钥对公钥的 PEM 格式文件路径,这个公钥由服务器用于基于 RSA 密钥对的密码交换。这选项适用于使用 sha256_passwordcaching_sha2_password 认证插件进行认证的客户端。如果 RSA 密钥对密码交换不被使用(例如,当客户端通过安全连接连接到服务器时),则忽略这个选项。

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

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

    有关 sha256_passwordcaching_sha2_password 插件的信息,请参阅第 8.4.1.3 节,“SHA-256 插件认证”第 8.4.1.2 节,“Caching SHA-2 插件认证”

  • --set-charset=charset_name

    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

    仅显示日志文件中的语句,而不包括任何额外信息或基于行的事件。这用于测试,只应在生产系统中使用。它已被弃用,未来版本中可能会移除。

  • --skip-gtids[=(true|false)]

    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={file_name|pipe_name}
    Type 字符串

    对于连接到localhost的连接,Unix套接字文件路径,或在Windows上,用于命名管道的名称。

    在Windows上,此选项仅适用于服务器以支持命名管道连接而启动时启用了named_pipe系统变量。此外,执行连接的用户必须是Windows组中的一员,该组由named_pipe_full_access_group系统变量指定。

  • --ssl*

    --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-xxx开头的选项不同,--ssl-fips-mode用于影响哪些加密操作被允许,而不是用于建立加密连接。请参阅第8.8节,“FIPS支持”

    这些--ssl-fips-mode值是允许的:

    • OFF: 禁用FIPS模式。

    • ON: 启用FIPS模式。

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

    Note

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

    此选项已弃用。预计将在MySQL的未来版本中移除。

  • --start-datetime=datetime

    Command-Line Format --start-datetime=datetime
    Type 日期时间

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

    mysqlbinlog --start-datetime="2005-12-25 11:25:56" binlog.000003

    此选项对于点时间恢复非常有用。请参阅in-Time (Incremental) Recovery">第9.5节,“点时间(增量)恢复”

  • --start-position=N, -j N

    Command-Line Format --start-position=#
    Type 数字

    从二进制日志的指定位置开始解码,包括所有事件在该位置或之后开始的输出。位置是一个字节点,在日志文件中,不是事件计数器;它需要指向一个事件的开始位置,以生成有用的输出。这选项适用于命令行上第一个日志文件名。

    这个选项支持的最大值为18446744073709551616(2^64-1),除非同时使用--read-from-remote-server--read-from-remote-source,那么最大值为4294967295。

    这个选项对于点时间恢复非常有用。参见第9.5节,“Point-在时间(增量)恢复”

  • --stop-datetime=datetime

    Command-Line Format --stop-datetime=datetime

    在遇到具有或晚于指定--start-datetime参数值的事件时停止读取二进制日志。有关--start-datetime参数值的描述,请参阅该选项的说明。

    这个选项对于点时间恢复非常有用。参见第9.5节,“Point-在时间(增量)恢复”

  • --stop-never

    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节,“指定 mysqlbinlog 服务器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选项来指定为mysqlbinlog报告的服务器ID。

  • --stop-position=N

    Command-Line Format --stop-position=#
    Type 数字

    在日志文件中停止解码并排除任何开始位置为N或之后的事件。位置是指向日志文件中的字节点,不是事件计数器;它需要指向最后一个要包含在输出中的事件的起始位置之前的位置。这个选项适用于命令行上最后一个命名的日志文件。

    这项选项对于进行点时恢复非常有用。请参阅第9.5节,“点时(增量)恢复”

  • --tls-ciphersuites=ciphersuite_list

    Command-Line Format --tls-ciphersuites=ciphersuite_list
    Type 字符串

    用于加密连接的TLSv1.3许可的密码套件。值是由冒号分隔的一或多个密码套件名称组成的列表。可以为此选项命名的密码套件取决于编译MySQL时使用的SSL库。请参阅第8.3.2节,“加密连接TLS协议和密码”

  • --tls-sni-servername=server_name

    Command-Line Format --tls-sni-servername=server_name
    Type 字符串

    当指定时,该名称将传递给libmysqlclient C API库,使用mysql_options()MYSQL_OPT_TLS_SNI_SERVERNAME选项。服务器名称不区分大小写。要查看当前会话中客户端指定的服务器名称(如果有),请检查Tls_sni_server_name状态变量。

    Server Name Indication (SNI) 是TLS协议的一个扩展(OpenSSL必须使用TLS扩展编译才能使此选项工作)。MySQL对SNI的实现仅限于客户端侧。

  • --tls-version=protocol_list

    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协议和密码”

  • --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账户的用户名。

    如果您正在使用 Rewriter 插件,您应该授予该用户 SKIP_QUERY_REWRITE 权限。

  • --verbose, -v

    Command-Line Format --verbose

    重建行事件并以注释形式显示它们,包括适用的表分区信息。如果提供了两次(通过传递“-vv”或“--verbose --verbose”,输出将包含指示列数据类型和一些元数据的注释,以及如果系统变量 binlog_rows_query_log_events 设置为 TRUE 的查询日志事件信息。

    有关使用 --base64-output--verbose 对行事件输出的效果的示例,请参阅第6.6.9.2节,“mysqlbinlog 行事件显示”

  • --verify-binlog-checksum, -c

    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 程序执行其中包含的语句:

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

mysqlbinlog被调用时,它可以使用--start-position选项来显示在二进制日志中偏移量大于或等于给定位置的事件(必须匹配一个事件的开始)。它还可以根据--stop-datetime选项停止,并且可以回滚到特定的日期和时间点。这使得您能够使用--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进程尝试使用该表时,服务器会报告“unknown table.

为了避免这些问题,请使用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"

您还可以将多个二进制日志文件作为流输入提供给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选项。

因为 mysqlbinlogLOAD DATA 语句转换为 LOAD DATA LOCAL 语句(即添加了 LOCAL),您处理这些语句的客户端和服务器都必须配置有 LOCAL 能力。请参阅第 8.1.6 节,“LOAD DATA LOCAL 的安全考虑”

Warning

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