可以通过获取全局读锁并操作 read_only
系统变量来更改要备份的服务器的只读状态,从而备份复制设置中的源或副本服务器。
将服务器设为只读,以便它只处理检索并阻止更新。
执行备份。
将服务器更改回其正常的读写状态。
本节中的说明将要备份的服务器置于一种状态,该状态对于从服务器获取数据的备份方法是安全的,例如 mysqldump(参见 第 6.5.4 节,“mysqldump — A Database Backup Program”)。不应尝试使用这些说明通过直接复制文件来创建二进制备份,因为服务器可能仍会在内存中缓存已修改的数据,而不会刷新到磁盘。
以下说明描述了如何在源和副本上执行此操作。对于此处讨论的两种情况,假设您有以下复制设置
源服务器 S1
以 S1 作为其源的副本服务器 R1
连接到 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;
副本恢复到正常运行后,它将再次与源同步,以追赶源二进制日志中的任何未完成更新。