MySQL 复制错误

Abd*_*naf 8 mysql replication

我在 Slave 上收到错误消息:

无法在表 mydatabasename.atable 上执行 Write_rows 事件;密钥“PRIMARY”的重复条目“174465”,错误代码:1062;处理程序错误 HA_ERR_FOUND_DUPP_KEY; 事件的主日志 mysql-bin.000004, end_log_pos 60121977

由于我直接从 master 获取更新,所以为什么会发生这种情况。

我们如何以有效的方式处理这个问题,以便从站上没有数据丢失。我不想再次设置整个复制以保持数据完整性。

谢谢..!

Rol*_*DBA 14

每当出现 1062 错误时,出现问题的常见表是查询中正在更新的实际表。查询应该出现在输出中SHOW SLAVE STATUS\G

例如,在您的错误中,它说Duplicate entry '174465' for key 'PRIMARY'. 这表明您应该174465在执行 INSERT 或 UPDATE 的表中查找值。如果该行确实存在,您是否必须决定暂停执行的查询是否会更改该行的内容。如果查询将简单地重现完全相同的内容,并且您认为会是这种情况,则可以执行以下两个选项之一:

选项1

跳过错误,等待5秒,查看Slave Status。这里是跳过错误的 5 个步骤

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
Run Code Online (Sandbox Code Playgroud)

当您查看 Slave Status 时,您会看到以下内容

  • 如果 Seconds_Behind_Master 为 NULL

    • 复制被破坏:寻找告密标志
    • 如果错误编号再次为 1062,请重复跳过错误的 5 个步骤
  • 如果 Seconds_Behind_Master 是一个数字

    • 复制正在运行
    • 当 Seconds_Behind_Master > 0 时,复制正在赶上。
    • 当 Seconds_Behind_Master = 0 时,复制完全赶上。

选项 2

删除该行以允许复制继续

从 Slave 上的表中删除该行并执行以下 4 步跳过错误:

STOP SLAVE;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
Run Code Online (Sandbox Code Playgroud)

冒着听起来多余的风险......

当您查看 Slave Status 时,您会看到以下内容

  • 如果 Seconds_Behind_Master 为 NULL

    • 复制被破坏:寻找告密标志
    • 如果错误编号再次为 1062,则删除该行重复跳过错误的 4 个步骤
  • 如果 Seconds_Behind_Master 是一个数字

    • 复制正在运行
    • 当 Seconds_Behind_Master > 0 时,复制正在赶上。
    • 当 Seconds_Behind_Master = 0 时,复制完全赶上。

如果重复的关键问题太多怎么办?以下是我之前关于如何使用 MAATKIT 的mk-table-checksummk-table-syncpt-table-checksumpt-table-sync 的一些帖子:


小智 5

我编写了如下脚本来解决这个问题:

创建一个 SQL 脚本,该脚本将停止从属服务器并设置SQL_SLAVE_SKIP_COUNTER为然后启动从属服务器。

>>cat mysql_skip.sql
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
SELECT SLEEP(1);
Run Code Online (Sandbox Code Playgroud)

然后 :

>>cat mysql_skip.sh

dup_status=`mysql -uroot -p************** --execute="show slave status"|grep HA_ERR_FOUND_DUPP_KEY|wc -l`
while [ $dup_status -ne 0 ]
do
        mysql -uroot -p************** < mysql_skip.sql
        dup_status=`mysql -uroot -p************** --execute="show slave status"|grep HA_ERR_FOUND_DUPP_KEY|wc -l`
        mysql -uroot -p************** --execute="show slave status"|grep HA_ERR_FOUND_DUPP_KEY
        echo $dup_status
done
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我解决了从属复制冲突。这可能对所有人都有帮助。