可以在复制设置中通过获取全局读锁和操作read_only
修改待备份服务器只读状态的系统变量。
将服务器设置为只读,以便它只处理检索和阻塞更新。
执行备份。
将服务器修改回正常的读写状态。
本节中的说明将要备份的服务器置于对从服务器获取数据的备份方法安全的状态,例如, mysqldump(见mysqldump -一个数据库备份程序).您不应该尝试使用这些指令通过直接复制文件来进行二进制备份,因为服务器可能仍然有缓存在内存中的修改数据,而没有刷新到磁盘。
下面的说明描述了如何对源代码和副本执行此操作。对于这里讨论的两个场景,假设您有以下复制设置:
源服务器S1
以S1为源的复制服务器R1
客户端C1连接到S1
客户端C2连接到R1
在这两种场景中,获取全局读锁和操作read_only
变量在要备份的服务器上执行,并且不会传播到该服务器的任何副本。
场景1:使用只读源备份
通过对源S1执行以下语句,将其置于只读状态:
mysql>表的READ锁SET GLOBAL read_only = ON;
当S1处于只读状态时,以下属性为真:
由于服务器处于只读模式,C1发送到S1的更新请求阻塞。
C1向S1发送查询结果成功。
在S1上进行备份是安全的。
在R1上做备份不安全。此服务器仍在运行,可能正在处理来自客户机C2的二进制日志或更新请求。
S1为只读状态时,执行备份。例如,你可以用, mysqldump.
在S1上的备份操作完成后,通过执行以下语句将S1恢复到正常运行状态:
SET GLOBAL read_only = OFF;mysql >解锁表;
尽管在S1上执行备份是安全的(就备份而言),但它对性能不是最优的,因为S1的客户端被阻止执行更新。
此策略适用于在复制设置中备份源,但也可用于非复制设置中的单个服务器。
场景2:使用只读副本进行备份
通过执行以下语句,将副本R1置于只读状态:
mysql>表的READ锁SET GLOBAL read_only = ON;
当R1处于只读状态时,以下属性为真:
源S1继续运行,因此在源上进行备份是不安全的。
副本R1已停止,因此在副本R1上进行备份是安全的。
这些属性为流行的备份场景提供了基础:让一个副本在一段时间内忙于执行备份不是问题,因为它不会影响整个网络,并且在备份期间系统仍在运行。特别是,客户机仍然可以在源服务器上执行更新,而源服务器不受副本上的备份活动的影响。
当R1为只读状态时,执行备份。例如,你可以用, mysqldump.
在R1上的备份操作完成后,通过执行以下语句将R1恢复到正常工作状态:
SET GLOBAL read_only = OFF;mysql >解锁表;
在replca恢复到正常操作之后,它通过从源的二进制日志中获取任何未完成的更新,再次与源同步。