我最近接受了管理一组20个(左右)服务器的系统管理员职位.我之前没有处理过的一件事(除了在测试情况下),正在向MySQL复制场引入一个新的从属设备.
基本上复制设置如下:
MS -> SL1 -> SL2 (backup)
| SL3 (reporting)
SB2 SL4 (loadbalanced web slave)
SL5 (loadbalanced web slave)
SL6 (loadbalanced web slave)
SL7 (loadbalanced web slave)
但基本上它是一个有两个读取从属的Master(一个纯粹用于备份),一个用于主要读取从属(主要在等待,如果你愿意),后面有6个从属,用于额外备份,4个负载平衡web读取奴隶和用于报告的服务器.
我已经做了很多在线阅读,并假设在环境中添加一个新的奴隶(来自SL1),将是:
>登录SL2:
>停止奴役;
>带读锁的冲洗表;
>(将mysql目录复制到新服务器)
>完成后,解锁表格,然后开始SLAVE; (直到这一点,SL2重新上线并赶上)
>确保新服务器上的数据库结构正确,并且正确位置的master.info指向(正确指向SL1)
>在新服务器上启动MySQL,检查Slave SQL和I / O是否正在运行(是的,这很好)
但是,经过一段时间后,我从二进制日志中得到重复的键插入错误:
110122 17:01:25 [ERROR] Slave SQL: Error 'Duplicate entry '2011-01-22 17:00:01' for key 'PRIMARY'' on query. Default database: 'thelm_soft'. Query: 'INSERT INTO thm_member_views ( member_view_ts, logged_in_members, non_members ) VALUES ( now(), '27037', '132834' )', Error_code: 1062
110122 17:01:25 [Warning] Slave: Duplicate entry '2011-01-22 17:00:01' for key 'PRIMARY' Error_code: 1062
这是一个问题,因为now()正处于一个查询中,如果该表上的插入频繁,那么常识告诉我会引起问题??!?!或者我的复制过程是否错误,即从错误的日志位置开始?
解决方法:
Is this an issue with the fact now()
is being in a query, which common
sense tells me would cause issues if
the inserts on that table were
frequent enough??!?!
是的,我相信这是你错误的原因.您引入新奴隶的方法似乎是正确的.在我看来,定义一个以DATETIME字段作为主键的表是很奇怪的.正如您已正确指出的那样,slave从主服务器获取复制的查询,他们将在查询中使用now()关键字,这将从本地服务器获取时间戳.
实际上,应该使用PK的某些其他数据类型(例如INT或BIGINT)来定义表,这可以保证是唯一的,与使用now()插入的时间戳不同.