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 id
是server_id
事件起源的服务器的值。end_log_pos
指示下一个事件的开始位置(即,当前事件的结束位置 + 1)。thread_id
指示哪个线程执行了事件。exec_time
是在主服务器上执行事件所花费的时间。在从站上,它是从站上的结束执行时间减去主站上的开始执行时间的差。差异可作为复制落后于母版多少的指标。error_code
指示执行事件的结果。零表示没有错误发生。
注意使用事件组时,可以将事件的文件偏移量分组在一起,并且可以将事件的注释分组在一起。请勿将这些分组的事件误认为空白文件偏移量。
可以重新执行mysqlbinlog的输出(例如,通过将其用作mysql的输入),以重做日志中的语句。这对于服务器崩溃后的恢复操作很有用。有关其他用法示例,请参见本节后面的讨论以及“使用二进制日志进行时间点(增量)恢复”。为了执行mysqlbinlog所使用的内部使用BINLOG
语句,用户需要使用或特权,或者该特权加上适当的特权来执行每个日志事件。BINLOG_ADMIN
SUPER
REPLICATION_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
。与一样NEVER
,DECODE-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 DATABASE
,ALTER 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
有关使用哪个客户端身份验证插件的提示。
--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服务器,这对于避免无限循环很有用。在崩溃后进行恢复以避免重复记录的语句时,此选项也很有用。该选项使mysqlbinlog
SET 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.cnf
由mysql_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_DUMP
或COM_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将文本输出写入的文件。使用--raw
,mysqlbinlog为从服务器传输的每个日志文件写入一个二进制输出文件,默认情况下使用与原始日志文件相同的名称将它们写入当前目录。在这种情况下,--result-file
选项值被视为修改输出文件名的前缀。--require-row-format
需要事件的基于行的二进制日志记录格式。该选项对mysqlbinlog输出强制执行基于行的复制事件。使用此选项产生的事件流将被使用
REQUIRE_ROW_FORMAT
该CHANGE MASTER TO
语句的选项保护的复制通道接受。binlog_format=ROW
必须在写入二进制日志的服务器上设置。当您指定此选项时,如果mysqlbinlog遇到REQUIRE_ROW_FORMAT
限制所禁止的任何事件,包括LOAD DATA INFILE
说明,创建或删除临时表,INTVAR
,,RAND
或USER_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
包含服务器用于基于RSA密钥对的密码交换所需的公用密钥的客户端副本的文件的路径名。该文件必须为PEM格式。此选项适用于使用
sha256_password
或caching_sha2_password
身份验证插件进行身份验证的客户端。对于未通过这些插件之一进行身份验证的帐户,将忽略此选项。如果未使用基于RSA的密码交换,也将被忽略,例如客户端使用安全连接连接到服务器时。如果给出并指定了有效的公共密钥文件,则优先于。
--server-public-key-path=file_name
--get-server-public-key
对于
sha256_password
,此选项仅在使用OpenSSL构建MySQL时适用。有关
sha256_password
和caching_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-mode
是OFF
。在这种情况下,设置--ssl-fips-mode
为ON
或STRICT
导致客户端在启动时发出警告并以非FIPS模式运行。--start-datetime=datetime
在第一个事件的时间戳等于或晚于
datetime
参数的时候开始读取二进制日志。该datetime
值相对于运行mysqlbinlog的计算机上的本地时区。该值应采用DATETIME
或TIMESTAMP
数据类型可接受的格式。例如: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
选项。
因为mysqlbinlog将LOAD 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 startupROLLBACK ;
十六进制转储输出当前包含以下列表中的元素。此格式可能会更改。有关二进制日志格式的更多信息,请参见 MySQL内部:二进制日志。
Position
:日志文件中的字节位置。Timestamp
:事件时间戳记。在所示的示例中,'9d fc 5c 43'
是以'051024 17:24:13'
十六进制表示。Type
:事件类型代码。Master ID
:创建事件的主服务器的服务器ID。Size
:事件的大小(以字节为单位)。Master Pos
:下一个事件在原始主日志文件中的位置。Flags
:事件标志值。
mysqlbinlog行事件显示
以下示例说明mysqlbinlog如何显示指定数据修改的行事件。这些对应于与事件WRITE_ROWS_EVENT
,UPDATE_ROWS_EVENT
和DELETE_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 tVALUES (1, 'apple', NULL);UPDATE tSET name = 'pear', date = '2009-01-01'WHERE id = 1;DELETE FROM tWHERE 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输出,则不应抑制语句。
--verbose
for行事件生成的SQL语句比相应的BINLOG
语句更具可读性。但是,它们与生成事件的原始SQL语句不完全对应。适用以下限制:
- 原始列名丢失,并替换为,其中是列号。
@N
N
字符集信息在二进制日志中不可用,这会影响字符串列的显示:
- 在相应的二进制和非二进制字符串类型(
BINARY
和CHAR
,VARBINARY
和VARCHAR
,BLOB
和TEXT
)之间没有区别。输出使用STRING
固定长度字符串和VARSTRING
可变长度字符串的数据类型。 对于多字节字符集,二进制日志中不存在每个字符的最大字节数,因此字符串类型的长度以字节而不是字符显示。例如,
STRING(4)
将用作以下任一列类型的值的数据类型:CHAR(4)
CHARACTER SET latin1 CHAR(2)CHARACTER SET ucs2- 由于类型为的事件的存储格式
UPDATE_ROWS_EVENT
,UPDATE
语句与该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=id
:mysqlbinlog连接到服务器时报告的服务器ID 。当--stop-never
被使用时,默认报告服务器ID为1。如果这导致与从属服务器的ID或其他冲突mysqlbinlog可以处理,使用--connection-server-id
指定备用服务器ID。请参见“指定mysqlbinlog服务器ID”。--result-file
:输出文件名的前缀,如稍后所述。
静态和实时备份
要使用mysqlbinlog备份服务器的二进制日志文件,必须指定服务器上实际存在的文件名。如果您不知道名称,请连接到服务器并使用该SHOW BINARY LOGS
语句参见当前名称。假设该语句产生以下输出:
mysql>SHOW BINARYLOGS ; +--------------- +----------- +----------- + | 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.000133
在mysqlbinlog到达末尾之前打开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
,如果提供该选项,该选项将指定将所有输出写入的单个文件的名称。使用--raw
,mysqlbinlog为从服务器传输的每个日志文件写一个二进制输出文件。默认情况下,mysqlbinlog用与原始日志文件相同的名称写入当前目录中的文件。要修改输出文件名,请使用该--result-file
选项。与结合使用--raw
,将--result-file
选项值视为修改输出文件名的前缀。
假设服务器当前具有名为binlog.000999
和up的二进制日志文件。如果使用mysqlbinlog --raw备份文件,则该--result-file
选项将产生输出文件名,如下表所示。您可以通过--result-file
以目录路径开头的值将文件写入特定目录。如果该--result-file
值仅包含目录名,则该值必须以路径名分隔符结尾。输出文件(如果存在)将被覆盖。
--result-file 选项 | 输出文件名 |
---|---|
--result-file=x | xbinlog.000999 及以上 |
--result-file=/tmp/ | /tmp/binlog.000999 及以上 |
--result-file=/tmp/x | /tmp/xbinlog.000999 及以上 |
示例:用于备份和还原的mysqldump + mysqlbinlog
以下示例描述了一个简单的场景,该场景显示了如何一起使用mysqldump和mysqlbinlog备份服务器的数据和二进制日志,以及在发生数据丢失时如何使用备份来还原服务器。该示例假定服务器在主机上运行,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-log
:mysqlbinlog连接并Binlog dump
为所有文件发出命令。服务器发送所有文件并断开连接。 - 指定开始文件,并
--stop-never
(表示--to-last-log
):mysqlbinlog连接并Binlog dump
为所有文件发出命令。服务器发送所有文件,但发送最后一个文件后不断开连接。
随着--read-from-remote-server
而已,mysqlbinlog可以使用0服务器ID,它告诉服务器断开连接发送一个请求日志文件之后所连接。
使用--read-from-remote-server
和--stop-never
,mysqlbinlog使用非零服务器ID连接,因此服务器在发送最后一个日志文件后不会断开连接。默认情况下,服务器ID为1,但可以使用进行更改--connection-server-id
。
因此,对于前两种请求文件的方式,由于mysqlbinlog指定的服务器ID为0 ,因此服务器断开连接。如果--stop-never
给出mysqlbinlog指定的服务器ID为非零,则服务器不断开连接。