Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

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

mysqlbinlog 备份功能

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

Important

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

mysqlbinlog 备份选项

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

  • --read-from-remote-server (或 -R) 选项告诉 mysqlbinlog 连接到服务器并请求其二进制日志。(这类似于副本服务器连接到其复制源服务器。)

  • --raw 选项告诉 mysqlbinlog 写入原始(二进制)输出,而不是文本输出。

--read-from-remote-server 一起使用时,通常需要指定其他选项:--host 指示服务器的位置,您可能还需要指定连接选项,如 --user--password

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

静态和实时备份

要使用 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.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选项,如果给定,指定了单个文件的名称,其中写入所有输出。带--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 备份和恢复

以下示例描述了如何使用 mysqldumpmysqlbinlog 一起备份服务器的数据和二进制日志,并在数据丢失时如何使用备份来恢复服务器。该示例假设服务器在主机 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 服务器(例如,服务器重新启动或网络中断)。

  • 备份的延迟类似于副本服务器的延迟。