web-dev-qa-db-ja.com

MySQLエラー1062-スレーブ起動時の重複エントリの原因は何ですか?

  • 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のレコードが1つだけあります。

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を削除(移動)するだけで十分ですか?私はそれをして、同じ結果を得ました。


@ Dmytro Leonenkoに返信

スレーブ上に「スレーブステータス\ G」を表示して、正しく構成されていることを確認します。MASTER_LOG_POSは0です。

インポート後、「スレーブ開始」の前に「スレーブ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なのはなぜですか。

11
quanta

あなたの問題を修正するために何をしようとするか:

  1. 最初にスレーブのmaster.infoを削除し、mysqlを再起動する必要があります
  2. cHANGE MASTER TO MASTER_Host = 'XX.XX.XX.XX'、MASTER_USER = 'repl'、MASTER_PASSWORD = 'slavepass';を発行します。
  3. マスターで '--flush-logs'オプションを使用してmysqldumpを実行する
  4. スレーブで「mysql -u user -p <dump.sql」
  5. スレーブ上に「スレーブステータス\ G」を表示して、正しく構成されていることを確認します。MASTER_LOG_POSは0です。
  6. 「スレーブ開始」奴隷に。

チェックするもの:

  • Binlog形式:混合
  • server_idsはマスターとスレーブで異なります
7
Dmytro Leonenko

この問題は、(私が知る限り)ダンプを実行する前に、稼働中の本番サーバーにマスターを設定することで発生します。そのため、master_logに書き込まれたクエリは、スレーブにあるデータに対してすでに実行されています。 mysqlのWebサイトやメーリングリストで実際に解決策を見たことがありません。それで、私は私の問題を解決する次の解決策を思いつきました。

スレーブ上:

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

3
BroknDodge

私には正確な問題があり、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
perlwle

完全な手順をやり直したくない場合は、使用することをお勧めします。

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

このようなエラーが多すぎる場合は、bashスクリプトを使用して自動化することをお勧めします。

参照:重複エントリエラーの修正

1
Ut xD

ペルコナからこれは通常私を助けます。

pt-slave restart -p MyPassword
0
DimiDak

私の場合、問題は次のコマンドで解決されます

次の手順で

STOP SLAVE;
RESET SLAVE;
START SLAVE;
0
Karthik