是什么导致 MySQL 错误 1062 - 启动从站时出现重复条目​​?

qua*_*nta 14 mysql mysql-replication

  • MySQL 主版本:5.5.16-1
  • MySQL 从站版本:5.5.18-1

主节点的快照是通过以下方式创建的:

mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql
Run Code Online (Sandbox Code Playgroud)

这个转储文件被导入到从站(用--skip-slave-start选项启动)没有错误:

shell> pv dbname_`date +%F`.sql | mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

但是在执行时出现以下错误mysql> start slave;

    Last_SQL_Errno: 1062
    Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...
Run Code Online (Sandbox Code Playgroud)

master上只有一条ID为115846的记录:

mysql> select count(*) from request_posted where id=115846;
Current database: db

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

尝试跳过一些查询:

mysql> STOP SLAVE; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;
Run Code Online (Sandbox Code Playgroud)

没有帮助。我不想通过添加以下内容来跳过这些错误:

slave-skip-errors = 1062
Run Code Online (Sandbox Code Playgroud)

my.cnf归档,因为它可能会导致从站不一致。

此错误的原因可能是什么?


更新

这不是我通常设置 mySQL 复制的方式

您认为我没有遵循文档的哪些步骤?

我想知道如果您要设置整个配置而不是传递 mysqldump 命令,您是否会遇到同样的问题。

不,如果我也将主更改为相应的坐标,它会正常工作。

我会尝试在从属设备上删除数据库,确保二进制日志清晰,然后重新开始。还要检查 master 上有问题的表,以确保索引没有错误。

删除(移动)所有数据目录就足够了吗?我这样做并得到了相同的结果。


回复@Dmytro Leonenko

'show slave status\G' on slave 确保配置正确,MASTER_LOG_POS 为 0

仅在导入之后但在 'start slave;' 之前显示 'show slave statug\G' 可以给我们答案

我备份了数据目录,全部删除并运行mysql_install_db,导入转储文件,执行change master to,结果如下:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: x.x.x.x
                  Master_User: xx
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么 Master_Log_Pos 是 4?

Dmy*_*nko 8

如何尝试解决您的问题:

  1. 您应该先删除从站上的 master.info 并重新启动 mysql
  2. 发出 CHANGE MASTER TO MASTER_HOST='XX.XX.XX.XX', MASTER_USER='repl', MASTER_PASSWORD='slavepass';
  3. 在 master 上使用“--flush-logs”选项执行 mysqldump
  4. 'mysql -u user -p < dump.sql' 在从属设备上
  5. 'show slave status\G' on slave 确保配置正确,MASTER_LOG_POS 为 0
  6. '启动奴隶;' 在奴隶上。

还要检查什么:

  • 二进制日志格式:MIXED
  • server_ids 在 master 和 slave 上是不同的


Bro*_*dge 5

该问题是由于在进行转储之前在正在运行的生产服务器上设置主服务器造成的(据我所知)。因此,master_log 中写入的查询已经对驻留在从站上的数据执行。我从未在 mysql 网站或邮件列表上真正看到过解决方案。所以,我想出了以下解决方案来解决我的问题。

在奴隶上:

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too
Run Code Online (Sandbox Code Playgroud)

在主人身上:

mysql> RESET MASTER;
Run Code Online (Sandbox Code Playgroud)

在奴隶上:

mysql> RESET SLAVE;
mysql> START SLAVE;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在从属设备上运行了以下转储:

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD
Run Code Online (Sandbox Code Playgroud)

我希望这对其他人有帮助。

http://dev.mysql.com/doc/refman/5.0/en/reset-master.html

http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html