不幸的是,这是不允许的,因为这样的查询很难保持事务性;内部使用多语句事务来保证单个插入选择的事务性(如果一个分区失败(dup key 或其他东西),我们想要回滚所有内容!)。由于我们没有跨数据库多语句事务(还没有!),我们没有跨数据库插入选择(还没有!)。
请继续关注更好的解决方案。
但是,如果您真的想这样做,这就是您要做的。然而,
继续需要您自担风险。这不是一个受支持的程序。
但它应该工作。
1) 在 上db_b
,创建一个与 具有相同列的表source_table
,但制作 shard key SHARD()
。
2)在db_a
,运行SHOW PARTITIONS
。
db_a_<ordinal>
3) 对于每个分区,在列出的主机和端口上创建一个连接SHOW PARTITIONS
。在该连接上运行SHOW DATABASES
,您将看到一些名为db_b_<another>
. 选一个,无所谓。运行INSERT INTO db_b<another>.source_table SELECT * from db_a_<ordinal>.source_table
。
3.5) 在这一点上,你还没有写到你关心的表,但现在我们会写的。看db_b.source_table
。一切都正确吗?所有的数据都在那里吗?运行SHOW CREATE TABLE
并仔细检查分片键SHARD KEY ()
(它应该在注释中)。一切看起来都不错?好的,我们可以继续。
4)在为每个分区完成此操作后,您可以执行INSERT INTO db_b.target_table (cols) SELECT cols from db_b.source_table
或执行任何您想要的操作。
祝你好运!