MySQL/玛丽亚数据库:示例之间表的选定同步

bvuwiixz  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(142)

我必须将一些表从一个MySql-Database同步到另一个(不同机器上的不同服务器)。这种传输应该只包括特殊的表和具有特殊特征的表行(例如,如果名为transfer的列被设置为1)。而且它应该是自动/透明的,快速的,并且在短周期内工作(至少每20秒)。
我尝试了不同的方法,但没有一个符合所有的要求。

  • 与加莱拉的DB-synchronize工作正常,但不排除表/行。
  • mysqldump不会自动(必须启动),也不会排除。

除了用一些自己的代码永久运行之外,没有其他方法来完成这项工作吗?

bgibtngc

bgibtngc1#

这些部分同步必须使用专门创建的方案来执行。
可能实现:
1.测试您的服务器示例是否支持The FEDERATED Storage Engine。默认情况下允许此操作。
1.测试目标服务器是否可以使用CREATE SERVER访问存储在源服务器上的数据。
创建连接到远程源服务器和所需远程数据库服务器请检查远程数据是否可访问
1.在目标服务器上创建一个每20秒执行一次的事件过程(首先将其禁用)。我建议您在单独的服务数据库中创建它。在此事件过程中执行如下查询

SET @event_start_timestamp = CURRENT_TIMESTAMP;

INSERT localDB.local_table ( {columns} )
SELECT {columns}
FROM serviceDB.federated_table
WHERE must_be_transferred
  AND created_at < @event_start_timestamp;

UPDATE serviceDB.federated_table
SET must_be_transferred = FALSE
WHERE must_be_transferred
  AND created_at < @event_start_timestamp;

目的服务器将相应得SELECT查询发送到远程源服务器.它执行此查询并将输出发送回.插入接收到得行.然后目的服务器发送删除标志得UPDATE.
1.启用事件调度程序。
1.启用事件过程。
确保事件过程执行得足够快。它必须在下一次触发之前完成其工作。即,将代码作为常规存储过程执行,并检查其执行时间。也许您会增加调度规则时间。
您可以使用在您的服务数据库中创建的一些服务表中的静态标志来排除此类并行触发。如果设置了该标志(前一事件尚未完成其工作),则事件过程将退出。我建议您在任何情况下都执行此检查。
您必须处理下一种情况:

  • 目的地接收一行;
  • source更新此行;
  • destination将此行标记为已同步

可能的解决方案。
标志must_be_transferred不应是布尔值,而应是(无符号微小)整数,其值如下:0 -同步时不需要; 1 -需要同步; 2 -选择用于复制,3 -选择用于复制,但在选择后改变。
算法:

  • dest.更新标记为非零值的行,并将其设置为2;
  • dest.使用条件flag OR 2(或flag IN (2,3))复制行;
  • dest.使用表达式flag XOR 2及以上条件清除标志。
  • src.使用表达式flag OR 1根据需要同步标记更改的行。

相关问题