使用mysqlbinlog备份二进制日志文件
默认情况下,mysqlbinlog读取二进制日志文件并以文本格式显示其内容。这使得您更容易在文件中检查事件,并重新执行它们(例如,将输出作为输入传递给mysql)。mysqlbinlog可以直接从本地文件系统读取日志文件,或者,使用–read-from-remote-server选项,它可以连接到服务器并请求该服务器的二进制日志内容。mysqlbinlog将其标准输出写入文本,或者如果给定了–result-file=file_name选项,则将其写入名为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=id:mysqlbinlog在连接到服务器时报告的服务器ID。当使用–stop-never时,默认报告的服务器ID为1。如果这导致与副本服务器或其他mysqlbinlog进程的ID冲突,请使用–connection-server-id指定替代服务器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 选项 | 输出文件名 |
---|---|
–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 创建一个作为服务器数据快照的 dump 文件。使用 –all-databases、–events 和 –routines 备份所有数据,并使用 –master-data=2 将当前的二进制日志坐标包含在 dump 文件中。
mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file
定期执行 mysqldump 命令以创建所需的新快照。
如果发生数据丢失(例如,服务器意外退出),则使用最近的 dump 文件恢复数据:
mysql --host=host_name -u root -p < dump_file
然后使用二进制日志备份重新执行在 dump 文件中列出的坐标之后的事件。假设文件中的坐标看起来像这样:
-- 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
你可能会更容易地将备份文件(dump 文件和二进制日志文件)复制到服务器主机上,以便更容易执行恢复操作,或者如果 MySQL 不允许远程根访问。
mysqlbinlog 备份限制
使用 mysqlbinlog 备份二进制日志受到以下限制:
- mysqlbinlog 不会在连接丢失时自动重新连接到 MySQL 服务器(例如,如果服务器重启或发生网络中断)。
- 备份的延迟类似于副本服务器的延迟。
指定mysqlbinlog服务器ID
当使用–read-from-remote-server选项调用时,mysqlbinlog连接到MySQL服务器,指定一个服务器ID来标识自己,并从服务器请求二进制日志文件。你可以使用mysqlbinlog以几种方式从服务器请求日志文件:
- 指定一组显式命名的文件:对于每个文件,mysqlbinlog连接并发出Binlog dump命令。服务器发送文件并断开连接。每个文件有一个连接。
- 指定开始文件和–to-last-log:mysqlbinlog连接并发出所有文件的Binlog dump命令。服务器发送所有文件并断开连接。
- 指定开始文件和–stop-never(隐含–to-last-log):mysqlbinlog连接并发出所有文件的Binlog dump命令。服务器发送所有文件,但在发送最后一个文件后不会断开连接。
仅使用–read-from-remote-server时,mysqlbinlog使用服务器ID为0进行连接,这告诉服务器在发送最后一个请求的日志文件后断开连接。
使用–read-from-remote-server和–stop-never时,mysqlbinlog使用非零服务器ID进行连接,因此服务器在发送最后一个日志文件后不会断开连接。默认情况下,服务器ID为1,但这可以使用–connection-server-id进行更改。
因此,对于请求文件的前两种方式,由于mysqlbinlog指定了服务器ID为0,所以服务器会断开连接。如果给出–stop-never,则不会断开连接,因为mysqlbinlog指定了一个非零的服务器ID。