【问题标题】:MariaDB 10.2.10 Slave stops on duplicate key errorMariaDB 10.2.10 从站因重复键错误而停止
【发布时间】:2018-05-13 07:39:22
【问题描述】:

我一直在 Master-Master-Replication 中设置两个基于 Debian Stretch 的 MariaDB-Server。

Slave 的复制配置部分是:

server-id       = 2226
auto_increment_increment = 1
auto_increment_offset   = 1
log_bin         = /var/tmp/mysql_binlog/mysql-bin.log
log_bin_index       = /var/tmp/mysql_binlog/mysql-bin.log.index
expire_logs_days    = 3
max_binlog_size         = 100M
relay_log       = /var/tmp/mysql_binlog/slave-relay.log
relay_log_index     = /var/tmp/mysql_binlog/slave-relay.log.index
log_slave_updates   = 1
replicate_annotate_row_events = 0
log_bin_trust_function_creators = 1

我遇到以下错误:

show slave status\G;

          Relay_Log_File: slave-relay.032025
            Relay_Log_Pos: 14887746
    Relay_Master_Log_File: mysql-bin.001119
         Slave_IO_Running: Yes
               Last_Errno: 1062
               Last_Error: Error 'Duplicate entry '71899-single' for key 'PRIMARY'' on query. Default database: 'mydb'. Query: 'INSERT INTO document_reference
                        (document_reference_document_id, document_reference_type, document_reference_value)
                    VALUES (71899, "single", 0)'

但是:

MariaDB [(none)]> select * from mydb.document_reference WHERE document_reference_document_id=71899;
Empty set (0.00 sec)

我查看了中继日志文件 - 只有一个插入语句。

有人知道是什么导致从属设备出现重复输入错误吗?

补充资料:

主设置:

auto_increment_increment     | 1     
auto_increment_offset        | 1     
binlog_format                | MIXED

表定义:

CREATE TABLE "document_reference" (
"document_reference_document_id" int(10) unsigned NOT NULL,
"document_reference_type" enum('single,'multi') COLLATE utf8_unicode_ci     
NOT NULL DEFAULT 'single',
"document_reference_value" int(11) NOT NULL,
PRIMARY KEY ("document_reference_document_id","document_reference_type"))

【问题讨论】:

  • 从站上是否有已经一行,PK 为 71899,'single'? Mastersauto_increment_increment 的值是多少?是RBR还是SBR?告诉我们SHOW CREATE TABLE document_reference
  • 嗨@RickJames!我刚刚添加了信息。

标签: mariadb mysql-error-1062


【解决方案1】:

当有“双主”时,设置

auto_increment_increment = 2  -- on both
auto_increment_offset = 1 on one Master, = 2 on the other

另外,server_id 必须在两个 Master(和任何 Slave)上是不同的。如果它们没有不同,复制会在 Master 之间循环进行。

否则,在单独的 Master 上插入可能会生成相同的 AUTO_INCREMENT 值。

但是,这并不能解决问题。 (不涉及 auto_inc。)唯一可能的答案(我认为)是其中两行:(71899, "single", ...) 被插入。 SELECT 中缺乏此类证据可能与DELETEs、死锁等有关(所以,我没有明确的答案。)

【讨论】:

  • 嗨。我在主服务器上运行了一个通用日志,并通过它进行了 grep-ed。没有其他关于同一主键的 INSERT、UPDATE 或 DELETE 语句。因此,如果有人知道出了什么问题...
  • Slave 上的 binlog 呢?也许有人直接写信给奴隶?
  • 在两台服务器上执行SHOW CREATE TABLE -- 完全比较它们。
  • 两台服务器完全相同。
  • 我进一步查看了 mysqlbinlog。我必须解码 base64,并且在基于行和基于语句的格式中有相同的插入语句。我提出了一个新问题:stackoverflow.com/questions/47650166/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2018-12-01
  • 2019-07-09
相关资源
最近更新 更多