里面会有自动判断的,只要是同步slave传过来的就不会被发送。比如m1,执行了一个delete 语句,传到了m2,m2执行了这条delete语句,但是m2不会把这条delete语句再传给m1了。

解决方案 »

  1.   

    所以才问它是怎么做到这一点的,如果是主主同步,两边都是开了 binlog 的,所以不管在哪边,只要执行了规定的数据库相关的语句,都会被写入 binlog ,这样对方怎样才能不再把这个发回来?
      

  2.   

    slave 端从master端binlog中读取到的日志存放在自己的relay-log文件中,然后转化成可以执行的sql语句进行执行,这样就不存在无限循环的问题。
      

  3.   

    就是说slave从master的binlog中读取到的sql语句不会写入自己的binlog文件中。
      

  4.   

    如果主主的结构,配置成slave将语句再写入到binlog里(就像金字塔拓扑的中间层那样),会不会产生楼主说的死循环问题呢?
      

  5.   

    但是主主同步双方都开了binlog,因此在执行 relay-log文件里的语句时,理应是会把执行的语句自动记录到binlog里的
      

  6.   

    公司同事以前用的是mysql自带的同步,主主同步你搜一下应该有例子的,但是它有一个缺点,网络功能不强。所以公司给我的任务是开发一款同步软件。我现在实现的原理和mysl同步的差不多,只是mysql的原理是slave去提,而我实现的原理是master去送。目前困扰的是主主同步造成binlog循环更新的问题,最难的是无法确定单个循环里,有多少条语句在循环。昨天想了一天,只想到一个临时方案,就是用散列函数,记录最近的N条语句,判断提取出来的语句在固定时间内,提取出来的次数是否超过C,如果超过将不发送这条语句,这样循环将会终止。但是这样有一个隐性的问题,那就是也许这些语句是都需要的,而不是因为循环而记录的,那样就把一个需要的语句给吞了。
      

  7.   

    我查过mysql的文档,就是想知道它是怎么控制这个的。因为mysql 在执行语句时,是会将对规定数据库有效的语句记录到binlog的。如果它可以控制,那么应该有一个控制方法,使得可以控制执行的语句是否写入binlog。
      

  8.   

    同步到slave的更新语句都是先放到本地的relay中继日志中,然后sql线程再从中继日志获取语句信息解析成sql语句。binlog日志想知道是本机执行的语句还是从主机同步过来的语句,弄个标识即可,因为同步过来的语句都是放在中继日志中,然后执行是从中继日志解析出来的,弄个标识表明语句的来源应该不难。