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


11
  • 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
해당 ID를 가진 레코드는 하나만있을 수 있으므로 오류가 발생하지 않습니다. 발행시 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1오류를 발생시키는 쿼리가 최소한으로 변경됩니까? 슬레이브 binlog 위치가 올바르게 설정 되었습니까?
Thinice

카운터를 건너 뛸 때마다 다른 ID로 변경됩니다. 이 --master-data옵션은 이미 이진 로그 좌표를 덤프 파일에 기록합니다. master를 master_host, master_user, master_password로만 변경하면됩니다.
quanta

이것은 일반적으로 mySQL 복제를 설정하는 방법이 아닙니다 (일반적으로 URL 당 복제를 설정합니다 : dev.mysql.com/doc/refman/5.0/en/replication-howto.html ). 그러나 mysqldump 옵션을 읽는 이유는 없습니다. 왜 작동하지 않아야합니까? mysqldump 명령을 전달하는 대신 전체 구성을 설정하면 동일한 문제가 발생하는지 궁금합니다.
Rilindo

--master-data데이터 스냅 샷을 만들 때이 옵션을 사용하지 않아야한다는 의미 입니까? --lock-all-tables옵션 및을 사용할 때 여전히 문제가 발생하면 change master to master_log_file='', master_log_pos='', ...원인은 무엇입니까?
quanta

아뇨, 그건 제가 말하는 것이 아닙니다. 내가 언급했듯이, 당신이 한 일은 의도 한대로 작동해야합니다-내가 알 수있는 한, 그 옵션에 대한 기존 버그는 없습니다. 그러나 격리 단계가 없다는 것을 의미하지는 않습니다. 먼저 해당 URL을 통해 mySQL에서 제공하는 규칙을 따릅니다. 티. 그래도 문제가 해결되지 않으면 최소한 문제 해결을 시작해야합니다. 그렇지 않은 경우 다른 문제가 있습니다. :)
Rilindo December

답변:


7

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

  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가 다릅니다

전체 변경 마스터 문자열 (로그 이름 및 위치 번호 포함)을 발행하면 실제로 수정되지만,이 시점에서 핵심 질문은 Quanta가 로그 이름 및 위치 번호를 이미 입력했을 때 다시 입력 해야하는 이유라고 생각합니다 덤프 파일.
Rilindo

가져 오기 후 'start slave'전에 'show slave statug \ G'만 표시; 우리에게 답변을 제공 할 수 있습니다
드미트로 Leonenko

요청한 정보를 원래 게시물에 추가했습니다.
quanta

"CHANGE MASTER ..."를 발행하지 않고 "Master_Host : xxxx Master_User : xx"로 어떻게 끝났습니까? 아니면 대답에서 언급하지 않았습니까? binlog 형식과 mysqldump의 명령 행은 무엇입니까?
Dmytro Leonenko

내 게시물에서 " 덤프 파일 가져 오기, 실행change master to "을 이미 언급했습니다 . MIXED 기반 로깅을 사용하고 있습니다. MySQL 5.0.77 (상태 기반)로 테스트했는데이 오류도 발생합니다. 전체 mysqldump는이다mysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
양자

2

문제는 덤프를 수행하기 전에 실행중인 프로덕션 서버에서 마스터를 설정하여 발생합니다 (알 수있는 한). 따라서, 슬레이브에 상주하는 데이터에 대해 이미 실행 된 쿼리가 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


FLUSH PRIVILEGES를 포함하도록 편집되었습니다. 사용자가 덤프를 가져와도 권한이 아직 활성화되지 않았다는 또 다른 오류가 발생했습니다.
BroknDodge

RESET MASTER는 마스터가 아닌 슬레이브에서 실행되어야합니다.
Jon

1

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

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

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

참조 : 중복 항목 오류 수정


1

나는 정확한 문제가 있었고 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

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


1
해당 코드의 기능을 설명하고 코드를 더 읽기 쉽도록 형식화하면 훨씬 더 나은 답변입니다.
kasperd

0

제 경우에는 다음 명령으로 문제가 해결됩니다.

다음 단계로

STOP SLAVE;
RESET SLAVE;
START SLAVE;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.