现有个变态的需求,将多台主机数据库中的一个表同步到另外一台从机数据库的数据表下,并且,各主机的数据在同步到从机时,需要动态改变某个字段的值,例如,主机字段name=A,同步到从机时转换为name=A1。
根据需要,我想到了通过在主机触发器来将数据插入到从机,但没发现Mysql有跨机器操作的触发器(不知是否真的没有,如果有的话就好办多了),所以我又想到,在各个主机上新建一个临时表,然后通过触发器向临时表中插入数据,再由临时表同步到从机,问题是,怎么才能实现多个主机数据同步到一台从机?多谢。

解决方案 »

  1.   

    你看这样怎么样: 你把你主数据库中的表COPY多个副本,然后再同步到从服务器上,这样从服务器上就不用ALTER TABLE了。但是你的从服务器一定得非常强大才行。
      

  2.   

    在两边的库内各自设置2个表,
    一个是用来发送到远端的本地更新数据包,叫send表。
    一个是用来接收远端发送过来的更新数据包的表,叫receive表。
    通过触发器TR来获取对各表的 upd , insert , delete 操作。
    把更新的数据包放到send表中。当然,会过滤掉从receive表中的数据。
    然后在各个端安装2个webservice 。
    一个用于把打包的更新数据包发送到远端。
    另一个用于解析数据包,并插入到本地库内。
    缺点就是:
    1. mysql 对触发器的管理不便,库比较大,有百来张表,写触发器很麻烦。
    2. 如在批量更新的操作中,upd的触发器使用频繁。影响效率。
    所以没法子,只能摒弃或改进触发器的方法。不过webservice的设计还是不错的。用mysqlproxy去获得本地的更新语句。在每台机器上都安装一个webservice 里面就两个方法。
    一个是getDate方法。getDate得到本地的更新数据包,
    一个是setDate方法。setDate方法把数据写入到自己本地的库中。比如两台机器A,B;对于A:将本地数据跟新到远程B库中:date=A.getDate();   B.setDate(date);将远程B数据跟新到本地A库中:date=B.getDate();   A.setDate(date);对于B 来说同理。 
      

  3.   

    看来是没办法了,我最后用程序解决了。但现在做双主机同步的时候有些问题:
    两个主机可以正常的同步数据,但是在一台主机关闭后,无法正常的切换到另一台主机,
    例如,一个应用程序(位于C机)向主机A插入数据,插入的数据同时同步到主机B,当A机关闭后,位于C机的应用程序就无法正常插入数据了,在My.ini中加入log-slave-updates也不行,log-slave-updates是不是起这个作用的,如何才能实现切换?
      

  4.   

    1 手工输入命令:load data from master ; 看看是否可以更新到数据
    2 同时楼主注意下,下面的内容:
    A -> B -> C
    也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B。