默认情况下,mysqlbinlog读取二进制日志文件并以文本格式显示其内容。这使您能够更轻松地检查文件中的事件并重新执行它们(例如,通过使用输出作为
mysql的输入)。mysqlbinlog可以直接从本地文件系统读取日志文件,或者,通过
--read-from-remote-server
选项,它可以连接到服务器并从该服务器请求二进制日志内容。mysqlbinlog将文本输出写入其标准输出,或者写入以该选项的值命名的文件(
如果给出该选项)。
--result-file=
file_name
mysqlbinlog 备份能力
mysqlbinlog可以读取二进制日志文件并写入包含相同内容的新文件——即二进制格式而不是文本格式。此功能使您能够轻松地以原始格式备份二进制日志。 mysqlbinlog可以进行静态备份,备份一组日志文件并在到达最后一个文件末尾时停止。它还可以进行连续(“实时”)备份,在到达最后一个日志文件的末尾时保持与服务器的连接,并在新事件生成时继续复制它们。在连续备份操作中, mysqlbinlog运行直到连接结束(例如,当服务器退出时)或 mysqlbinlog被强制终止。当连接结束时,mysqlbinlog不会等待并重试连接,这与副本服务器不同。要在服务器重新启动后继续实时备份,您还必须重新启动mysqlbinlog。
mysqlbinlog 备份选项
二进制日志备份要求您 至少使用两个选项 调用mysqlbinlog :
(
--read-from-remote-server
or-R
) 选项告诉 mysqlbinlog连接到服务器并请求其二进制日志。(这类似于连接到其源服务器的副本服务器。)该
--raw
选项告诉 mysqlbinlog写入原始(二进制)输出,而不是文本输出。
除了
--read-from-remote-server
,通常还指定其他选项:
--host
指示服务器运行的位置,您可能还需要指定连接选项,例如--user
和
--password
。
其他几个选项与 一起使用
--raw
:
--stop-never
:到达最后一个日志文件的末尾后保持与服务器的连接,并继续读取新的事件。--stop-never-slave-server-id=
:使用时mysqlbinlog向服务器上报 的服务器IDid
--stop-never
。默认值为 65535。这可用于避免与副本服务器或另一个 mysqlbinlog进程的 ID 发生冲突。请参阅 第 4.6.8.4 节,“指定 mysqlbinlog 服务器 ID”。--result-file
:输出文件名的前缀,如后所述。
静态和实时备份
要使用mysqlbinlog
备份服务器的二进制日志文件
,您必须指定服务器上实际存在的文件名。如果您不知道名称,请连接到服务器并使用该SHOW
BINARY LOGS
语句查看当前名称。假设该语句产生以下输出:
mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000130 | 27459 |
| binlog.000131 | 13719 |
| binlog.000132 | 43268 |
+---------------+-----------+
有了这些信息,您可以使用 mysqlbinlog将二进制日志备份到当前目录,如下所示(在一行中输入每个命令):
binlog.000130
要对through 进行静态备份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
读取最后一个文件。这些命令之间的区别在于,如果服务器恰好 在mysqlbinlog到达末尾binlog.000133
之前 打开,则第一个命令不会读取它,但第二个命令会读取它。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-data=2> dump_file
如果发生数据丢失(例如,如果服务器意外退出),使用最新的转储文件来恢复数据:
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 服务器。
在 MySQL 5.6.37 之前,mysqlbinlog不会在提交时获取所有事件,即使服务器配置了
sync_binlog=1
. 这意味着一些最近的事件可能会丢失。为确保mysqlbinlog看到最新事件,请刷新您正在备份的服务器上的二进制日志。备份的延迟类似于副本的延迟。