可以通过获取全局读锁并操作 read_only
系统变量来更改要备份的服务器的只读状态,从而在复制设置中备份源服务器或副本服务器。
使服务器处于只读状态,以便它只处理检索并阻止更新。
执行备份。
将服务器更改回正常的读写状态。
本节中的说明将要备份的服务器置于对从服务器获取数据的备份方法安全的状态,例如 mysqldump(参见 第 6.5.4 节,“mysqldump — A Database Backup Program”)。不要尝试使用这些说明通过直接复制文件来进行二进制备份,因为服务器可能仍然在内存中缓存了已修改的数据,并且尚未刷新到磁盘。
以下说明描述了如何对源服务器和副本执行此操作。对于此处讨论的两种情况,假设您具有以下复制设置
源服务器 S1
副本服务器 R1,其源服务器为 S1
连接到 S1 的客户端 C1
连接到 R1 的客户端 C2
在任何一种情况下,获取全局读锁和操作 read_only
变量的语句都将在要备份的服务器上执行,并且不会传播到该服务器的任何副本。
情况 1:使用只读源服务器备份
通过在 S1 上执行以下语句来将源服务器 S1 置于只读状态
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;
当 S1 处于只读状态时,以下属性为真
C1 发送到 S1 的更新请求将被阻止,因为服务器处于只读模式。
C1 发送到 S1 的查询结果请求将成功。
在 S1 上进行备份是安全的。
在 R1 上进行备份是不安全的。此服务器仍在运行,并且可能正在处理来自客户端 C2 的二进制日志或更新请求。
当 S1 处于只读状态时,执行备份。例如,可以使用 mysqldump.
在 S1 上的备份操作完成后,通过执行以下语句将 S1 还原到其正常运行状态
mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;
尽管在 S1 上执行备份是安全的(就备份而言),但它对于性能而言并非最佳,因为 S1 的客户端被阻止执行更新。
此策略适用于在复制设置中备份源服务器,但也可用于非复制设置中的单个服务器。
情况 2:使用只读副本备份
通过在 R1 上执行以下语句来将副本 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;
副本恢复正常运行后,它将再次与源同步,以追赶来自源二进制日志的任何未完成的更新。