MySQL 8.0 参考手册  / 第十七章复制  / 17.4 复制解决方案  /  16.3.5 将不同的数据库复制到不同的副本

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

可能存在这样的情况,您只有一个源并且想要将不同的数据库复制到不同的副本。例如,您可能希望将不同的销售数据分发到不同的部门,以帮助分散数据分析期间的负载。图 16.2 “将数据库复制到单独的副本”中显示了此布局的示例 。

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

MySQL源有3个数据库,databaseA、databaseB、databaseC。 databaseA只复制到MySQL Replica 1,databaseB只复制到MySQL Replica 2,databaseC只复制到MySQL Replica 3。

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

重要的

使用 基于语句的复制时 不应--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于该副本上生效的选项所包含的数据库和表的事件。

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

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

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

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

    笔记

    这不适用于InnoDB 数据库,除非您使用 innodb_file_per_table.