Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Using MySQL Enterprise Backup with Group Replication

20.5.6 使用 MySQL 企业备份与组复制

MySQL 企业备份 是 MySQL 服务器的商业许可备份实用程序,随 MySQL 企业版 提供。此部分解释如何使用 MySQL 企业备份备份组复制成员,然后恢复它。同样的技术可以用于快速添加新成员到组中。

使用 MySQL 企业备份备份组复制成员

备份组复制成员类似于备份独立的 MySQL 实例。以下说明假设您已经熟悉使用 MySQL 企业备份进行备份;如果不是这种情况,请查看 MySQL 企业备份 8.0 用户指南,特别是 备份数据库服务器。还请注意 授予备份管理员 MySQL 权限使用 MySQL 企业备份与组复制 中的要求。

考虑以下组,包含三个成员,s1s2s3,运行在同名主机上:

mysql> SELECT member_host, member_port, member_state FROM performance_schema.replication_group_members;
+-------------+-------------+--------------+
| member_host | member_port | member_state |
+-------------+-------------+--------------+
| s1          |        3306 | ONLINE       |
| s2          |        3306 | ONLINE       |
| s3          |        3306 | ONLINE       |
+-------------+-------------+--------------+

使用 MySQL 企业备份,创建 s2 的备份,例如,在其主机上发出以下命令:

s2> mysqlbackup --defaults-file=/etc/my.cnf --backup-image=/backups/my.mbi_`date +%d%m_%H%M` \
		      --backup-dir=/backups/backup_`date +%d%m_%H%M` --user=root -p \
--host=127.0.0.1 backup-to-image
Notes
  • 对于 MySQL 企业备份 8.0.18 及更早版本, 如果系统变量 sql_require_primary_key 设置为 ON,MySQL 企业备份无法在服务器上记录备份进度。这是因为服务器上的 backup_progress 表是一个 CSV 表,不支持主键。在这种情况下,mysqlbackup 在备份操作期间发出以下警告:

    181011 11:17:06 MAIN WARNING: MySQL query 'CREATE TABLE IF NOT EXISTS
    mysql.backup_progress( `backup_id` BIGINT NOT NULL, `tool_name` VARCHAR(4096)
    NOT NULL, `error_code` INT NOT NULL, `error_message` VARCHAR(4096) NOT NULL,
    `current_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP               ON
    UPDATE CURRENT_TIMESTAMP,`current_state` VARCHAR(200) NOT NULL ) ENGINE=CSV
    DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin': 3750, Unable to create a table
    without PK, when system variable 'sql_require_primary_key' is set. Add a PK
    to the table or unset this variable to avoid this message. Note that tables
    without PK can cause performance problems in row-based replication, so please
    consult your DBA before changing this setting.
    181011 11:17:06 MAIN WARNING: This backup operation's progress info cannot be
    logged.

    这不会阻止 mysqlbackup 完成备份。

  • 对于 MySQL 企业备份 8.0.20 及更早版本,当备份次要成员时,因为 MySQL 企业备份无法将备份状态和元数据写入只读服务器实例,因此可能在备份操作期间发出类似以下警告:

    181113 21:31:08 MAIN WARNING: This backup operation cannot write to backup
    progress. The MySQL server is running with the --super-read-only option.

    您可以使用 --no-history-logging 选项与备份命令来避免警告。这不是 MySQL 企业备份 8.0.21 及更高版本的问题—请查看 使用 MySQL 企业备份与组复制 了解详情。

恢复失败的成员

假设其中一个成员 (s3 在以下示例中) 严重损坏。可以使用组成员 s2 的最新备份来恢复 s3。以下是恢复步骤:

  1. 将 s2 的备份复制到 s3 的主机上。 复制备份的确切方式取决于操作系统和可用的工具。在这个示例中,我们假设主机都是 Linux 服务器,并使用 SCP 将文件复制到它们之间:

    s2/backups> scp my.mbi_2206_1429 s3:/backups
  2. 恢复备份。 连接到目标主机(在这个示例中是 s3 的主机),并使用 MySQL 企业备份恢复备份。以下是步骤:

    1. 停止损坏的服务器,如果它仍在运行。例如,在 Linux 发行版中使用 systemd:

      s3> systemctl stop mysqld
    2. 保留损坏服务器的数据目录中的两个配置文件,auto.cnfmysqld-auto.cnf(如果存在),将它们复制到数据目录外的安全位置。这是为了保留 服务器的 UUID第 7.1.9.3 节,“Persisted System Variables”(如果使用),它们在下面的步骤中需要。

    3. 删除 s3 的数据目录中的所有内容。例如:

      s3> rm -rf /var/lib/mysql/*

      如果系统变量 innodb_data_home_dirinnodb_log_group_home_dirinnodb_undo_directory 指向的目录不是数据目录,它们也应该被清空;否则,恢复操作将失败。

    4. 将备份还原到 s2 的主机上,用于 s3

      s3> mysqlbackup --defaults-file=/etc/my.cnf \
        --datadir=/var/lib/mysql \
        --backup-image=/backups/my.mbi_2206_1429  \
      --backup-dir=/tmp/restore_`date +%d%m_%H%M` copy-back-and-apply-log
      Note

      上面的命令假设 s2s3 上的二进制日志和中继日志具有相同的基本名称,并位于两个服务器上的相同位置。如果这些条件不满足,您应该使用 --log-bin--relay-log 选项来将二进制日志和中继日志还原到 s3 的原始文件路径上。例如,如果您知道 s3 上的二进制日志的基本名称是 s3-bin,中继日志的基本名称是 s3-relay-bin,那么您的还原命令应该如下所示:

      mysqlbackup --defaults-file=/etc/my.cnf \
        --datadir=/var/lib/mysql \
        --backup-image=/backups/my.mbi_2206_1429  \
        --log-bin=s3-bin --relay-log=s3-relay-bin \
        --backup-dir=/tmp/restore_`date +%d%m_%H%M` copy-back-and-apply-log

      能够将二进制日志和中继日志还原到正确的文件路径,使还原过程变得更容易;如果由于某些原因无法实现,请参阅 Rebuild the Failed Member to Rejoin as a New Member

  3. 还原 auto.cnf 文件以供 s3 使用。 要重新加入复制组,恢复的成员 必须 具有相同的 server_uuid,它曾经用于加入组之前。通过将 auto.cnf 文件从步骤 2 中保存的副本复制到恢复的成员的数据目录中,提供旧的服务器 UUID。

    Note

    如果您无法提供失败的成员的原始 server_uuid 到恢复的成员中,通过恢复其旧的 auto.cnf 文件,您必须让恢复的成员作为新成员加入组;请参阅 Rebuild the Failed Member to Rejoin as a New Member 中的说明。

  4. 还原 mysqld-auto.cnf 文件以供 s3 使用(仅在 s3 使用持久系统变量时需要)。 失败的成员用于配置的 Section 7.1.9.3, “Persisted System Variables” 设置必须提供给恢复的成员。这些设置可以在失败的服务器的 mysqld-auto.cnf 文件中找到,您应该在步骤 2 中保存了该文件。将文件还原到恢复的服务器的数据目录中。请参阅 Restoring Persisted System Variables 中的说明,如果您没有该文件的副本。

  5. 启动恢复的服务器。 例如,在使用 systemd 的 Linux 发行版上:

    systemctl start mysqld
    Note

    如果您要恢复的服务器是主成员,请在启动恢复的服务器之前执行 Restoring a Primary Member 中的步骤。

  6. 重新启动组复制。 使用例如 mysql 客户端连接到重新启动的 s3,然后发出以下命令:

    mysql> START GROUP_REPLICATION;

    在恢复的实例可以成为组的在线成员之前,它需要应用组中发生的所有事务;这可以通过组复制的 分布式恢复 机制来实现,该过程在发出 START GROUP_REPLICATION 语句后开始。要检查恢复的实例的成员状态,请发出:

    mysql> SELECT member_host, member_port, member_state FROM performance_schema.replication_group_members;
    +-------------+-------------+--------------+
    | member_host | member_port | member_state |
    +-------------+-------------+--------------+
    | s1          |        3306 | ONLINE       |
    | s2          |        3306 | ONLINE       |
    | s3          |        3306 | RECOVERING   |
    +-------------+-------------+--------------+

    这表明 s3 正在应用事务以赶上组的其余部分。一旦它赶上了组的其余部分,其 member_state 将更改为 ONLINE

    mysql> SELECT member_host, member_port, member_state FROM performance_schema.replication_group_members;
    +-------------+-------------+--------------+
    | member_host | member_port | member_state |
    +-------------+-------------+--------------+
    | s1          |        3306 | ONLINE       |
    | s2          |        3306 | ONLINE       |
    | s3          |        3306 | ONLINE       |
    +-------------+-------------+--------------+
    Note

    如果您要恢复的服务器是主成员,一旦它与组同步并变为 在线,请按照 恢复主成员 中的步骤描述,撤销您在启动服务器之前所做的配置更改。

成员现在已经从备份中完全恢复,并作为组中的常规成员。

重新构建失败的成员以重新加入组

有时,无法按照 恢复失败的成员 中的步骤进行操作,因为例如二进制日志或中继日志已损坏,或者备份中缺少这些日志。在这种情况下,使用备份重新构建成员,然后将其作为新成员添加到组中。在以下步骤中,我们假设重新构建的成员名为 s3,与失败的成员相同,并且它在同一主机上运行:

  1. 将 s2 的备份复制到 s3 的主机上。 复制备份的确切方式取决于操作系统和可用的工具。在这个示例中,我们假设主机都是 Linux 服务器,并使用 SCP 将文件复制到它们之间:

    s2/backups> scp my.mbi_2206_1429 s3:/backups
  2. 恢复备份。 连接到目标主机(在这个示例中是 s3 的主机),并使用 MySQL Enterprise Backup 恢复备份。以下是步骤:

    1. 停止损坏的服务器,如果它仍在运行。例如,在使用 systemd 的 Linux 发行版上:

      s3> systemctl stop mysqld
    2. 如果找到损坏的服务器的数据目录中的配置文件 mysqld-auto.cnf,请将其复制到数据目录外的安全位置,以便保留服务器的 第 7.1.9.3 节,“持久系统变量”,这些变量将在后面需要。

    3. 删除 s3 的数据目录中的所有内容。例如:

      s3> rm -rf /var/lib/mysql/*

      如果系统变量 innodb_data_home_dirinnodb_log_group_home_dirinnodb_undo_directory 指向数据目录以外的任何目录,也应该清空这些目录;否则,恢复操作将失败。

    4. 使用 MySQL Enterprise Backup 将 s2 的备份恢复到 s3 的主机上。在这种方法中,我们正在重新构建 s3 作为新成员,不需要或不想使用备份中的旧二进制日志和中继日志;因此,如果这些日志包含在备份中,请使用 --skip-binlog--skip-relaylog 选项:

      s3> mysqlbackup --defaults-file=/etc/my.cnf \
        --datadir=/var/lib/mysql \
        --backup-image=/backups/my.mbi_2206_1429  \
        --backup-dir=/tmp/restore_`date +%d%m_%H%M` \
        --skip-binlog --skip-relaylog \
      copy-back-and-apply-log
      Note

      如果您在备份中有健康的二进制日志和中继日志,可以无问题地将其传输到目标主机上,在这种情况下,请按照 恢复失败的成员 中的步骤进行操作。

  3. 恢复 mysqld-auto.cnf 文件(仅当 s3 使用持久系统变量时需要)。 失败的成员的配置设置,用于 第 7.1.9.3 节,“持久系统变量”,必须提供给恢复的服务器。这些设置可以在失败的服务器的 mysqld-auto.cnf 文件中找到,您应该在步骤 2 中将其保存到安全位置。请参阅 恢复持久系统变量,了解如果您没有该文件的副本该怎么办。

    Note

    不要将损坏的服务器的 auto.cnf 文件恢复到新成员的数据目录中—当重新构建的 s3 加入组作为新成员时,它将被分配一个新的服务器 UUID。

  4. 启动恢复的服务器。 例如,在使用 systemd 的 Linux 发行版上:

    systemctl start mysqld
    Note

    如果您要恢复的服务器是主成员,请按照 恢复主成员 中的步骤描述,在启动恢复的服务器之前执行这些步骤:在启动恢复的服务器之前

  5. 重新配置恢复的成员以加入组复制。 使用 mysql 客户端连接到恢复的服务器,并使用以下命令重置源和副本信息:

    mysql> RESET BINARY LOGS AND GTIDS;
    
    mysql> RESET REPLICA ALL;

    为了使恢复的服务器能够使用组复制的分布式恢复机制自动恢复,需要配置服务器的 gtid_executed 变量。为此,请使用备份的 backup_gtid_executed.sql 文件,该文件通常位于恢复的成员数据目录下。禁用二进制日志记录,使用 backup_gtid_executed.sql 文件配置 gtid_executed,然后重新启用二进制日志记录:

    mysql> SET SQL_LOG_BIN=OFF;
    mysql> SOURCE datadir/backup_gtid_executed.sql
    mysql> SET SQL_LOG_BIN=ON;

    然后,在成员上配置 组复制用户凭证

    mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', 
        ->   SOURCE_PASSWORD='password'
        ->   FOR CHANNEL 'group_replication_recovery';
  6. 重新启动组复制。 使用 mysql 客户端向恢复的服务器发出以下命令:

    mysql> START GROUP_REPLICATION;

    在恢复的实例可以成为组的在线成员之前,它需要应用组中发生的所有事务;这可以使用组复制的 分布式恢复 机制来实现,过程将在 START GROUP_REPLICATION 语句发出后开始。要检查恢复实例的成员状态,请发出:

    mysql> SELECT member_host, member_port, member_state FROM performance_schema.replication_group_members;
    +-------------+-------------+--------------+
    | member_host | member_port | member_state |
    +-------------+-------------+--------------+
    | s3          |        3306 | RECOVERING   |
    | s2          |        3306 | ONLINE       |
    | s1          |        3306 | ONLINE       |
    +-------------+-------------+--------------+

    这表明 s3 正在应用事务以赶上组。 一旦它赶上了组的其余部分,其 member_state 将更改为 ONLINE

    mysql> SELECT member_host, member_port, member_state FROM performance_schema.replication_group_members;
    +-------------+-------------+--------------+
    | member_host | member_port | member_state |
    +-------------+-------------+--------------+
    | s3          |        3306 | ONLINE       |
    | s2          |        3306 | ONLINE       |
    | s1          |        3306 | ONLINE       |
    +-------------+-------------+--------------+
    Note

    如果您正在恢复的服务器是主要成员,一旦它与组同步并变为 ONLINE,请执行 恢复主要成员 中描述的步骤,以撤销在启动服务器之前对服务器所做的配置更改。

成员现在已经恢复到组中作为新成员。

恢复持久系统变量。 mysqlbackup 不支持备份或保留 第 7.1.9.3 节,“持久系统变量” — 文件 mysqld-auto.cnf 不包含在备份中。要使用持久变量设置启动恢复的成员,您需要执行以下操作:

  • 从损坏的服务器中保存 mysqld-auto.cnf 文件的副本,并将其复制到恢复服务器的数据目录中。

  • 从组中的另一个成员复制 mysqld-auto.cnf 文件到恢复服务器的数据目录中,如果该成员具有与损坏的成员相同的持久系统变量设置。

  • 在启动恢复服务器并重新启动组复制之前,通过 mysql 客户端手动设置所有系统变量的持久值。

恢复主要成员。 如果恢复的成员是组中的主要成员,需要采取措施防止在分布式恢复过程中对恢复数据库的写操作。根据客户端如何访问组,可以在恢复成员变为网络可访问之前执行 DML 语句。为避免这种情况,在启动恢复服务器之前,在服务器选项文件中配置以下系统变量:

group_replication_start_on_boot=OFF
super_read_only=ON
event_scheduler=OFF

这些设置确保成员在启动时变为只读,并且事件计划程序在分布式恢复过程中被关闭。客户端也需要配置适当的错误处理,因为它们在恢复成员 catch-up 期间被暂时禁止执行 DML 操作。 一旦恢复过程完成并且恢复成员与组同步,撤销这些更改;重新启动事件计划程序:

mysql> SET global event_scheduler=ON;

在成员的选项文件中编辑以下系统变量,以便正确配置下一次启动:

group_replication_start_on_boot=ON
super_read_only=OFF
event_scheduler=ON