【发布时间】:2014-03-26 23:33:07
【问题描述】:
我需要保持两个不同的数据库同步。触发器似乎是最好的办法,但两个数据库位于不同的主机上。我见过的大多数触发器教程似乎都假设触发器更新同一个数据库上的不同表,或者至少在同一个主机上。
有什么方法可以配置一个数据库以使用触发器在完全不同的服务器上更新另一个数据库?
【问题讨论】:
标签: mysql triggers synchronization
我需要保持两个不同的数据库同步。触发器似乎是最好的办法,但两个数据库位于不同的主机上。我见过的大多数触发器教程似乎都假设触发器更新同一个数据库上的不同表,或者至少在同一个主机上。
有什么方法可以配置一个数据库以使用触发器在完全不同的服务器上更新另一个数据库?
【问题讨论】:
标签: mysql triggers synchronization
不。常规触发器无法做到这一点。
MySQL 确实允许用其他语言编写用户定义函数;这提供了访问 MySQL 中不可用的资源的优势。用户定义函数可以从触发器中调用,但这种方法有一些明显的缺点;我不认为你(或其他任何人)真的想走那条路。我只是提到它,因为它是可用的。
作为替代方案,您可以有一个单独的进程,在 MySQL 外部运行以进行同步。
通过触发器,您可以将行插入“事务”表。外部进程可以轮询“事务”表中的新行,并连接到其他数据库(甚至是非 MySQL 数据库)并发出 DML,或者做任何事情,并将“事务”表中的行标记为已完成、失败或任何。但这将是一种异步方法,而不是同步方法,并且触发器无法“知道”事务是否在远程系统上成功完成。
作为另一种选择,MySQL 提供了复制功能,可以将二进制日志传送到远程数据库,以保持从“主”数据库复制“从”数据库。
但是,如果您问是否可以使用 DML 触发器中可用的本机语法来实现这一点,答案是否定的,这不会发生。
还有其他数据库(例如 Oracle 和 SQL Server)支持从数据库内部连接到远程数据库(Oracle“数据库链接”和 SQL Server“链接服务器”。它们也支持两阶段提交,所以你可以进行真正的“多数据库”事务。
【讨论】: