默认情况下,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 选项 |
输出文件名 |
---|---|
--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 服务器。
备份的延迟时间与副本服务器的延迟时间相似。