文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  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 后面的数字表示二进制日志文件中事件的文件偏移量或起始位置。

第二行以日期和时间开头,表示语句在事件 originating 的服务器上开始的时间。对于复制,此时间戳会传播到副本服务器。server id 是事件 originating 的服务器的 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 统计信息
--default-auth 要使用的身份验证插件
--defaults-extra-file 除了常用选项文件外,还要读取指定的选项文件
--defaults-file 仅读取指定的选项文件
--defaults-group-suffix 选项组后缀值
--disable-log-bin 禁用二进制日志记录
--exclude-gtids 不显示提供的 GTID 集中的任何组
--force-if-open 即使打开或未正确关闭,也要读取二进制日志文件
--force-read 如果 mysqlbinlog 读取到无法识别的二进制日志事件,它会打印警告
--get-server-public-key 从服务器请求 RSA 公钥
--help 显示帮助消息并退出
--hexdump 在注释中显示日志的十六进制转储
--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 在 mysqld 的 server-id-bits 设置为小于最大值时如何解释二进制日志中的服务器 ID;仅受 MySQL 集群版本的 mysqlbinlog 支持
--server-public-key-path 包含 RSA 公钥的文件的路径名
--set-charset 向输出添加 SET NAMES charset_name 语句
--shared-memory-base-name 共享内存连接的共享内存名称(仅限 Windows)
--short-form 仅显示日志中包含的语句
--skip-gtids 不将二进制日志文件中的 GTID 包含在输出转储文件中
--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 从时间戳等于或晚于 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-ROWSmysqlbinlog 指定您希望将行事件解码并通过指定 --verbose 选项将其显示为注释的 SQL 语句。与 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 从二进制日志(仅限本地日志)中输出在 USE 语句将 db_name 选择为默认数据库时发生的条目。

    mysqlbinlog--database 选项类似于 mysqld--binlog-do-db 选项,但只能用于指定一个数据库。如果多次指定 --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 之后的三个 INSERT 语句。

    mysqlbinlog --database=db2 不会输出前两个 INSERT 语句,因为没有默认数据库。它不会输出 USE test 之后的三个 INSERT 语句,但会输出 USE db2 之后的三个 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=文件名
    类型 文件名

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

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

  • --defaults-file=file_name

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

    仅使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果 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=_other,则 mysqlbinlog 还会读取 [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.2 节,“缓存 SHA-2 可插拔身份验证”

  • --hexdump, -H

    命令行格式 --hexdump

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

  • --host=host_name, -h host_name

    命令行格式 --host=主机名
    类型 字符串
    默认值 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=目录名
    类型 目录名

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

    因为其他进程可以将文件写入默认的系统特定目录,建议指定 --local-load 选项到 mysqlbinlog 以指定不同的数据文件目录,然后通过在处理来自 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

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

    .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[=密码]
    类型 字符串

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

    在命令行上指定密码应被视为不安全的。为了避免在命令行上提供密码,请使用选项文件。请参阅 第 8.1.2.1 节“密码安全的最终用户指南”

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

  • --plugin-dir=dir_name

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

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

  • --port=port_num, -P port_num

    命令行格式 --port=端口号
    类型 数字
    默认值 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=类型
    类型 字符串
    默认值 [参见正文]
    有效值

    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=类型

    此选项通过将选项值分别设置为 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=类型
    已弃用

    --read-from-remote-source 的已弃用同义词。

  • --read-from-remote-server=file_name, -R

    命令行格式 --read-from-remote-server=文件名

    从 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=名称

    如果没有 --raw 选项,此选项指示 mysqlbinlog 写入文本输出的文件。使用 --raw 时,mysqlbinlog 为从服务器传输的每个日志文件写入一个二进制输出文件,默认情况下,使用与原始日志文件相同的名称将它们写入当前目录。在这种情况下,--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='旧名称->新名称'
    类型 字符串
    默认值 [无]

    从基于行或基于语句的日志读取时,将所有出现的 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 选项,使用重写的数据库名称。选项提供的顺序对此没有任何影响。

    这意味着,例如,如果使用 --rewrite-db='mydb->yourdb' --database=yourdb 启动 mysqlbinlog,那么对数据库 mydbyourdb 中任何表的更新都将包含在输出中。另一方面,如果使用 --rewrite-db='mydb->yourdb' --database=mydb 启动它,那么 mysqlbinlog 将不会输出任何语句:因为在应用 --database 选项之前,对 mydb 的所有更新都会先被重写为对 yourdb 的更新,因此没有与 --database=mydb 匹配的更新。

  • --server-id=id

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

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

  • --server-id-bits=N

    命令行格式 --server-id-bits=#
    类型 数字
    默认值 32
    最小值 7
    最大值 32

    仅使用 server_id 的前 N 位来标识服务器。如果二进制日志是由 server-id-bits 设置小于 32 且用户数据存储在最高有效位的 mysqld 编写的,则运行将 --server-id-bits 设置为 32 的 mysqlbinlog 可以查看此数据。

    此选项仅受 NDB Cluster 发行版提供的或使用 NDB Cluster 支持构建的 mysqlbinlog 版本支持。

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

    命令行格式 --server-public-key-path=file_name
    类型 文件名

    PEM 格式文件的路径名,该文件包含服务器为基于 RSA 密钥对的密码交换所需的客户端公钥副本。此选项适用于使用 sha256_password(已弃用)或 caching_sha2_password 身份验证插件进行身份验证的客户端。对于未使用其中一个插件进行身份验证的帐户,将忽略此选项。如果未使用基于 RSA 的密码交换(例如,当客户端使用安全连接连接到服务器时),也将忽略此选项。

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

    对于 sha256_password(已弃用),此选项仅在使用 OpenSSL 构建 MySQL 时适用。

    有关 sha256_passwordcaching_sha2_password 插件的信息,请参阅 第 8.4.1.3 节“SHA-256 可插拔身份验证”第 8.4.1.2 节“缓存 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。它可用于避免与副本服务器或其他 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 协议的扩展(必须使用 TLS 扩展编译 OpenSSL 才能使此选项起作用)。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

当使用 --start-position 选项调用 mysqlbinlog 时,它仅显示二进制日志中偏移量大于或等于给定位置的事件(给定位置必须与一个事件的开始匹配)。它还具有在看到具有给定日期和时间的事件时停止和启动的选项。这使您能够使用 --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"

您还可以使用 shell 管道将多个二进制日志文件作为流式输入提供给 mysqlbinlog。可以解压缩压缩的二进制日志文件的存档,并将其直接提供给 mysqlbinlog。在此示例中,binlog-files_1.gz 包含要处理的多个二进制日志文件。管道提取 binlog-files_1.gz 的内容,将二进制日志文件作为标准输入通过管道传输到 mysqlbinlog,并将 mysqlbinlog 的输出通过管道传输到 mysql 客户端以执行

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

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

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

对于流式输入,请勿使用 --stop-position,因为 mysqlbinlog 无法识别要应用此选项的最后一个日志文件。

LOAD DATA 操作。  mysqlbinlog 可以生成输出,在没有原始数据文件的情况下复制 LOAD DATA 操作。 mysqlbinlog 将数据复制到一个临时文件,并写入一个引用该文件的 LOAD DATA LOCAL 语句。写入这些文件的目录的默认位置是特定于系统的。要显式指定目录,请使用 --local-load 选项。

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

警告

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