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

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

mysqlbinlog 备份功能

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

mysqlbinlog 备份选项

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

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

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

静态和实时备份

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

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

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

  • 要对binlog.000130binlog.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,则第一个命令将不会读取它,但是第二个命令会读取。

  • 要进行实时备份,其中mysqlbinlogbinlog.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及更高版本的二进制日志文件。如果使用mysqlbinlog --raw备份文件,则--result-file选项将产生输出文件名,如下 table 所示。您可以通过以目录路径开头--result-file值将文件写入特定目录。如果--result-file值仅由目录名组成,则该值必须以路径名分隔符结尾。输出文件(如果存在)将被覆盖。

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

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

使用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

定期执行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 服务器。

  • 在 MySQL 5.7.19 之前,即使服务器配置了sync_binlog=1mysqlbinlog也不会获得所有已提交的事件。这意味着某些最新事件可能会丢失。为确保mysqlbinlog看到最新事件,请在要备份的服务器上刷新二进制日志。

  • 备份的延迟类似于复制从属的延迟。