默认情况下,mysqlbinlog 读取二进制日志文件并以文本格式显示其内容。这使您可以更容易地检查文件中的事件,并重新执行它们(例如,将输出用作 mysql 的输入)。 mysqlbinlog 可以直接从本地文件系统读取日志文件,也可以使用 --read-from-remote-server
选项连接到服务器并从该服务器请求二进制日志内容。 mysqlbinlog 将文本输出写入其标准输出,或者如果给定了 --result-file=
选项,则写入该文件。file_name
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=
:mysqlbinlog 报告的服务器 ID。当id
--stop-never
使用时,默认报告的服务器 ID 为 1。如果这引起了与副本服务器或另一个 mysqlbinlog 进程的 ID 冲突,请使用--connection-server-id
指定备用服务器 ID。请参阅 第 6.6.9.4 节,“指定 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
读取到最后一个日志文件。这些命令之间的一个区别是,如果服务器在 mysqlbinlog 到达binlog.000132
末尾之前打开binlog.000133
,则第一个命令不读取它,而第二个命令读取。 -
要创建实时备份,在 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
及其以上。如果您使用 mysqlbinlog --raw 备份文件,--result-file
选项将产生输出文件名称,如下表所示。您可以通过在 --result-file
值中指定目录路径来将文件写入特定目录。如果 --result-file
值仅包含目录名称,则该值必须以路径名分隔符结尾。输出文件将被覆盖,如果它们已经存在。
--result-file Option |
Output File Names |
---|---|
--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
备份所有数据,并使用 --source-data=2
将当前二进制日志坐标包含在快照文件中。
mysqldump --host=host_name --all-databases --events --routines --source-data=2> dump_file
定期执行 mysqldump 命令,以创建新的快照文件。
如果数据丢失(例如,服务器意外退出),请使用最新的快照文件来恢复数据:
mysql --host=host_name -u root -p < dump_file
然后使用二进制日志备份来重新执行快照文件中的事件。假设快照文件中的坐标如下所示:
-- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='binlog.001002', SOURCE_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 服务器(例如,服务器重新启动或网络中断)。
-
备份的延迟类似于副本服务器的延迟。