태그 보관물: mysql-replication

mysql-replication

MySQL 오류 1062의 원인-슬레이브를 시작할 때 항목이 중복됩니까? Last_SQL_Error: Error ‘Duplicate entry

  • 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

이 덤프 파일은 --skip-slave-start오류없이 슬레이브에서 가져옵니다 ( 옵션 으로 시작 ).

shell> pv dbname_`date +%F`.sql | mysql -u root -p

그러나 다음을 실행할 때 다음 오류가 발생했습니다 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, ...

마스터에 ID가 115846 인 레코드가 하나만 있습니다.

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

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

다음을 사용하여 일부 쿼리를 건너 뛰십시오.

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;

도와주지 않았다. 다음을 추가하여 해당 오류를 건너 뛰고 싶지 않습니다.

slave-skip-errors = 1062

my.cnf파일이 노예 일관성을 가져올 수 있기 때문이다.

이 오류의 원인은 무엇입니까?


최신 정보

이것은 내가 일반적으로 mySQL 복제를 설정하는 방법이 아닙니다

문서를 따르지 않는다고 생각하는 단계는 무엇입니까?

mysqldump 명령을 전달하는 대신 전체 구성을 설정하면 동일한 문제가 발생하는지 궁금합니다.

아니요, 마스터를 해당 좌표로 변경하면 정상적으로 작동합니다.

슬레이브에 데이터베이스를 삭제하고 binlog가 지워 졌는지 확인한 다음 다시 시작하십시오. 또한 인덱스에 오류가 없는지 마스터에서 해당 테이블을 확인하십시오.

모든 datadir을 삭제 (이동)합니까? 나는 그것을했고 같은 결과를 얻었습니다.


트윗 담아 가기

슬레이브에 ‘show slave status \ G’가 올바르게 구성되어 있는지 확인하십시오. MASTER_LOG_POS는 0입니다.

가져 오기 후 ‘start slave’전에 ‘show slave statug \ G’만 표시; 우리에게 답을 줄 수 있습니다

datadir을 백업하고 모두 삭제하고 실행 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)

Master_Log_Pos가 4 인 이유가 궁금합니다.



답변

문제를 해결하기 위해 시도 할 사항 :

  1. 먼저 슬레이브에서 master.info를 제거하고 mysql을 다시 시작해야합니다
  2. 마스터 변경 MASTER_HOST = ‘XX.XX.XX.XX’, MASTER_USER = ‘repl’, MASTER_PASSWORD = ‘slavepass’;
  3. 마스터에서 ‘–flush-logs’옵션으로 mysqldump를 수행하십시오.
  4. 슬레이브의 ‘mysql -u user -p <dump.sql’
  5. 슬레이브에 ‘show slave status \ G’가 올바르게 구성되어 있는지 확인하십시오. MASTER_LOG_POS는 0입니다.
  6. ‘노예 시작;’ 노예에.

확인 사항 :

  • 바이너리 형식 : MIXED
  • 마스터 및 슬레이브에서 server_ids가 다릅니다

답변

문제는 덤프를 수행하기 전에 실행중인 프로덕션 서버에서 마스터를 설정하여 발생합니다 (알 수있는 한). 따라서, 슬레이브에 상주하는 데이터에 대해 이미 실행 된 쿼리가 master_log에 작성되었습니다. 나는 실제로 mysql 웹 사이트 또는 메일 목록에서 해결책을 보지 못했습니다. 그래서 내 문제를 해결 한 다음 해결책을 생각해 냈습니다.

노예에서 :

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too

마스터에 :

mysql> RESET MASTER;

노예에서 :

mysql> RESET SLAVE;
mysql> START SLAVE;

그건 그렇고, 나는 노예에서 다음과 함께 덤프를 실행했습니다.

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD

나는 이것이 다른 누군가를 돕기를 바랍니다.

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

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


답변

REDO 전체 절차를 원하지 않으면 올바른 수정 방법을 사용하는 것이 좋습니다

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

이러한 오류가 너무 많으면 bash 스크립트를 사용하여 자동화하는 것이 좋습니다.

참조 : 중복 항목 오류 수정


답변

나는 정확한 문제가 있었고 Ut xd의 링크가 도움이되었습니다. 그러나 해당 링크의 명령에 구문 오류가 있으며 여기 나를 위해 일한 버전이 있습니다.


while [ 1 ]; do
if [ `mysql -uroot -ppassword -e"show slave status \G;" | grep "Duplicate entry" | wc -l` -eq 2 ] ; then
mysql -uroot -ppassword -e"stop slave; set global sql_slave_skip_counter=1; start slave;";
fi;
sleep 1;
mysql -uroot -ppassword -e"show slave status\G";
done

기본적으로 중복 항목 오류가 있는지 확인하고 마스터에서이 이벤트를 건너 뜁니다. 루프에서 수행하십시오.