19.4.1.3 通过使其只读来备份源或副本
可以通过获取全局读锁并将read_only
系统变量更改为只读状态来备份复制设置中的源或副本服务器:
-
将服务器设置为只读状态,以便只处理检索和阻止更新。
-
执行备份。
-
将服务器恢复到正常的读/写状态。
本节中的指令将服务器置于备份方法可以从服务器获取数据的状态,例如mysqldump(见第6.5.4节,“mysqldump — A Database Backup Program”)。不要尝试使用这些指令来执行二进制备份,因为服务器可能仍然有未flush到磁盘的修改数据缓存在内存中。
以下指令描述了如何对源和副本进行备份。在这里讨论的两个场景中,假设您有以下复制设置:
-
一个源服务器S1
-
一个副本服务器R1,它的源是S1
-
一个客户端C1连接到S1
-
一个客户端C2连接到R1
在任何场景中,获取全局读锁和更改read_only
变量的语句都将在要备份的服务器上执行,不会传播到该服务器的任何副本。
场景1:使用只读源进行备份
将源S1设置为只读状态,执行以下语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;
在S1处于只读状态时,以下属性是真的:
-
来自C1的更新请求被S1阻止,因为服务器处于只读模式。
-
来自C1的查询结果请求成功。
-
在S1上执行备份是安全的。
-
在R1上执行备份不是安全的。这服务器仍在运行,可能正在处理二进制日志或来自C2的更新请求。
在S1处于只读状态时,执行备份。例如,您可以使用mysqldump。
在S1上备份操作完成后,恢复S1到正常的操作状态,执行以下语句:
mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;
虽然在S1上执行备份是安全的(从备份的角度),但是在性能上不是最优的,因为C1的客户端被阻止执行更新。
这策略适用于备份源,但也可以用于非复制设置中的单个服务器。
场景2:使用只读副本进行备份
将副本R1设置为只读状态,执行以下语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;
在R1处于只读状态时,以下属性是真的:
-
源S1继续运行,因此在源上执行备份不是安全的。
-
副本R1已停止,因此在副本R1上执行备份是安全的。
这些属性为一个流行的备份场景提供了基础:让一个副本在某个时间段内执行备份是没有问题的,因为这不会影响整个网络,并且系统仍然在备份过程中运行。在特定情况下,客户端仍然可以在源服务器上执行更新,而源服务器不会受到备份活动的影响。
在 R1 读取只读时,执行备份。例如,您可以使用mysqldump。
在 R1 备份操作完成后,恢复 R1 到正常操作状态,执行以下语句。
mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;
在副本恢复到正常操作状态后,它再次同步到源服务器,通过从源服务器的二进制日志中捕捉任何未完成的更新。