【发布时间】:2011-12-16 11:20:12
【问题描述】:
我有一个标准的单向主从设置。 这些表有 MyIsam 存储引擎。
版本是:
大师 服务器版本:5.1.41-3ubuntu12.10-log 协议版本:10
第一个奴隶: 服务器版本:5.1.41-3ubuntu12.10 协议版本:10
第二个奴隶: 服务器版本:5.1.49-1ubuntu8.1 协议版本:10
我已将除专用复制用户之外的所有用户设置为在从属设备上只读。
在主服务器上执行的以下语句未正确复制:
$insert = "INSERT INTO search_affiliate_product
(film_id, ext_id, affiliate_id, `status`, url, created_at)
SELECT film_id, LPAD(imdb, 7, '0'), $affiliate_id, 5, CONCAT('http://www.imdb.com/title/tt', LPAD(imdb, 7, '0'),'/'), NOW() FROM search_film_entity
WHERE film_id NOT IN (SELECT film_id FROM search_affiliate_product WHERE affiliate_id = $affiliate_id)
AND status IN (5, 9)
AND release_year BETWEEN 0 AND $year
AND imdb > 0";
从机收到此错误:
Error 'Duplicate entry '271769' for key 'PRIMARY'' on query. Default database: 'flimmit_search_14'. Query: 'INSERT INTO `search_affiliate_product` (`affiliate_id`, `ext_id`, `url`, `status`, `film_id`, `created_at`, `updated_at`) VALUES ('16', '1991/JohnnyStecchino', 'http://www.cineman.ch/movie/1991/JohnnyStecchino/review.html', '5', '102164', '2011-10-26 02:30:05', '2011-10-26 02:30:05')'
我还做了一些其他的观察:
语句通过 bin 日志(中继日志和主日志)“按原样”传输,因此不包含插入的显式数据,但带有 select 和 subselect 的整个语句在slave,依赖本地数据。
如果我查看主表和从表并按主键排序,我会看到上述语句在两台服务器上生成的一系列插入。之前和之后的行是同步的。该语句生成的该范围内的许多行也是相等的。但也有分歧。
我认为问题可能是由于并发sql事务。这样插入过程会干扰其他插入,因此值会混淆,而在从属设备上不会发生这种情况,因为日志是按程序处理的。
我还注意到,在语句的插入过程中,似乎插入了一些未在另一台服务器上插入的 ID,并且插入了一些重复项(字段 ext_id 上的重复项,该字段由另一台服务器的 imdb 字段填充表,这是独一无二的......
我真的被困在这里了。
有什么建议吗?我真的很想知道为什么会这样。
我考虑过选择所有 id 并在应用程序中创建单个插入语句或在执行表之前锁定表。我认为这可以解决它,但我真的很想了解这个错误。
下一个奇怪的事情是第二个奴隶似乎运行良好!只有第一个奴隶有问题。我只是不明白。
【问题讨论】:
标签: mysql database replication myisam