一次mysql同步错误一解

今天又做了一次mysql同步。而且是跨机房的。
做完之后自然使用以下命令看看同步效果如何。

 mysql> show slave statusG; 

但是奇怪的事情发生了。得到的结果居然是这样的

*************************** 1. row ***************************
             Slave_IO_State:   Checking master version
                Master_Host: 1.1.1.1
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000035
        Read_Master_Log_Pos: 415080471
             Relay_Log_File: foreign-1-relay-bin.000378
              Relay_Log_Pos: 175787666
      Relay_Master_Log_File: mysql-bin.000035
           Slave_IO_Running: No
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 415080471
            Relay_Log_Space: 175787666
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

ERROR:
No query specified

这就奇怪了阿,而且多次show slave statusG;后得到的 Slave_IO_State: 结果却一直都在改变,具体状态可以参考http://dev.mysql.com/doc/refman/5.1/zh/replication.html#slave-io-thread-states

而Slave_IO_Running:的状态也一直在Yes和No之间转换。
而一个正常的slave状态是Slave_IO_State: Waiting for master to send event, 而Slave_IO_Running:状态应该一直都是Yes才对。

看mysql的err日志里也没有对应的信息出现。所以一开始以为是自己2个机房之间的连接链路有啥问题,于是特地测试了一下,但是发现一切都很正常。

这时候突然想到这个slave数据库一开始是作为另外一个数据库的slave数据库,于是查看了一下my.cnf中server-id,发现这个slave数据库的server-id = 2, 这就对了。很明显是跟其它slave数据库的server-id重复了,导致2个不同的slave数据库都去抢同样的server-id,这样就好比2个短跑选手非要去跑到一个跑道上,互相干扰到了对方。于是前面的Slave_IO_State状态的变化也可以很好的解释了。