AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 10184
Accepted
Abdul Manaf
Abdul Manaf
Asked: 2012-01-05 21:34:23 +0800 CST2012-01-05 21:34:23 +0800 CST 2012-01-05 21:34:23 +0800 CST

MySQL 复制错误

  • 772

我在 Slave 上收到错误消息:

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

因为我直接从主人那里获得更新,所以为什么会发生这种情况。

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

谢谢..!

mysql replication
  • 4 4 个回答
  • 45523 Views

4 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-01-06T08:24:20+08:002012-01-06T08:24:20+08:00

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

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

    选项1

    跳过错误,等待 5 秒,然后查看从站状态。这里是跳过错误的 5 个步骤

    STOP SLAVE;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;
    SELECT SLEEP(5);
    SHOW SLAVE STATUS\G
    

    当您查看从属状态时,会出现以下情况

    • 如果 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
    

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

    当您查看从属状态时,会出现以下情况

    • 如果 Seconds_Behind_Master 为 NULL

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

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

    如果重复的关键问题太多怎么办?这是我之前的一些关于如何使用 MAATKIT 的mk-table-checksum、mk-table-sync、pt-table-checksum、pt-table-sync的帖子:

    • 在 MySQL Master/Slave 复制中,如果我写入 Slave 会发生什么?
    • 修复 pt-table-checksum 报告的表不同步,pt-table-sync 不起作用
    • MySQL 复制问题:slave 变得不同步
    • 15
  2. ragesh K
    2020-04-06T04:10:28+08:002020-04-06T04:10:28+08:00

    我制作了如下脚本来解决此问题:

    创建一个 SQL 脚本,它将停止从站并设置SQL_SLAVE_SKIP_COUNTER为然后启动从站。

    >>cat mysql_skip.sql
    stop slave;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    start slave;
    SELECT SLEEP(1);
    

    然后 :

    >>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
    

    这样我解决了从属复制冲突。这可能对所有人都有帮助。

    • 3
  3. sepideh nejat
    2019-10-22T02:24:53+08:002019-10-22T02:24:53+08:00

    在我的情况下,从属复制坐标被破坏,我通过重置我的从属并通过新坐标将我的从属连接到主控来解决此问题,而不会丢失任何数据。首先,检查您的从属 gtid_slave_pos 是否与其他从属或主 gtid_current_pos 不同:

        # on master
        SELECT @@GLOBAL.gtid_current_pos;
    
        +---------------------------+ 
        | @@GLOBAL.gtid_current_pos |
        +---------------------------+
        | 0-1-2                     |
        +---------------------------+
    
        # on slave
        SELECT @@GLOBAL.gtid_slave_pos;
    
        +-------------------------+
        | @@GLOBAL.gtid_slave_pos |
        +-------------------------+
        | 0-1-4                   |
        +-------------------------+
    

    然后:

        RESET SLAVE;
        SET GLOBAL gtid_slave_pos = "0-1-2";
        CHANGE MASTER TO 
            MASTER_HOST="c1dbserver1", 
            MASTER_PORT=3310, 
            MASTER_USER="repl",  
            MASTER_PASSWORD="password", 
            MASTER_USE_GTID=slave_pos;
        START SLAVE;
    

    您可以在此处找到更多详细信息https://mariadb.com/kb/en/library/using-mariadb-replication-with-mariadb-galera-cluster-configuring-mariadb-r/#start-replication-on-the-new -奴隶

    • 1
  4. dragosrsupercool
    2016-11-17T05:54:50+08:002016-11-17T05:54:50+08:00

    以下脚本将继续跳过全局计数器,直到复制错误得到修复。复制错误通常发生在从 master 转储的时间与 master 的位置不同时。

    试试这个脚本:

    #!/bin/bash
    logfile=~/slave-watcher.log
    while true; do
        status=$(mysql --execute="show slave status\G"|grep "Seconds_Behind_Master:"|awk '{print $2}')
        if [ $status == "NULL" ]; then
            mysql --execute="show slave status\G" | grep "Last_SQL_Error:" | tee -a $logfile
            mysql --execute="set global sql_slave_skip_counter=1; start slave;"
        fi
        sleep 1
    done
    

    注意:要添加密码,修改脚本如下:

    mysql -p your_password --执行

    • -2

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve