Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


6.6.9.3 指定 mysqlbinlog 服务器 ID

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

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

Important

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 来读取最后一个日志文件,因为该选项是隐含的。

没有使用--rawmysqlbinlog会产生文本输出,并且如果给定,--result-file选项指定了所有输出将写入到的单个文件。使用--rawmysqlbinlog为每个从服务器传输的日志文件产生一个二进制输出文件。默认情况下,mysqlbinlog将文件写入当前目录,并且使用与原始日志文件相同的名称。如果要修改输出文件的名称,可以使用--result-file选项。在结合使用--raw--result-file选项时,--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和更高版本

以下是一个简单的场景,说明如何使用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

然后使用二进制日志备份重新执行在dump文件中列出的坐标之后写入的事件。假设dump文件中的坐标看起来像这样:

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

您可能会发现将备份文件(dump 文件和二进制日志文件)复制到服务器主机上更容易,这样可以简化恢复操作,或者如果MySQL不允许远程root访问权限。

使用mysqlbinlog进行的二进制日志备份受以下限制:

  • mysqlbinlog不会自动重新连接到MySQL服务器,如果连接丢失(例如,服务器重启或网络中断)。

  • 备份的延迟与复制服务器的延迟相似。