### 17.4.6 将不同的数据库复制到不同的副本

在某些情况下，您有一个源服务器并希望将不同的数据库复制到不同的副本。例如，您可能希望将不同的销售数据分发到不同的部门，以帮助分散数据分析期间的负载。此布局的示例显示在[图 17.2，“将数据库复制到单独的副本”](replication-solutions-partitioning.html#figure_replication-multi-db).

[](<>)

**图 17.2 将数据库复制到单独的副本**

<img alt="The MySQL source has three databases, databaseA, databaseB, and databaseC. databaseA is replicated only to MySQL Replica 1, databaseB is replicated only to MySQL Replica 2, and databaseC is replicated only to MySQL Replica 3." src="images/multi-db.png" height="214" width="370" />

您可以通过正常配置源和副本来实现这种分离，然后通过使用限制每个副本处理的二进制日志语句[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)每个副本上的配置选项。

重要的

你应该*不是*采用[`--replicate-do-db`](replication-options-replica.html#option_mysqld_replicate-do-db)为此，在使用基于语句的复制时，因为基于语句的复制会导致此选项的效果根据当前选择的数据库而有所不同。这也适用于混合格式复制，因为这可以使用基于语句的格式复制一些更新。

但是，使用起来应该是安全的[`--replicate-do-db`](replication-options-replica.html#option_mysqld_replicate-do-db)如果您仅使用基于行的复制，则出于此目的，因为在这种情况下，当前选择的数据库对选项的操作没有影响。

例如，为了支持分离，如图所示[图 17.2，“将数据库复制到单独的副本”](replication-solutions-partitioning.html#figure_replication-multi-db)，您应该在执行之前按如下方式配置每个副本[`开始复制`](start-replica.html)：

-   副本 1 应该使用`--replicate-wild-do-table=databaseA.%`.

-   副本 2 应该使用`--replicate-wild-do-table=databaseB.%`.

-   副本 3 应该使用`--replicate-wild-do-table=databaseC.%`.

    此配置中的每个副本都从源接收整个二进制日志，但仅执行二进制日志中适用于数据库和表的事件[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table)对该副本有效的选项。

    如果您有必须在复制开始之前同步到副本的数据，您有多种选择：

-   将所有数据同步到每个副本，并删除您不想保留的数据库、表或两者。

-   采用[**mysql转储**](mysqldump.html)为每个数据库创建单独的转储文件并在每个副本上加载适当的转储文件。

-   使用原始数据文件转储并仅包含每个副本所需的特定文件和数据库。

    笔记

    这不适用于[`InnoDB`](innodb-storage-engine.html)数据库，除非您使用[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table).
