暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

4.6.8 **mysqlbinlog-**处理二进制日志文件的实用程序

原创 由迪 2020-12-24
829

服务器的二进制日志由包含“事件”的文件组成,这些 事件描述了对数据库内容的修改。服务器以二进制格式写入这些文件。要以文本格式显示其内容,请使用 mysqlbinlog实用程序。您还可以使用 mysqlbinlog在复制设置中显示由副本服务器写入的中继日志文件的内容,因为中继日志的格式与二进制日志相同。第5.4.4节“二进制日志”第17.2.4节“中继日志和复制元数据存储库”中进一步讨论了二进制日志和中继日志 。

像这样 调用mysqlbinlog

shell> mysqlbinlog [options] log_file ...

例如,要显示名为的二进制日志文件的内容binlog.000003,请使用以下命令:

shell> mysqlbinlog binlog.0000003

输出包括中包含的事件 binlog.000003。对于基于语句的日志记录,事件信息包括SQL语句,在其上执行该语句的服务器的ID,该语句在执行时的时间戳,所花费的时间等等。对于基于行的日志记录,该事件指示行更改,而不是SQL语句。有关日志记录模式的信息请参见第17.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指示执行事件的结果。零表示没有错误发生。

注意

使用事件组时,可以将事件的文件偏移量分组在一起,并且可以将事件的注释分组在一起。请勿将这些分组的事件误认为空白文件偏移量。

可以重新执行mysqlbinlog 的输出(例如,通过将其用作mysql的输入 ),以重做日志中的语句。这对于服务器意外退出后的恢复操作很有用。有关其他用法示例,请参见本节后面的讨论以及第7.5节“时间点(增量)恢复”。为了执行mysqlbinlog使用的内部使用 BINLOG语句 ,用户需要 特权(或已弃用的特权)或特权加上适当的特权才能执行每个日志事件。 BINLOG_ADMINSUPERREPLICATION_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根本无法将该文件识别为二进制日志文件。有关二进制日志加密的更多信息,请参见 第17.3.2节“加密二进制日志文件和中继日志文件”

当二进制日志事务负载被压缩后(可以从MySQL 8.0.20开始执行), 该版本的mysqlbinlog版本自动解压缩和解码事务负载,并像处理未压缩事件一样打印它们。较早版本的mysqlbinlog无法读取压缩的事务负载。当服务器的 binlog_transaction_compression 系统变量设置ON为时,事务有效负载将被压缩,然后作为单个事件(a Transaction_payload_event)写入服务器的二进制日志文件 。使用该 --verbose选项, mysqlbinlog 添加注释,说明使用的压缩算法,最初收到的压缩有效负载大小以及解压缩后的有效负载大小。

注意

mysqlbinlog针对作为压缩事务负载的一部分的单个事件所声明 的结束位置(end_log_pos) 与原始压缩负载的结束位置相同。因此,多个解压缩事件可以具有相同的结束位置。

如果事务有效负载已经被压缩,但mysqlbinlog自身的连接压缩的作用较小,但仍可对未压缩的事务和标头进行操作。

有关二进制日志事务压缩的更多信息,请参见 第5.4.4.5节“二进制日志事务压缩”

对大型二进制日志 运行mysqlbinlog时,请注意文件系统有足够的空间容纳生成的文件。要配置 mysqlbinlog用于临时文件的目录,请使用 TMPDIR环境变量。

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

mysqlbinlog支持以下选项,可以在命令行或 选项文件的 [mysqlbinlog][client]组中指定。有关MySQL程序使用的选项文件的信息,请参见第4.2.2.2节“使用选项文件”

表4.21 mysqlbinlog选项

选项名称 描述 介绍了 不推荐使用
–base64-输出 使用base-64编码打印二进制日志条目
–bind-address 使用指定的网络接口连接到MySQL Server
–binlog-row-event-max-size 二进制日志最大事件大小
–character-sets-dir 字符集的安装目录
- 压缩 压缩客户端和服务器之间发送的所有信息 8.0.17 8.0.18
-压缩算法 允许连接服务器的压缩算法 8.0.18
–connection-server-id 用于测试和调试。有关适用的默认值和其他详细信息,请参见文本
- 数据库 仅列出该数据库的条目
-调试 编写调试日志
-调试检查 程序退出时打印调试信息
- 调试信息 程序退出时打印调试信息,内存和CPU统计信息
–default-auth 身份验证插件使用
–defaults-extra-file 除常规选项文件外,还读取命名的选项文件
–defaults-file 只读命名的选项文件
–defaults-group-suffix 选项组后缀值
–disable-log-bin 禁用二进制日志记录
–exclude-gtids 不要显示提供的GTID集中的任何组
–force-if-open 读取二进制日志文件,即使打开或未正确关闭
-力读 如果mysqlbinlog读取了无法识别的二进制日志事件,则会输出警告
–get-server-public-key 从服务器请求RSA公钥
- 救命 显示帮助信息并退出
–hexdump 显示登录注释的十六进制转储
- 主办 MySQL服务器所在的主机
-幂等 使服务器仅在从该会话处理二进制日志更新时使用幂等模式
–include-gtids 仅显示提供的GTID集中的组
-本地负载 在指定目录中为LOAD DATA准备本地临时文件
-登录路径 从.mylogin.cnf中读取登录路径选项
-无默认值 不读取选项文件
- 抵消 跳过日志中的前N个条目
- 密码 连接服务器时使用的密码
–plugin-dir 安装插件的目录
- 港口 用于连接的TCP / IP端口号
–print-defaults 打印默认选项
–print-table-metadata 打印表格元数据
- 协议 使用的传输协议
- 生的 将事件以原始(二进制)格式写入输出文件
-从远程主机读取 从MySQL主服务器读取二进制日志,而不是读取本地日志文件
-从远程服务器读取 从MySQL服务器而不是本地日志文件中读取二进制日志
–require-row-format 需要基于行的二进制日志记录格式 8.0.19
-结果文件 直接输出到命名文件
–rewrite-db 从基于行的格式编写的日志中播放时,为数据库创建重写规则。可多次使用
–server-id 仅提取由具有给定服务器ID的服务器创建的那些事件
–server-id-bits 告诉mysqlbinlog当mysqld编写的server-id-bits设置为小于最大值时,如何解释二进制日志中的服务器ID;仅受MySQL Cluster版本的mysqlbinlog支持
–server-public-key-path 包含RSA公钥的文件的路径名
–set-字符集 在输出中添加SET NAMES charset_name语句
–shared-memory-base-name 共享内存连接的共享内存名称(仅Windows)
- 简写 仅显示日志中包含的语句
–skip-gtids 不要打印任何GTID。从包含GTID的二进制日志中写入转储文件时使用此功能
- 插座 Unix套接字文件或Windows命名管道使用
–ssl-ca 包含受信任的SSL证书颁发机构列表的文件
–ssl-capath 包含受信任的SSL证书颁发机构证书文件的目录
–ssl-cert 包含X.509证书的文件
–ssl-cipher 连接加密的允许密码
–ssl-crl 包含证书吊销列表的文件
–ssl-crlpath 包含证书吊销列表文件的目录
–ssl-fips-mode 是否在客户端启用FIPS模式
–ssl键 包含X.509密钥的文件
–ssl模式 与服务器连接的所需安全状态
-开始日期时间 从第一个事件中读取时间戳等于或晚于datetime参数的二进制日志
-开始位置 从第一个事件中位置等于或大于参数的二进制日志解码
–stop-datetime 在时间戳等于或大于datetime参数的第一个事件中停止读取二进制日志
-永不停止 读取最后一个二进制日志文件后保持与服务器的连接
–stop-never-slave-server-id 连接到服务器时要报告的从服务器ID
-停止位置 在第一个事件中停止解码二进制日志,位置等于或大于参数
–tls-ciphersuites 允许的TLSv1.3密码套件用于加密连接 8.0.16
–tls-version 允许的TLS协议进行加密连接
–to-last-log 不要在从MySQL服务器请求的二进制日志的结尾处停止,而要继续打印到最后一个二进制日志的结尾
- 用户 连接服务器时使用的MySQL用户名
-详细 将行事件重建为SQL语句
–verify-binlog-checksum 验证二进制日志中的校验和
- 版 显示版本信息并退出
–zstd-压缩级别 与使用zstd压缩的服务器的连接的压缩级别 8.0.18
  • --help-?

    显示帮助消息并退出。

  • --base64-output=*value*

    此选项确定何时使用BINLOG语句将事件显示为以base-64字符串编码 。该选项具有以下允许值(不区分大小写):

    • AUTO(“自动”)或 UNSPEC(“未指定”)BINLOG在必要时(即,用于格式描述事件和行事件)自动显示 语句。如果没有 --base64-output 给出选项,则效果与相同 --base64-output=AUTO

      注意

      BINLOG 如果打算使用mysqlbinlog的输出重新执行二进制日志文件的内容,则 自动显示是唯一安全的行为。其他选项值仅用于调试或测试目的,因为它们可能会产生不包含所有可执行形式的事件的输出。

    • NEVER使 BINLOG语句不显示。如果发现必须使用来显示的行事件,则mysqlbinlog退出并出现错误BINLOG

    • DECODE-ROWS通过还指定选项,向mysqlbinlog指定 打算对行事件进行解码并显示为带注释的SQL语句 --verbose。与一样NEVERDECODE-ROWS禁止显示 BINLOG语句,但与不同NEVER,如果找到行事件,它不会退出并显示错误。

    有关显示行事件输出--base64-output及其 --verbose对行事件输出的影响的示例 ,请参见第4.6.8.2节“ mysqlbinlog行事件显示”

  • --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*

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

  • --compress

    尽可能压缩客户端和服务器之间发送的所有信息。请参见 第4.2.8节“连接压缩控制”

    MySQL 8.0.17中添加了此选项。从MySQL 8.0.18开始,已弃用。希望在将来的MySQL版本中将其删除。请参阅 配置旧版连接压缩

  • --compression-algorithms=*value*

    用于连接到服务器的允许的压缩算法。可用算法与protocol_compression_algorithms 系统变量相同 。默认值为 uncompressed

    有关更多信息,请参见 第4.2.8节“连接压缩控制”

    该选项是在MySQL 8.0.18中添加的。

  • --connection-server-id=*server_id*

    --connection-server-id 指定mysqlbinlog 连接到服务器时报告的服务器ID 。它可以用来避免与副本服务器或另一个mysqlbinlog进程的ID冲突 。

    如果--read-from-remote-server 指定了该 选项,则mysqlbinlog报告服务器ID为0,该值告诉服务器在发送最后一个日志文件后断开连接(非阻塞行为)。如果--stop-never还指定了该 选项来维持与服务器的连接,则 mysqlbinlog默认报告服务器ID为1而不是0,并且 --connection-server-id 可以根据需要替换该服务器ID。请参见 第4.6.8.4节“指定mysqlbinlog服务器ID”

  • --database=*db_name*-d *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 DATABASEALTER 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 语句,因为没有默认数据库。它输出以下三个INSERT语句USE test,但不输出以下三个 INSERT语句 USE db2

    mysqlbinlog --database = db2不会输出前两个INSERT 语句,因为没有默认数据库。它不会输出以下三个INSERT 语句 USE test,但是会输出以下三个INSERT 语句 USE db2

    基于行的日志记录。 mysqlbinlog仅输出更改属于的表的条目 db_name。默认数据库对此没有影响。假设刚刚描述的二进制日志是使用基于行的日志而不是基于语句的日志创建的。mysqlbinlog --database = test仅输出那些t1在测试数据库中修改过的条目,而不管是否USE 已发布或默认数据库是什么。

    如果服务器在binlog_format设置为的 情况下运行, MIXED并且您希望可以将该选项与mysqlbinlog一起使用,则 --database必须确保已修改的表位于所选择的数据库中USE。(特别是,不应使用跨数据库更新。)

    --rewrite-db选项一起使用时 ,将 --rewrite-db首先应用选项;然后--database使用重写的数据库名称应用该选项。在这方面,提供选项的顺序没有区别。

  • --debug[=*debug_options*\]-# [*debug_options*]

    编写调试日志。典型的 *debug_options*字符串是 。默认值为 。 d:t:o,*file_name*``d:t:o,/tmp/mysqlbinlog.trace

    仅当MySQL是使用构建的时,此选项才可用 WITH_DEBUG。Oracle提供的MySQL版本二进制文件不是 使用此选项构建的。

  • --debug-check

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

    仅当MySQL是使用构建的时,此选项才可用 WITH_DEBUG。Oracle提供的MySQL版本二进制文件不是 使用此选项构建的。

  • --debug-info

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

    仅当MySQL是使用构建的时,此选项才可用 WITH_DEBUG。Oracle提供的MySQL版本二进制文件不是 使用此选项构建的。

  • --default-auth=*plugin*

    有关使用哪个客户端身份验证插件的提示。请参见第6.2.17节“可插入身份验证”

  • --defaults-extra-file=*file_name*

    在全局选项文件之后但在用户选项文件之前(在Unix上)读取此选项文件。如果文件不存在或无法访问,则发生错误。 *file_name*如果指定为相对路径名而不是完整路径名,则相对于当前目录解释。

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

  • --defaults-file=*file_name*

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

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

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

  • --defaults-group-suffix=*str*

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

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

  • --disable-log-bin-D

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

    该选项使mysqlbinlogSET sql_log_bin = 0在其输出中包含一条语句,以禁用其余输出的二进制日志记录。操纵sql_log_bin系统变量的会话值 是受限制的操作,因此此选项要求您具有足以设置受限制的会话变量的特权。请参见第5.1.9.1节“系统变量特权”

  • --exclude-gtids=*gtid_set*

    不要显示中列出的任何组 gtid_set

  • --force-if-open-F

    读取二进制日志文件,即使它们已打开或未正确关闭。

  • --force-read-f

    使用此选项,如果mysqlbinlog读取了它无法识别的二进制日志事件,它将打印警告,忽略该事件,然后继续。如果没有此选项,则mysqlbinlog会在读取到此类事件时停止。

  • --get-server-public-key

    从服务器请求基于RSA密钥对的密码交换所需的公共密钥。此选项适用于使用caching_sha2_password身份验证插件进行身份验证的客户端 。对于该插件,除非请求,否则服务器不会发送公钥。对于未使用该插件进行身份验证的帐户,将忽略此选项。如果未使用基于RSA的密码交换,也将被忽略,例如客户端使用安全连接连接到服务器时。

    如果 给出并指定了有效的公共密钥文件,则优先于 。 --server-public-key-path=*file_name*--get-server-public-key

    有关caching_sha2_password插件的信息 ,请参见 第6.4.1.2节“缓存SHA-2可插拔身份验证”

  • --hexdump-H

    显示日志注释的十六进制转储,如 第4.6.8.1节“ mysqlbinlog十六进制转储格式”所述。十六进制输出可能有助于复制调试。

  • --host=*host_name*-h *host_name*

    从给定主机上的MySQL服务器获取二进制日志。

  • --idempotent

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

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

  • --include-gtids=*gtid_set*

    仅显示中列出的组 gtid_set

  • --local-load=*dir_name*-l *dir_name*

    对于与LOAD DATA语句相对应的数据加载操作 , mysqlbinlog从二进制日志事件中提取文件,将它们作为临时ffiles写入本地文件系统,并编写 LOAD DATA LOCAL语句以导致文件被加载。默认情况下,mysqlbinlog将这些临时文件写入特定于操作系统的目录。该--local-load选项可用于显式指定mysqlbinlog应该在其中 准备本地临时文件的目录。

    由于其他进程可以将文件写入默认的系统特定目录,因此建议为mysqlbinlog指定 --local-load选项 以为数据文件指定其他目录,然后在处理mysqlbinlog的输出时 通过为mysql指定选项来指定同一目录 。例如: --load-data-local-dir

    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实用程序。请参见 第4.6.7节“ mysql_config_editor -MySQL配置实用程序”

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

  • --no-defaults

    不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,--no-defaults则可以使用该选项 来防止读取它们。

    唯一的例外是,.mylogin.cnf 在所有情况下都会读取该文件(如果存在)。这样,即使--no-defaults使用密码,也可以通过比命令行更安全的方式指定密码 。(.mylogin.cnfmysql_config_editor实用程序创建 。请参见 第4.6.7节“ mysql_config_editor -MySQL配置实用程序”。)

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

  • --offset=*N*-o *N*

    跳过*N*日志中的第一项。

  • --open-files-limit=*N*

    指定要保留的打开文件描述符的数量。

  • --password[=*password*\]-p[*password*]

    用于连接服务器的MySQL帐户的密码。密码值是可选的。如果未给出,则 mysqlbinlog提示输入一个。如果给出,则或 后面的密码之间 必须没有空格。如果未指定密码选项,则默认为不发送密码。 --password=-p

    在命令行上指定密码应该被认为是不安全的。为避免在命令行上输入密码,请使用选项文件。请参见 第6.1.2.1节“最终用户密码安全准则”

    要明确指定没有密码,并且mysqlbinlog不应提示输入密码 ,请使用该 --skip-password 选项。

  • --plugin-dir=*dir_name*

    在其中查找插件的目录。如果该--default-auth选项用于指定身份验证插件,但 mysqlbinlog找不到它,请指定此选项 。请参见 第6.2.17节“可插入身份验证”

  • --port=*port_num*-P *port_num*

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

  • --print-defaults

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

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

  • --print-table-metadata

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

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

    用于连接到服务器的传输协议。当其他连接参数通常导致使用您想要的协议以外的协议时,此功能很有用。有关允许值的详细信息,请参见 第4.2.7节“连接传输协议”

  • --raw

    默认情况下,mysqlbinlog读取二进制日志文件并以文本格式写入事件。该 --raw选项告诉 mysqlbinlog以其原始二进制格式编写它们。它的使用 --read-from-remote-server 也需要使用,因为文件是从服务器请求的。 mysqlbinlog为从服务器读取的每个文件写一个输出文件。该 --raw选项可用于备份服务器的二进制日志。使用该 --stop-never选项,备份是“实时的”,因为 mysqlbinlog保持连接到服务器。默认情况下,输出文件将以与原始日志文件相同的名称写入当前目录。可以使用该--result-file选项修改输出文件名 。有关更多信息,请参见 第4.6.8.3节“使用mysqlbinlog备份二进制日志文件”

  • --read-from-remote-master=*type*

    通过将选项值分别设置为或 , 使用COM_BINLOG_DUMPCOM_BINLOG_DUMP_GTID命令 从MySQL服务器读取二进制日志 。如果 与结合使用 ,则可以在源上过滤掉事务,从而避免不必要的网络流量。 BINLOG-DUMP-NON-GTIDS``BINLOG-DUMP-GTIDS--read-from-remote-master=BINLOG-DUMP-GTIDS--exclude-gtids

    连接参数选项与此选项或选项一起使用 --read-from-remote-server 。这些选项包括 --host--password--port--protocol--socket,和 --user。如果两个远程选项均未指定,则连接参数选项将被忽略。

    REPLICATION SLAVE 权限才能使用此选项。

  • --read-from-remote-server-R

    从MySQL服务器读取二进制日志,而不是读取本地日志文件。此选项要求远程服务器正在运行。它仅适用于远程服务器上的二进制日志文件,不适用于中继日志文件。

    连接参数选项与此选项或选项一起使用 --read-from-remote-master 。这些选项包括 --host--password--port--protocol--socket,和 --user。如果两个远程选项均未指定,则连接参数选项将被忽略。

    REPLICATION SLAVE 权限才能使用此选项。

    这个选项就像 --read-from-remote-master=BINLOG-DUMP-NON-GTIDS

  • --result-file=*name*-r *name*

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

  • --require-row-format

    需要事件的基于行的二进制日志记录格式。该选项对mysqlbinlog输出强制执行基于行的复制事件 。使用此选项产生的事件流将被使用REQUIRE_ROW_FORMATCHANGE MASTER TO语句的选项 保护的复制通道接受 。 binlog_format=ROW必须在写入二进制日志的服务器上设置。当您指定此选项时,如果mysqlbinlog遇到REQUIRE_ROW_FORMAT 限制所禁止的任何事件,包括LOAD DATA INFILE 说明,创建或删除临时表, INTVAR,,RANDUSER_VAR事件,以及DML事务中的非基于行的事件。mysqlbinlog 还在SET @@session.require_row_format其输出的开头打印一条语句,以在执行输出时应用限制,并且不打印该SET @@session.pseudo_thread_id语句。

    MySQL 8.0.19中添加了此选项。

  • --rewrite-db='*from_name*->*to_name*'

    从基于行或基于语句的日志中读取时,请将的所有情况重写 *from_name*为 to_name。对于基于行的日志,对行进行重写;对于基于USE语句的日志,对子句进行重写 。

    警告

    使用此选项时,表名称与数据库名称匹配的语句不会重写为使用新名称。

    如前所述, 用作此选项值的重写规则是形式为的字符串, 因此,必须用引号将其引起来。 '*from_name*->*to_name*'

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

    shell> 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

  • --server-id=*id*

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

  • --server-id-bits=*N*

    仅使用的前*N*几位 server_id来标识服务器。如果二进制日志被写了一个 mysqld的存储在最显著位设置为小于32的服务器ID位和用户数据,运行mysqlbinlog可以--server-id-bits一套32使得可以看到这些数据。

    只有NDB Cluster发行版随附的mysqlbinlog版本或NDB Cluster支持的内置版本的mysqlbinlog才支持此选项 。

  • --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,仅当MySQL使用OpenSSL构建时,此选项才适用。

    有关sha256_passwordcaching_sha2_password插件的信息,请参见 第6.4.1.3节“ SHA-256可插拔身份验证”第6.4.1.2节“缓存SHA-2可插拔身份验证”

  • --set-charset=*charset_name*

    在输出中 添加一条语句,以指定用于处理日志文件的字符集。 SET NAMES *charset_name*

  • --shared-memory-base-name=*name*

    在Windows上,共享内存名称,用于使用共享内存与本地服务器建立的连接。默认值为MYSQL。共享内存名称区分大小写。

    仅当服务器在shared_memory启用系统变量以支持共享内存连接的情况下启动时,此选项才适用 。

  • --short-form-s

    仅显示日志中包含的语句,而没有任何其他信息或基于行的事件。这仅用于测试,不应在生产系统中使用。它已被弃用,您应该期望在将来的版本中将其删除。

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

    不要在输出中显示任何GTID。从一个或多个包含GTID的二进制日志写入转储文件时,这是必需的,如以下示例所示:

    shell> mysqlbinlog --skip-gtids binlog.000001 >  /tmp/dump.sql
    shell> mysqlbinlog --skip-gtids binlog.000002 >> /tmp/dump.sql
    shell> mysql -u root -p -e "source /tmp/dump.sql"
    

    否则通常不建议在生产中使用此选项。

  • --socket=*path*-S *path*

    对于与的连接localhost,要使用的Unix套接字文件,或者在Windows上,要使用的命名管道的名称。

    在Windows上,仅当在named_pipe 启用了支持命名管道连接的系统变量的情况下启动服务器时,此选项才适用。另外,建立连接的用户必须是named_pipe_full_access_group 系统变量指定的Windows组的成员 。

  • --ssl*

    以开头的选项--ssl指定是否使用SSL连接到服务器,并指示在何处查找SSL密钥和证书。请参阅 加密连接的命令选项

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

    控制是否在客户端上启用FIPS模式。该--ssl-fips-mode选项与其他选项的不同之处在于,该 选项 不用于建立加密连接,而是影响允许的加密操作。请参见第6.8节“ FIPS支持”--ssl-*xxx*

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

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

    注意

    如果OpenSSL的FIPS对象模块不可用时,对于唯一的允许值 --ssl-fips-modeOFF。在这种情况下,设置 --ssl-fips-modeONSTRICT导致客户端在启动时发出警告并以非FIPS模式运行。

  • --start-datetime=*datetime*

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

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

    此选项对于时间点恢复很有用。请参见 第7.5节“时间点(增量)恢复”

  • --start-position=*N*-j *N*

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

    此选项对于时间点恢复很有用。请参见 第7.5节“时间点(增量)恢复”

  • --stop-datetime=*datetime*

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

    此选项对于时间点恢复很有用。请参见 第7.5节“时间点(增量)恢复”

  • --stop-never

    此选项与一起使用 --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冲突。请参见 第4.6.8.4节“指定mysqlbinlog服务器ID”

  • --stop-never-slave-server-id=*id*

    不建议使用此选项;希望在将来的版本中将其删除。--connection-server-id 而是使用该 选项为mysqlbinlog指定要报告的服务器ID 。

  • --stop-position=*N*

    停止在日志位置解码二进制日志 N,从输出中排除在该位置*N* 或之后开始的任何事件。该位置是日志文件中的字节点,而不是事件计数器。它需要指向要包含在输出中的最后一个事件的起始位置之后的位置。事件在定位之前开始,*N*并在定位之前 或之后结束,是最后要处理的事件。此选项适用于在命令行上命名的最后一个日志文件。

    此选项对于时间点恢复很有用。请参见 第7.5节“时间点(增量)恢复”

  • --tls-ciphersuites=*ciphersuite_list*

    使用TLSv1.3的加密连接的允许密码套件。该值是一个或多个以冒号分隔的密码套件名称的列表。可以为此选项命名的密码套件取决于用于编译MySQL的SSL库。有关详细信息,请参见 第6.3.2节“加密的连接TLS协议和密码”

    该选项是在MySQL 8.0.16中添加的。

  • --tls-version=*protocol_list*

    加密连接允许的TLS协议。该值是一个或多个逗号分隔的协议名称的列表。可以为此选项命名的协议取决于用于编译MySQL的SSL库。有关详细信息,请参见 第6.3.2节“加密的连接TLS协议和密码”

  • --to-last-log-t

    不要在从MySQL服务器请求的二进制日志的结尾处停止,而要继续打印直到最后一个二进制日志的结尾。如果将输出发送到同一MySQL服务器,则可能导致无限循环。此选项要求 --read-from-remote-server

  • --user=*user_name*-u *user_name*

    连接到远程服务器时要使用的MySQL帐户的用户名。

  • --verbose-v

    重建行事件并将其显示为带注释的SQL语句,并在适用时带有表分区信息。如果两次给出此选项(通过传递“ -vv”或“ --verbose --verbose”),则输出将包含指示列数据类型和某些元数据的注释以及诸如行查询日志事件之类的信息日志事件(如果存在)的 binlog_rows_query_log_events 系统变量被设置为TRUE

    有关显示行事件输出--base64-output及其 --verbose对行事件输出的影响的示例 ,请参见第4.6.8.2节“ mysqlbinlog行事件显示”

  • --verify-binlog-checksum-c

    验证二进制日志文件中的校验和。

  • --version-V

    显示版本信息并退出。

    使用此选项时显示 的mysqlbinlog版本号为3.4。

  • --zstd-compression-level=*level*

    用于与使用zstd压缩算法的服务器的连接的压缩级别。允许的级别为1到22,较大的值表示压缩级别增加。默认 zstd压缩级别为3。压缩级别设置对不使用zstd压缩的连接无效。

    有关更多信息,请参见 第4.2.8节“连接压缩控制”

    该选项是在MySQL 8.0.18中添加的。

您可以将mysqlbinlog的输出通过管道传递到mysql客户端,以执行二进制日志中包含的事件。使用旧备份时,可使用此技术从意外退出中恢复(请参见 第7.5节“时间点(增量)恢复”)。例如:

shell> mysqlbinlog binlog.000001 | mysql -u root -p

要么:

shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p

如果mysqlbinlog产生的语句可能包含BLOB值,则在mysql处理它们时可能会引起问题。在这种情况下,请使用 选项调用mysql--binary-mode

如果需要先修改语句日志(例如,删除由于某种原因不想执行的语句), 也可以将mysqlbinlog的输出重定向 到文本文件。编辑文件后,通过将其用作mysql程序的输入来执行包含的语句:

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

当使用该选项调用 mysqlbinlog时--start-position,它仅显示二进制日志中具有大于或等于给定位置的偏移量的那些事件(给定位置必须与一个事件的开头匹配)。当看到具有给定日期和时间的事件时,它还具有停止和启动的选项。这使您可以使用--stop-datetime选项执行时间点恢复 (例如,可以说“将我的数据库前滚到上午10:30的状态”)。

处理多个文件。 如果要在MySQL服务器上执行多个二进制日志,那么安全的方法是使用与服务器的单个连接来处理它们。这是一个示例,说明什么可能是不安全的

shell> mysqlbinlog binlog.000001 | mysql -u root -p # DANGER!!
shell> mysqlbinlog binlog.000002 | mysql -u root -p # DANGER!!

如果第一个日志文件包含一条CREATE TEMPORARY TABLE语句,第二个日志包含使用临时表的语句,则使用到服务器的多个连接以这种方式处理二进制日志会导致问题 。当第一个 mysql进程终止时,服务器删除临时表。当第二个mysql 进程尝试使用该表时,服务器报告 “未知表”。”

为避免此类问题,请使用单个 mysql进程执行要处理的所有二进制日志的内容。这是一种方法:

shell> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

另一种方法是将所有日志写入单个文件,然后处理该文件:

shell> mysqlbinlog binlog.000001 >  /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql
shell> mysql -u root -p -e "source /tmp/statements.sql"

从MySQL 8.0.12开始,您还可以使用shell管道将多个二进制日志文件作为流输入提供给mysqlbinlog。压缩二进制日志文件的归档文件可以解压缩并直接提供给 mysqlbinlog。在此示例中, binlog-files_1.gz包含多个二进制日志文件以进行处理。管道中提取的内容 binlog-files_1.gz,管道二进制日志文件mysqlbinlog可以作为标准输入,以及管道的输出mysqlbinlog可以进入 MySQL的客户机以供执行:

shell> gzip -cd binlog-files_1.gz | ./mysqlbinlog - | ./mysql -uroot  -p

您可以指定多个存档文件,例如:

shell> 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启用该 功能。请参见 第6.1.6节“ LOAD DATA LOCAL的安全注意事项”

警告

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论