Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Backing Up a Source or Replica by Making It Read Only

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

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

  1. 将服务器设置为只读状态,以便只处理检索和阻止更新。

  2. 执行备份。

  3. 将服务器恢复到正常的读/写状态。

Note

本节中的指令将服务器置于备份方法可以从服务器获取数据的状态,例如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;

在副本恢复到正常操作状态后,它再次同步到源服务器,通过从源服务器的二进制日志中捕捉任何未完成的更新。