• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用复制进行备份

    要将复制用作备份解决方案,请将数据从主服务器复制到从服务器,然后备份数据从服务器。可以暂停和关闭从服务器,而不会影响主服务器的运行,因此您可以生成“实时”数据的有效快照,否则将需要关闭主服务器。

    备份数据库的方式取决于其大小以及是否仅备份数据,数据以及复制从属状态,以便在发生故障时可以重建从属。因此,有两种选择:

    • 如果您使用复制作为解决方案来支持您备份主数据库上的数据,并且数据库的大小不是太大,则mysqldump工具可能是合适的。
    • 对于较大的数据库,其中mysqldump不切实际或效率低下,您可以备份原始数据文件。使用原始数据文件选项还意味着您可以备份二进制日志和中继日志,以便在从站发生故障时重新创建从站。有关更多信息,

    可以用于主服务器或从服务器的另一种备份策略是将服务器置于只读状态。对只读服务器执行备份,然后将其更改回其通常的读/写操作状态。请参见“通过使其只读来备份主机或从机”。


    使用mysqldump备份从站

    使用mysqldump创建数据库副本可以使您以一种格式捕获数据库中的所有数据,该格式可以将信息导入到另一个MySQL Server实例中(请参见“mysqldump—数据库备份程序””)。由于信息的格式为SQL语句,因此在需要紧急访问数据时,可以轻松地将该文件分发并应用于正在运行的服务器。但是,如果数据集的大小很大,则mysqldump可能不切实际。

    使用mysqldump时,应在开始转储过程之前停止从属服务器上的复制,以确保转储包含一致的数据集:

    1. 停止从站处理请求。您可以使用mysqladmin在从站上完全停止复制:

      shell>mysqladmin stop-slave
      

      或者,您可以仅停止从属SQL线程来暂停事件执行:

      shell>mysql -e 'STOP SLAVE SQL_THREAD;'
      

      这使从站能够继续从主站的二进制日志中接收数据更改事件,并使用I / O线程将它们存储在中继日志中,但阻止从站执行这些事件并更改其数据。在繁忙的复制环境中,允许I / O线程在备份期间运行可能会在重新启动从属SQL线程时加快追赶过程。

    2. 运行mysqldump以转储数据库。您可以转储所有数据库,也可以选择要转储的数据库。例如,要转储所有数据库:

      shell>mysqldump --all-databases > fulldb.dump
      
    3. 转储完成后,再次启动从属操作:

      shell>mysqladmin start-slave
      

    在前面的示例中,您可能需要向命令添加登录凭据(用户名,密码),并将该过程捆绑到一个脚本中,该脚本可以每天自动运行。

    如果使用这种方法,请确保监视从属复制过程,以确保运行备份所花费的时间不会影响从属跟上主服务器事件的能力。请参见“检查复制状态”。如果从站无法跟上,则可能要添加另一个从站并分发备份过程。有关如何配置此方案的示例,请参见“将不同的数据库复制到不同的从站”。

    从从站备份原始数据

    为了保证所复制文件的完整性,应在关闭从属服务器时备份MySQL复制从属服务器上的原始数据文件。如果MySQL服务器仍在运行,则后台任务可能仍在更新数据库文件,尤其是那些涉及具有后台进程(例如)的存储引擎的任务InnoDB。使用InnoDB,可以在崩溃恢复期间解决这些问题,但是由于可以在备份过程中关闭从服务器而不影响主服务器的执行,因此可以利用此功能。

    要关闭服务器并备份文件:

    1. 关闭从MySQL服务器:

      shell>mysqladmin shutdown
      
    2. 复制数据文件。您可以使用任何合适的复制或归档实用程序,包括cptarWinZip。例如,假设数据目录位于当前目录下,则可以按以下方式归档整个目录:

      shell>tar cf /tmp/dbbackup.tar ./data
      
    3. 再次启动MySQL服务器。在Unix下:

      shell>mysqld_safe &
      

      在Windows下:

      C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld"
      

    通常,您应该备份从MySQL服务器的整个数据目录。如果您希望能够还原数据并作为从属运行(例如,在从属发生故障时),那么除了数据之外,还需要具有主信息存储库和中继日志信息存储库,并且中继日志文件。恢复从站的数据后,需要这些项目来恢复复制。如果表已用于主信息和中继日志信息存储库(请参见“复制中继和状态日志”)(这是MySQL 8.0中的默认设置),这些表与数据目录一起备份。如果文件已用于存储库,则必须单独备份这些文件。如果将中继日志文件放置在与数据目录不同的位置,则还必须分别备份它们。

    如果丢失了中继日志,但是仍然有该relay-log.info文件,则可以检查该文件以确定SQL线程在主二进制日志中执行了多远。然后你可以使用CHANGE MASTER TOMASTER_LOG_FILEMASTER_LOG_POS选项告诉奴隶从该点重新读取二进制日志。这要求二进制日志仍然存在于主服务器上。

    如果从属服务器正在复制LOAD DATA语句,则还应该备份SQL_LOAD-*该从属服务器用于此目的的目录中存在的所有文件。从站需要这些文件来恢复任何中断的LOAD DATA操作的复制。该目录的位置是slave_load_tmpdir系统变量的值。如果未使用该变量集启动服务器,则目录位置是tmpdir系统变量的值。

    通过使其只读来备份主机或从机

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

    1. 将服务器设置为只读,以便仅处理检索并阻止更新。
    2. 执行备份。
    3. 将服务器更改回其正常的读/写状态。
    注意

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

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

    • 主服务器M1
    • 以M1作为主服务器的从服务器S1
    • 客户端C1连接到M1
    • 客户端C2连接到S1

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

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

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

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

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

    • C1发送到M1的更新请求将被阻止,因为服务器处于只读模式。
    • C1发送到M1的查询结果请求将成功。
    • 在M1上进行备份是安全的。
    • 在S1上进行备份是不安全的。该服务器仍在运行,并且可能正在处理来自客户端C2的二进制日志或更新请求。

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

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

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

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

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

    方案2:使用只读从站进行备份

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

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

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

    • 主机M1将继续运行,因此在主机上进行备份是不安全的。
    • 从站S1停止,因此在从站S1上进行备份是安全的。

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

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

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

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

    从站恢复到正常操作后,它会通过赶上主站二进制日志中所有未完成的更新,再次与主站同步。