#### 17.1.2.5 选择数据快照的方法

如果源数据库包含现有数据，则需要将此数据复制到每个副本。有多种方法可以从源数据库中转储数据。以下部分描述了可能的选项。

要选择适当的数据库转储方法，请在以下选项中进行选择：

-   使用[**mysql转储**](mysqldump.html)工具来创建要复制的所有数据库的转储。这是推荐的方法，尤其是在使用时[`InnoDB`](innodb-storage-engine.html).

-   如果您的数据库存储在二进制可移植文件中，您可以将原始数据文件复制到副本中。这可能比使用更有效[**mysql转储**](mysqldump.html)并在每个副本上导入文件，因为它跳过了更新索引的开销作为`插入`陈述被重播。使用存储引擎，例如[`InnoDB`](innodb-storage-engine.html)不建议这样做。

-   使用 MySQL 服务器的克隆插件将所有数据从现有副本传输到克隆。有关使用此方法的说明，请参阅[第 5.6.7.7 节，“复制克隆”](clone-plugin-replication.html).

提示

要部署多个 MySQL 实例，您可以使用[InnoDB 集群](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html)这使您能够轻松地管理一组 MySQL 服务器实例[MySQL 外壳](https://dev.mysql.com/doc/mysql-shell/8.0/en/).InnoDB Cluster 将 MySQL Group Replication 包装在一个编程环境中，使您能够轻松部署 MySQL 实例集群以实现高可用性。此外，InnoDB Cluster 与[MySQL 路由器](https://dev.mysql.com/doc/mysql-router/8.0/en/)，这使您的应用程序无需编写自己的故障转移过程即可连接到集群。但是，对于不需要高可用性的类似用例，您可以使用[InnoDB 副本集](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-replicaset.html).可以找到 MySQL Shell 的安装说明[这里](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install.html).

##### 17.1.2.5.1 使用 mysqldump 创建数据快照

要在现有源数据库中创建数据快照，请使用[**mysql转储**](mysqldump.html)工具。数据转储完成后，在开始复制过程之前将此数据导入副本。

以下示例将所有数据库转储到名为`数据库转储文件`，并且包括[`- 主要的数据`](mysqldump.html#option_mysqldump_master-data)自动附加的选项[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)副本上启动复制过程所需的语句：

```
$> mysqldump --all-databases --master-data > dbdump.db
```

笔记

如果你不使用[`- 主要的数据`](mysqldump.html#option_mysqldump_master-data)，则需要手动将所有表锁定在单独的会话中。看[第 17.1.2.4 节，“获取复制源二进制日志坐标”](replication-howto-masterstatus.html).

可以使用[**mysql转储**](mysqldump.html)工具。如果要选择要包含在转储中的数据库，请不要使用[`--所有数据库`](mysqldump.html#option_mysqldump_all-databases).选择以下选项之一：

-   使用排除数据库中的所有表[`--忽略表`](mysqldump.html#option_mysqldump_ignore-table)选项。

-   仅命名您要转储的那些数据库，使用[`--数据库`](mysqldump.html#option_mysqldump_databases)选项。

笔记

默认情况下，如果源上正在使用 GTID ([`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)),[**mysql转储**](mysqldump.html)包括来自的 GTID[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)在转储输出中的源上设置以将它们添加到[`gtid_purged`](replication-options-gtids.html#sysvar_gtid_purged)在副本上设置。如果您只转储特定的数据库或表，请务必注意包含的值[**mysql转储**](mysqldump.html)包括所有交易的 GTID[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)在源上设置，即使那些更改了数据库的抑制部分，或服务器上未包含在部分转储中的其他数据库。检查mysqldump的描述`--set-gtid-purge`用于查找您正在使用的 MySQL 服务器版本的默认行为结果的选项，以及如果此结果不适合您的情况如何更改行为。

有关详细信息，请参阅[第 4.5.4 节，“mysqldump - 数据库备份程序”](mysqldump.html).

要导入数据，请将转储文件复制到副本，或者在远程连接到副本时从源访问文件。

##### 17.1.2.5.2 使用原始数据文件创建数据快照

本节介绍如何使用组成数据库的原始文件创建数据快照。对于使用具有复杂缓存或日志算法的存储引擎的表，使用这种方法需要额外的步骤来生成完美的“时间点”快照：初始复制命令可能会忽略缓存信息和日志更新，即使您已获得全局读锁。存储引擎对此的响应方式取决于其崩溃恢复能力。

如果你使用[`InnoDB`](innodb-storage-engine.html)桌子，你可以使用**mysqlbackup**来自MySQL企业备份组件的命令，以生成一致的快照。此命令记录与要在复制副本上使用的快照相对应的日志名和偏移量。MySQL Enterprise Backup是一款商业产品，作为MySQL Enterprise订阅的一部分提供。看见[第30.2节，“MySQL企业备份概述”](mysql-enterprise-backup.html)获取详细信息。

如果源和副本的值不同，此方法也无法可靠地工作[`ft_stopword_文件`](server-system-variables.html#sysvar_ft_stopword_file),[`ft_min_word_len`](server-system-variables.html#sysvar_ft_min_word_len)或[`ft_max_word_len`](server-system-variables.html#sysvar_ft_max_word_len)您正在复制具有全文索引的表。

假设上述异常不适用于您的数据库，请使用[冷备份](glossary.html#glos_cold_backup)获取数据的可靠二进制快照的技术`InnoDB`桌子：做一个[缓慢关机](glossary.html#glos_slow_shutdown)然后手动复制数据文件。

创建的原始数据快照[`米萨姆`](myisam-storage-engine.html)表当MySQL数据文件存在于单个文件系统中时，可以使用标准的文件复制工具，例如**内容提供商**或**复制**，一种远程复制工具，如**scp**或**远程同步**，一种存档工具，如**拉链**或**焦油**，或文件系统快照工具，如**倾倒**。如果仅复制某些数据库，请仅复制与这些表相关的文件。对于`InnoDB`，所有数据库中的所有表都存储在[系统表空间](glossary.html#glos_system_tablespace)文件，除非你有[`innodb_文件_每个_表`](innodb-parameters.html#sysvar_innodb_file_per_table)选项已启用。

复制不需要以下文件：

-   有关`mysql`数据库

-   复制副本的连接元数据存储库文件`主人信息`，如果使用；现在不推荐使用此文件（请参阅[第17.2.4节，“中继日志和复制元数据存储库”](replica-logs.html)).

-   源的二进制日志文件，但二进制日志索引文件除外，前提是您要使用它来定位复制副本的源二进制日志坐标。

-   任何中继日志文件。

    取决于您是否正在使用`InnoDB`无论是否为表格，请选择以下选项之一：

    如果你正在使用[`InnoDB`](innodb-storage-engine.html)表，以及为了获得与原始数据快照最一致的结果，请在此过程中关闭源服务器，如下所示：

1.  获取读锁并获取源的状态。看见[第17.1.2.4节，“获取复制源二进制日志坐标”](replication-howto-masterstatus.html).

2.  在单独的会话中，关闭源服务器：

    ```
    $> mysqladmin shutdown
    ```

3.  复制MySQL数据文件。下面的例子展示了实现这一点的常用方法。您只需选择其中一个：

    ```
    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
    ```

4.  重新启动源服务器。

    如果你没有使用[`InnoDB`](innodb-storage-engine.html)表中，您可以从源获取系统快照，而无需按照以下步骤关闭服务器：

5.  获取读锁并获取源的状态。看见[第17.1.2.4节，“获取复制源二进制日志坐标”](replication-howto-masterstatus.html).

6.  复制MySQL数据文件。下面的例子展示了实现这一点的常用方法。您只需选择其中一个：

    ```
    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
    ```

7.  在获取读取锁的客户端中，释放锁：

    ```
    mysql> UNLOCK TABLES;
    ```

    创建数据库的存档或副本后，请在开始复制过程之前将文件复制到每个副本。
