16.3.1.3 通过使其只读来备份源或副本

通过获取全局读取锁并操纵read_only系统变量以更改要备份的服务器的只读状态,可以在复制设置中备份源服务器或副本服务器:

  • 将服务器设置为只读,以便仅处理检索并阻止更新。

  • 执行备份。

  • 将服务器更改回其正常的读/写状态。

Note

本节中的说明将要备份的服务器置于对于从服务器获取数据的备份方法(例如mysqldump(请参阅第 4.5.4 节“ mysqldump-数据库备份程序”))安全的状态。您不应该尝试通过直接复制文件来使用这些说明来进行二进制备份,因为服务器可能仍具有修改后的数据,这些数据已缓存在内存中并且没有刷新到磁盘。

以下说明描述了如何对源服务器和副本服务器执行此操作。对于此处讨论的两种情况,假设您具有以下复制设置:

  • 源服务器 S1

  • 以 S1 为源的副本服务器 R1

  • Client 端 C1 连接到 S1

  • Client 端 C2 连接到 R1

在这两种情况下,用于获取全局读取锁定和操作read_only变量的语句都在要备份的服务器上执行,并且不会传播到该服务器的任何副本。

方案 1:使用只读源进行备份

通过在源 S1 上执行以下语句,将源 S1 置于只读状态:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;

当 S1 处于只读状态时,以下属性为 true:

  • C1 发送到 S1 的更新请求将被阻止,因为服务器处于只读模式。

  • C1 发送到 S1 的查询结果请求将成功。

  • 在 S1 上进行备份是安全的。

  • 在 R1 上进行备份是不安全的。该服务器仍在运行,并且可能正在处理来自 Client 端 C2 的二进制日志或更新请求

当 S1 只读时,执行备份。例如,您可以使用mysqldump

在 S1 上完成备份操作后,通过执行以下语句将 S1 恢复到其正常操作状态:

mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;

尽管在 S1 上执行备份是安全的(就备份而言),但这并不是最佳性能,因为 S1 的 Client 端被阻止执行更新。

此策略适用于在复制设置中备份源服务器,但也可以用于非复制设置中的单个服务器。

方案 2:使用只读副本进行备份

通过对副本 R1 执行以下语句,将副本 R1 置于只读状态:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;

当 R1 处于只读状态时,以下属性为 true:

  • 源 S1 将 continue 运行,因此在源上进行备份是不安全的。

  • 副本 R1 已停止,因此在副本 R1 上进行备份是安全的。

这些属性为流行的备份方案提供了基础:一个副本副本忙于执行一段时间备份不是问题,因为它不会影响整个网络,并且在备份过程中系统仍在运行。尤其是,Client 端仍可以在源服务器上执行更新,而更新不受复制副本上备份活动的影响。

R1 只读时,执行备份。例如,您可以使用mysqldump

在 R1 上的备份操作完成后,通过执行以下语句将 R1 还原到其正常操作状态:

mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;

副本恢复正常运行后,它会通过追赶源二进制日志中的所有未完成更新,再次与源同步。