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。
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
选项时,--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一起备份服务器的数据和二进制日志,并在数据丢失时使用备份进行恢复。该例假设服务器正在主机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服务器,如果连接丢失(例如,服务器重启或网络中断)。
-
备份的延迟与复制服务器的延迟相似。