• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mysqlbinlog 处理二进制日志文件的实用程序

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

    像这样调用mysqlbinlog

    shell>mysqlbinlog [options] log_file ...
    

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

    shell>mysqlbinlog binlog.0000003
    

    输出包括中包含的事件binlog.000003。对于基于语句的日志记录,事件信息包括SQL语句,在其上执行该语句的服务器的ID,该语句在执行时的时间戳,所花费的时间等等。对于基于行的日志记录,该事件指示行更改,而不是SQL语句。有关日志记录模式的信息,请参见“复制格式”。

    事件之前有提供附加信息的标题注释。例如:

    # at 141
    #100309  9:28:36 server id 123  end_log_pos 245
    Query thread_id=3350  exec_time=11  error_code=0
    

    在第一行中,后面的数字 t表示二进制日志文件中事件的文件偏移量或开始位置。

    第二行以日期和时间开头,该日期和时间指示语句在事件起源的服务器上何时开始。为了进行复制,此时间戳会传播到从属服务器。server idserver_id事件起源的服务器的值。end_log_pos指示下一个事件的开始位置(即,当前事件的结束位置 + 1)。thread_id指示哪个线程执行了事件。exec_time是在主服务器上执行事件所花费的时间。在从站上,它是从站上的结束执行时间减去主站上的开始执行时间的差。差异可作为复制落后于母版多少的指标。error_code指示执行事件的结果。零表示没有错误发生。

    注意

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

    可以重新执行mysqlbinlog的输出(例如,通过将其用作mysql的输入),以重做日志中的语句。这对于服务器崩溃后的恢复操作很有用。有关其他用法示例,请参见本节后面的讨论以及“使用二进制日志进行时间点(增量)恢复”。为了执行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根本无法将该文件识别为二进制日志文件。有关二进制日志加密的更多信息,请参见“加密二进制日志文件和中继日志文件”。

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

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

    mysqlbinlog支持以下选项,可以在命令行或选项文件的[mysqlbinlog][client]组中指定。

    • --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对行事件输出的影响的示例,请参见“ 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

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

    • --compress

      如果可能,压缩客户端和服务器之间发送的所有信息。

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

    • --compression-algorithms=value

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

      该选项是在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。请参见“指定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_named: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

      有关使用哪个客户端身份验证插件的提示。

    • --defaults-extra-file=file_name

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

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

    • --defaults-file=file_name

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

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

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

    • --defaults-group-suffix=str

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

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

    • --disable-log-bin-D

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

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

    • --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插件的信息,请参见“缓存SHA-2可插拔身份验证”。

    • --hexdump-H

      显示日志注释的十六进制转储,如“ 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或任何其他MySQL程序自动删除。

    • --login-path=name

      .mylogin.cnf登录路径文件中的命名登录路径读取选项。阿“登录路径”是含有指定要连接到哪个MySQL服务器和选项哪个帐户作为认证选项组。要创建或修改登录路径文件,请使用mysql_config_editor实用程序。请参见“mysql_config_editor-MySQL配置实用程序”。

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

    • --no-defaults

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

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

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

    • --offset=N-o N

      跳过N日志中的第一项。

    • --open-files-limit=N

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

    • --password[=password]-p[password]

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

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

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

    • --plugin-dir=dir_name

      在其中查找插件的目录。如果该--default-auth选项用于指定身份验证插件,但mysqlbinlog找不到它,请指定此选项。

    • --port=port_num-P port_num

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

    • --print-defaults

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

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

    • --print-table-metadat

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

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

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

    • --raw

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

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

      通过将选项值分别设置为或,使用COM_BINLOG_DUMPCOM_BINLOG_DUMP_GTID命令从MySQL服务器读取二进制日志。如果与结合使用,则可以在主服务器上过滤掉事务,从而避免不必要的网络流量。BINLOG-DUMP-NON-GTIDSBINLOG-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_nameto_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

      包含服务器用于基于RSA密钥对的密码交换所需的公用密钥的客户端副本的文件的路径名。该文件必须为PEM格式。此选项适用于使用sha256_passwordcaching_sha2_password身份验证插件进行身份验证的客户端。对于未通过这些插件之一进行身份验证的帐户,将忽略此选项。如果未使用基于RSA的密码交换,也将被忽略,例如客户端使用安全连接连接到服务器时。

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

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

      有关sha256_passwordcaching_sha2_password插件的信息,请参见“ SHA-256可插拔身份验证”和“缓存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选项与其他选项的不同之处在于,该选项不用于建立加密连接,而是影响允许的加密操作。请参见“ 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
      

      此选项对于时间点恢复很有用。请参见“示例备份和恢复策略”。

    • --start-position=N-j N

      在位置等于或大于的第一个事件开始读取二进制日志N。此选项适用于在命令行上命名的第一个日志文件。

      此选项对于时间点恢复很有用。请参见“示例备份和恢复策略”。

    • --stop-datetime=datetime

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

      此选项对于时间点恢复很有用。请参见“示例备份和恢复策略”。

    • --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发生冲突。请参见“指定mysqlbinlog服务器ID”。

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

      此选项已弃用,在以后的版本中将被删除。--connection-server-id而是使用该选项为mysqlbinlog指定要报告的服务器ID。

    • --stop-position=N

      在第一个事件中停止读取二进制日志,该事件的位置等于或大于N。此选项适用于在命令行上命名的最后一个日志文件。

      此选项对于时间点恢复很有用。请参见“示例备份和恢复策略”。

    • --tls-ciphersuites=ciphersuite_list

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

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

    • --tls-version=protocol_list

      加密连接允许的TLS协议。该值是一个或多个逗号分隔的协议名称的列表。可以为此选项命名的协议取决于用于编译MySQL的SSL库。有关详细信息,请参见“加密的连接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对行事件输出的影响的示例,请参见“ mysqlbinlog行事件显示”。

    • --verify-binlog-checksum-c

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

    • --version-V

      显示版本信息并退出。

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

    • --zstd-compression-level=level

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

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

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

    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启用该功能。请参见“ LOAD DATA LOCAL的安全性问题”。

    警告

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


    mysqlbinlog十六进制转储格式

    --hexdump选项使mysqlbinlog生成二进制日志内容的十六进制转储:

    shell>mysqlbinlog --hexdump master-bin.000001
    

    十六进制输出由以开头的注释行组成#,因此对于前面的命令,输出看起来像这样:

    /*!40019 SET @@SESSION.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    # at 4
    #051024 17:24:13 server id 1  end_log_pos 98
    # Position Timestamp Type Master ID Size Master Pos Flags
    # 00000004 9d fc 5c 43 0f 01 00 00 00 5e 00 00 00 62 00 00 00 00 00
    # 00000017 04 00 35 2e 30 2e 31 35 2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|
    # 00000027 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |og..............|
    # 00000037 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
    # 00000047 00 00 00 00 9d fc 5c 43 13 38 0d 00 08 00 12 00 |.......C.8......|
    # 00000057 04 04 04 04 12 00 00 4b 00 04 1a                |.......K...|
    # Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13
    # at startup
    ROLLBACK;
    

    十六进制转储输出当前包含以下列表中的元素。此格式可能会更改。有关二进制日志格式的更多信息,请参见 MySQL内部:二进制日志。

    • Position:日志文件中的字节位置。
    • Timestamp:事件时间戳记。在所示的示例中,'9d fc 5c 43'是以'051024 17:24:13'十六进制表示。
    • Type:事件类型代码。
    • Master ID:创建事件的主服务器的服务器ID。
    • Size:事件的大小(以字节为单位)。
    • Master Pos:下一个事件在原始主日志文件中的位置。
    • Flags:事件标志值。

    mysqlbinlog行事件显示

    以下示例说明mysqlbinlog如何显示指定数据修改的行事件。这些对应于与事件WRITE_ROWS_EVENTUPDATE_ROWS_EVENTDELETE_ROWS_EVENT类型代码。该--base64-output=DECODE-ROWS--verbose选项可用于影响排事件输出。

    假设服务器正在使用基于行的二进制日志记录,并且您执行以下语句序列:

    CREATE TABLE t
    (
    id INT NOT NULL,
    name VARCHAR(20) NOT NULL,
    date DATE NULL
    ) ENGINE = InnoDB;
    
    START TRANSACTION;
    INSERT INTO t VALUES(1, 'apple', NULL);
    UPDATE t SET name = 'pear', date = '2009-01-01' WHERE id = 1;
    DELETE FROM t WHERE id = 1;
    COMMIT;
    

    默认情况下,mysqlbinlog显示使用BINLOG语句编码为base-64字符串的行事件。省略多余的行,前面的语句序列产生的行事件的输出如下所示:

    shell>mysqlbinlog log_file
    ...
    # at 218
    #080828 15:03:08 server id 1  end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
    '/*!*/;
    ...
    # at 302
    #080828 15:03:08 server id 1  end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
    '/*!*/;
    ...
    # at 400
    #080828 15:03:08 server id 1  end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
    '/*!*/;
    

    要以“伪SQL ”语句的形式将行事件视为注释,请使用或选项运行mysqlbinlog。此输出级别还显示适用的表分区信息。输出将包含以开头的行:--verbose-v###

    shell>mysqlbinlog -v log_file
    ...
    # at 218
    #080828 15:03:08 server id 1  end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
    '/*!*/;
    ### INSERT INTO test.t
    ### SET
    ###   @1=1
    ###   @2='apple'
    ###   @3=NULL
    ...
    # at 302
    #080828 15:03:08 server id 1  end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
    '/*!*/;
    ### UPDATE test.t
    ### WHERE
    ###   @1=1
    ###   @2='apple'
    ###   @3=NULL
    ### SET
    ###   @1=1
    ###   @2='pear'
    ###   @3='2009:01:01'
    ...
    # at 400
    #080828 15:03:08 server id 1  end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
    '/*!*/;
    ### DELETE FROM test.t
    ### WHERE
    ###   @1=1
    ###   @2='pear'
    ###   @3='2009:01:01'
    

    指定--verbose-v两次以显示每列的数据类型和一些元数据,以及如果binlog_rows_query_log_events系统变量设置为,则显示信息日志事件,例如行查询日志事件TRUE。每次更改列后,输出将包含一个附加注释:

    shell>mysqlbinlog -vv log_file
    ...
    # at 218
    #080828 15:03:08 server id 1  end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAANoAAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBcBAAAAKAAAAAIBAAAQABEAAAAAAAEAA//8AQAAAAVhcHBsZQ==
    '/*!*/;
    ### INSERT INTO test.t
    ### SET
    ###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
    ###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
    ...
    # at 302
    #080828 15:03:08 server id 1  end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAC4BAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBgBAAAANgAAAGQBAAAQABEAAAAAAAEAA////AEAAAAFYXBwbGX4AQAAAARwZWFyIbIP
    '/*!*/;
    ### UPDATE test.t
    ### WHERE
    ###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='apple' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
    ###   @3=NULL /* VARSTRING(20) meta=0 nullable=1 is_null=1 */
    ### SET
    ###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
    ###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
    ...
    # at 400
    #080828 15:03:08 server id 1  end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
    
    BINLOG '
    fAS3SBMBAAAALAAAAJABAAAAABEAAAAAAAAABHRlc3QAAXQAAwMPCgIUAAQ=
    fAS3SBkBAAAAKgAAALoBAAAQABEAAAAAAAEAA//4AQAAAARwZWFyIbIP
    '/*!*/;
    ### DELETE FROM test.t
    ### WHERE
    ###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
    ###   @2='pear' /* VARSTRING(20) meta=20 nullable=0 is_null=0 */
    ###   @3='2009:01:01' /* DATE meta=0 nullable=1 is_null=0 */
    

    通过使用该选项,您可以告诉mysqlbinlog取消BINLOG针对行事件的语句--base64-output=DECODE-ROWS。这与--base64-output=NEVER发现行事件相似,但不会退出并显示错误。的组合--base64-output=DECODE-ROWS,并--verbose提供了一个便捷的方式,看看行事件只是作为SQL语句:

    shell>mysqlbinlog -v --base64-output=DECODE-ROWS log_file
    ...
    # at 218
    #080828 15:03:08 server id 1  end_log_pos 258 Write_rows: table id 17 flags: STMT_END_F
    ### INSERT INTO test.t
    ### SET
    ###   @1=1
    ###   @2='apple'
    ###   @3=NULL
    ...
    # at 302
    #080828 15:03:08 server id 1  end_log_pos 356 Update_rows: table id 17 flags: STMT_END_F
    ### UPDATE test.t
    ### WHERE
    ###   @1=1
    ###   @2='apple'
    ###   @3=NULL
    ### SET
    ###   @1=1
    ###   @2='pear'
    ###   @3='2009:01:01'
    ...
    # at 400
    #080828 15:03:08 server id 1  end_log_pos 442 Delete_rows: table id 17 flags: STMT_END_F
    ### DELETE FROM test.t
    ### WHERE
    ###   @1=1
    ###   @2='pear'
    ###   @3='2009:01:01'
    
    注意

    BINLOG如果您打算重新执行mysqlbinlog输出,则不应抑制语句。

    --verbosefor行事件生成的SQL语句比相应的BINLOG语句更具可读性。但是,它们与生成事件的原始SQL语句不完全对应。适用以下限制:

    • 原始列名丢失,并替换为,其中是列号。@NN
    • 字符集信息在二进制日志中不可用,这会影响字符串列的显示:

      • 在相应的二进制和非二进制字符串类型(BINARYCHARVARBINARYVARCHARBLOBTEXT)之间没有区别。输出使用STRING固定长度字符串和VARSTRING可变长度字符串的数据类型。
      • 对于多字节字符集,二进制日志中不存在每个字符的最大字节数,因此字符串类型的长度以字节而不是字符显示。例如,STRING(4)将用作以下任一列类型的值的数据类型:

        CHAR(4) CHARACTER SET latin1
        CHAR(2) CHARACTER SET ucs2
        
      • 由于类型为的事件的存储格式UPDATE_ROWS_EVENTUPDATE语句与该WHERE子句之前的SET子句一起显示。

    正确解释行事件需要二进制日志开头的格式描述事件中的信息。由于mysqlbinlog事先不知道日志的其余部分是否包含行事件,因此默认情况下,它将BINLOG在输出的初始部分使用一条语句显示格式描述事件。

    如果已知二进制日志不包含任何需要BINLOG语句的事件(即,没有行事件),则--base64-output=NEVER可以使用该选项来防止写入此标头。

    使用mysqlbinlog备份二进制日志文件

    默认情况下,mysqlbinlog读取二进制日志文件并以文本格式显示其内容。这使您可以更轻松地检查文件中的事件并重新执行它们(例如,通过将输出用作mysql的输入)。mysqlbinlog可以直接从本地文件系统读取日志文件,或者,通过--read-from-remote-server选择,它可以连接到服务器并从该服务器请求二进制日志内容。mysqlbinlog将文本输出写入其标准输出,或者如果指定了该选项,则将其写入名为该选项的值的文件。--result-file=file_name

    • mysqlbinlog备份功能
    • mysqlbinlog备份选项
    • 静态和实时备份
    • 输出文件命名
    • 示例:用于备份和还原的mysqldump + mysqlbinlog
    • mysqlbinlog备份限制

    mysqlbinlog备份功能

    mysqlbinlog可以读取二进制日志文件并写入包含相同内容的新文件,即以二进制格式而不是文本格式。此功能使您可以轻松备份原始格式的二进制日志。mysqlbinlog可以进行静态备份,备份一组日志文件,并在到达最后一个文件的末尾时停止。它还可以进行连续(“实时”)备份,在到达最后一个日志文件末尾时保持与服务器的连接,并在生成新事件时继续进行复制。在连续备份操作中,mysqlbinlog运行直到连接结束(例如,服务器退出时)或mysqlbinlog被强制终止。连接结束时,不同于从属复制服务器,mysqlbinlog不会等待并重试连接。要在重启服务器后继续进行实时备份,还必须重启mysqlbinlog

    重要

    mysqlbinlog可以备份加密和未加密的二进制日志文件。但是,使用 mysqlbinlog生成的加密二进制日志文件的副本以未加密格式存储。

    mysqlbinlog备份选项

    二进制日志备份要求您至少使用两个选项来调用mysqlbinlog

    • --read-from-remote-server(或-R)选项告诉mysqlbinlog可以连接到服务器并请求其二进制日志。(这类似于从复制服务器连接到其主服务器。)
    • --raw选项告诉mysqlbinlog写原始(二进制)输出,而不是文本输出。

    与一起--read-from-remote-server,通常还指定其他选项:--host指示服务器在哪里运行,并且您可能还需要指定连接选项,例如--user--password

    结合使用其他几个选项非常有用--raw

    • --stop-never:到达最后一个日志文件的末尾后,请保持与服务器的连接并继续读取新事件。
    • --connection-server-id=idmysqlbinlog连接到服务器时报告的服务器ID 。当--stop-never被使用时,默认报告服务器ID为1。如果这导致与从属服务器的ID或其他冲突mysqlbinlog可以处理,使用--connection-server-id指定备用服务器ID。请参见“指定mysqlbinlog服务器ID”。
    • --result-file:输出文件名的前缀,如稍后所述。

    静态和实时备份

    要使用mysqlbinlog备份服务器的二进制日志文件,必须指定服务器上实际存在的文件名。如果您不知道名称,请连接到服务器并使用该SHOW BINARY LOGS语句参见当前名称。假设该语句产生以下输出:

    mysql> SHOW BINARY LOGS;
    +---------------	+-----------	+-----------	+
    | Log_name       | File_size  | Encrypted  |
    +---------------	+-----------	+-----------	+
    | binlog.000130  | 27459  | No         |
    | binlog.000131  | 13719  | No         |
    | binlog.000132  | 43268  | No         |
    +---------------	+-----------	+-----------	+
    

    有了这些信息,您可以使用mysqlbinlog将二进制日志备份到当前目录,如下所示(在一行中输入每个命令):

    • 为了让静态备份binlog.000130通过binlog.000132,使用这些命令:

      mysqlbinlog --read-from-remote-server --host=host_name --raw
      binlog.000130 binlog.000131 binlog.000132
      
      mysqlbinlog --read-from-remote-server --host=host_name --raw
      --to-last-log binlog.000130
      

      第一个命令明确指定每个文件名。第二个仅命名第一个文件,并用于--to-last-log读取最后一个文件。这些命令之间的区别是,如果服务器恰好binlog.000133mysqlbinlog到达末尾之前打开binlog.000132,则第一个命令将不会读取它,但是第二个命令会读取它。

    • 要进行实时备份,其中mysqlbinlog开始binlog.000130复制现有日志文件,然后在服务器生成它们时保持连接状态以复制新事件:

      mysqlbinlog --read-from-remote-server --host=host_name --raw
      --stop-never binlog.000130
      

      使用时--stop-never,不必指定--to-last-log要读取最后一个日志文件,因为隐含该选项。

    输出文件命名

    如果不使用--raw,则mysqlbinlog会产生文本输出--result-file,如果提供该选项,该选项将指定将所有输出写入的单个文件的名称。使用--rawmysqlbinlog为从服务器传输的每个日志文件写一个二进制输出文件。默认情况下,mysqlbinlog用与原始日志文件相同的名称写入当前目录中的文件。要修改输出文件名,请使用该--result-file选项。与结合使用--raw,将--result-file选项值视为修改输出文件名的前缀。

    假设服务器当前具有名为binlog.000999和up的二进制日志文件。如果使用mysqlbinlog --raw备份文件,则该--result-file选项将产生输出文件名,如下表所示。您可以通过--result-file以目录路径开头的值将文件写入特定目录。如果该--result-file值仅包含目录名,则该值必须以路径名分隔符结尾。输出文件(如果存在)将被覆盖。

    --result-file选项输出文件名
    --result-file=xxbinlog.000999及以上
    --result-file=/tmp//tmp/binlog.000999及以上
    --result-file=/tmp/x/tmp/xbinlog.000999及以上
    示例:用于备份和还原的mysqldump + mysqlbinlog

    以下示例描述了一个简单的场景,该场景显示了如何一起使用mysqldumpmysqlbinlog备份服务器的数据和二进制日志,以及在发生数据丢失时如何使用备份来还原服务器。该示例假定服务器在主机上运行,host_name并且其第一个二进制日志文件名为binlog.000999。在一行中输入每个命令。

    使用mysqlbinlog对二进制日志进行连续备份:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
    --stop-never binlog.000999
    

    使用mysqldump创建一个转储文件作为服务器数据的快照。使用--all-databases--events--routines备份所有数据,并--master-data=2在转储文件中包括当前的二进制日志坐标。

    mysqldump --host=host_name --all-databases --events --routines --master-dat =2> dump_file
    

    定期执行mysqldump命令以根据需要创建更新的快照。

    如果发生数据丢失(例如,如果服务器崩溃),请使用最新的转储文件来还原数据:

    mysql --host=host_name -u root -p < dump_file
    

    然后,使用二进制日志备份重新执行在转储文件中列出的坐标之后写入的事件。假设文件中的坐标如下所示:

    -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.001002', MASTER_LOG_POS=27284;
    

    如果将最新备份的日志文件命名为binlog.001004,则重新执行日志事件,如下所示:

    mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004
    | mysql --host=host_name -u root -p
    

    您可能会发现更容易将备份文件(转储文件和二进制日志文件)复制到服务器主机,以使其更易于执行还原操作,或者如果MySQL不允许远程root访问。

    mysqlbinlog备份限制

    使用mysqlbinlog进行二进制日志备份受以下限制:

    • 如果连接丢失(例如,如果服务器重启或出现网络中断), mysqlbinlog不会自动重新连接到MySQL服务器。
    • 备份的延迟类似于复制从属的延迟。

    指定mysqlbinlog服务器ID

    当使用该--read-from-remote-server选项调用时,mysqlbinlog连接到MySQL服务器,指定服务器ID来标识自身,并从服务器请求二进制日志文件。您可以使用mysqlbinlog通过多种方式从服务器请求日志文件:

    • 指定一组明确命名的文件:对于每个文件,mysqlbinlog连接并发出Binlog dump命令。服务器发送文件并断开连接。每个文件有一个连接。
    • 指定开始文件,然后--to-last-logmysqlbinlog连接并Binlog dump为所有文件发出命令。服务器发送所有文件并断开连接。
    • 指定开始文件,并--stop-never(表示--to-last-log):mysqlbinlog连接并Binlog dump为所有文件发出命令。服务器发送所有文件,但发送最后一个文件后不断开连接。

    随着--read-from-remote-server而已,mysqlbinlog可以使用0服务器ID,它告诉服务器断开连接发送一个请求日志文件之后所连接。

    使用--read-from-remote-server--stop-nevermysqlbinlog使用非零服务器ID连接,因此服务器在发送最后一个日志文件后不会断开连接。默认情况下,服务器ID为1,但可以使用进行更改--connection-server-id

    因此,对于前两种请求文件的方式,由于mysqlbinlog指定的服务器ID为0 ,因此服务器断开连接。如果--stop-never给出mysqlbinlog指定的服务器ID为非零,则服务器不断开连接。