Chinaunix

标题: 有关mysql master 和slave同步数据库的问题 [打印本页]

作者: 冷风    时间: 2010-05-11 09:21
标题: 有关mysql master 和slave同步数据库的问题
本帖最后由 冷风 于 2010-05-11 09:33 编辑

环境 RHEL54 x64
自带的mysql
配置了主从
我发现如果从服务器不当机,数据都没有问题
如果从服务器关机,然后主服务器上插入多条记录,启动从服务器的时候就会报Duplicate entry错误,必须重新Change MASTER,slave的状态才能恢复正常,而且即使状态对了,数据库里还是少了主的几条记录,这是什么原因造成的
master状态
mysql> show master status\G
*************************** 1. row ***************************
            File: master-bin.000006
        Position: 54138
    Binlog_Do_DB:
Binlog_Ignore_DB: mysql
1 row in set (0.01 sec)

slave:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER to MASTER_LOG_FILE='master-bin.000006',MASTER_LOG_POS=54138;
Query OK, 0 rows affected (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.147.128
                Master_User: rep
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: master-bin.000006
        Read_Master_Log_Pos: 54138
             Relay_Log_File: slave-relay-bin.000002
              Relay_Log_Pos: 236
      Relay_Master_Log_File: master-bin.000006
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: redcap
        Replicate_Ignore_DB: mysql
         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: 54138
            Relay_Log_Space: 236
            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)

看状态都对,但是就是数据库里数据少了好几条。顺便说一下,我的数据库是phpwind(一个论坛)的数据库,在关闭了从服务器以后我在一个版块发了六个帖子,但是从服务器启动起来强制同步数据后我只看见2个帖子
作者: 冷风    时间: 2010-05-11 09:30
master的my.cnf配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
set-variable=binlog-ignore-db=mysql

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

slave的my.cnf设置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
server-id=2
master-host=192.168.147.128
master-user=rep
master-password=rep
master-port=3306
set-variable=replicate-ignore-db=mysql
set-variable=replicate-do-db=redcap
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
作者: jerrywjl    时间: 2010-05-11 10:44
帮顶,我也想知道。
作者: xiao7ng    时间: 2010-05-11 10:57
应该从服务器的数据有问题,如果可能重新搞个数据集吧
作者: 冷风    时间: 2010-05-11 11:19
数据库都是新的
作者: 冷风    时间: 2010-05-11 11:27
我发现问题多发生在论坛有回帖的时候,某些回帖会出现重复键值而导致同步失败,如果是我简单设置的表,slave重启之后会自动同步所有的数据,难道是phpwind某些数据库不支持同步?
作者: vermouth    时间: 2010-05-11 11:39
看看 processlist 是不是哪卡住了。
作者: yueliangdao0608    时间: 2010-05-11 11:40
1. 检查你的表结构。

2.看看你的文件系统是不是存在某些方面的问题

3. 看看现在的MYSQL是不是存在复制方面的BUG.
作者: 冷风    时间: 2010-05-11 14:28
1 表不会有问题
2 文件系统没问题
3 不清楚,我现在打算下个源码编译看看
作者: jerrywjl    时间: 2010-05-11 16:05
继续帮顶。
作者: coco520    时间: 2010-05-11 16:14
查查是否有程序直接在slave上插入数据了.
作者: 冷风    时间: 2010-05-11 16:17
我在从服务器上编译了5.1.46
测试了好几遍,关闭从服务器的mysql,在主服务器的web上发表过个帖子再回复,然后启动slave mysql,从服务器同步一切正常,没有再出现类似的错误
看来是rhel5自带的mysql 5.0.77有问题了。
我只是简单定位,希望有经验的人能从代码上解释清楚
或者明确mysql 5.0.77是否存在复制的bug
作者: 冷风    时间: 2010-05-11 16:54
多谢大家,原因找到了,不是上面的原因,而是从服务器上我也配置了web程序,虽然我没有写操作,但是访问web也会更新数据库记录访问ip时间帖子点击率等等,所以从的服务器被更新了,因此导致同步失败,看来配置组从还是把从服务器的格式设置成read-only=1比较稳妥
作者: mengbi    时间: 2010-05-12 09:28
有没有添加主从互相的ip和服务器名的互相解析?
作者: vermouth    时间: 2010-05-12 12:03
可以互为主从么?
作者: dotone    时间: 2010-05-12 17:36
试试用mysqlbinlog查看主服务器上的mysql binlog 文件(master-bin.000006),看看master上所有的操作是不是都记录了。
作者: witer666    时间: 2010-05-12 22:14
主键同步时有问题吧
作者: tianxin1017    时间: 2010-05-13 09:03
本帖最后由 tianxin1017 于 2010-05-13 09:06 编辑

没想到在这里还能看到冷风兄 ,2004年,我就混你的技术中坚站,激动万分……
作者: linjingmin2002    时间: 2010-05-15 14:24
本帖最后由 linjingmin2002 于 2010-05-15 14:29 编辑

master的my.cnf上加入参数
auto_increment_offset = 1
auto_increment_increment = 2

slave的my.cnf上加入参数
auto_increment_offset = 2
auto_increment_increment = 2

详细参考:http://blog.yahunet.com/post-34.html
作者: pureqi    时间: 2010-09-15 11:52
这确实是个问题。
经常主机或者从机,网络断线再重新连上之后,就会duplicate entry 1062错误,非常容易出现。

查了原因是从机是先执行sql再更新binlog状态值,所以断线时如果只执行了sql但没更新进binlog,再重启时会再执行一次binlog,就会duplicate了。

所以我现在从库只是用来给运营作一些查询,根本不敢用作业务系统,感觉mysql的replication机制不太稳定。实在做不到一duplicate就要手工处理,累死了。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2