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

在某些情况下,您可能只有一个源,并且要将不同的数据库复制到不同的副本。例如,您可能希望将不同的销售数据分配给不同的部门,以帮助在数据分析过程中分散负载。 图 16.2,“复制数据库以分隔副本”中显示了此布局的示例。

图 16.2 复制数据库以分隔副本

MySQL 源具有三个数据库,数据库 A,数据库 B 和数据库 C。 databaseA 仅复制到 MySQL 副本 1,databaseB 仅复制到 MySQL 副本 2,databaseC 仅复制到 MySQL 副本 3.

您可以通过正常配置源和副本,然后通过在每个副本上使用--replicate-wild-do-table配置选项来限制每个副本处理的二进制日志语句来实现这种分离。

Important

在使用基于语句的复制时,不要为此目的使用--replicate-do-db,因为基于语句的复制会导致此选项的效果根据当前所选数据库的不同而不同。这也适用于混合格式复制,因为这使某些更新可以使用基于语句的格式进行复制。

但是,如果仅使用基于行的复制,则为此目的而使用--replicate-do-db应该是安全的,因为在这种情况下,当前选择的数据库对选项的操作没有影响。

例如,为了支持图 16.2,“复制数据库以分隔副本”中所示的分离,您应在执行START SLAVE之前按以下方式配置每个副本:

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

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

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

此配置中的每个副本都从源接收整个二进制日志,但是仅执行来自二进制日志的事件,这些事件适用于对该副本有效的--replicate-wild-do-table选项所包含的数据库和 table。

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

  • 将所有数据同步到每个副本,然后删除不想保留的数据库,table 或两者。

  • 使用mysqldump为每个数据库创建一个单独的转储文件,并在每个副本上加载适当的转储文件。

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

Note

除非您使用innodb_file_per_table,否则这不适用于InnoDB数据库。