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のレコードが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がクリアされていることを確認してから、もう一度開始してみます。また、マスターで問題のテーブルをチェックして、インデックスにエラーがないことを確認します。

すべてのデータディレクトリの削除(移動)で十分ですか?私はそれをして、同じ結果を得ました。


@Dmytro Leonenkoへの返信

スレーブで「show slave status \ 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なのだろうか?


1
そのIDを持つレコードは1つしか存在できないため、エラーが発生し、書き込まれることはありません。あなたが発行するときSET GLOBAL SQL_SLAVE_SKIP_COUNTER=1、エラーを引き起こすクエリは少なくとも変化しませんか?スレーブbinlogの位置は正しく設定されていますか?
thinice

カウンターをスキップするたびに、別のIDに変わります。この--master-dataオプションはすでにバイナリログ座標をダンプファイルに書き込みます。masterをmaster_host、master_user、master_passwordに変更するだけです。
量子

これは通常mySQLレプリケーションをセットアップする方法ではありません(通常、URLごとにレプリケーションをセットアップします:dev.mysql.com/doc/refman/5.0/en/replication-howto.html)ただし、mysqldumpオプションを読んで、理由はありませんなぜ機能しないのか。mysqldumpコマンドを渡すのではなく、設定全体をセットアップする場合、同じ問題が発生するのでしょうか。
リリンド

--master-dataデータスナップショットを作成するときにこのオプションを使用するべきではないということですか?--lock-all-tablesオプションとを使用しても問題が解決しない場合change master to master_log_file='', master_log_pos='', ...、原因は何ですか?
量子

いいえ、それは私が言っていることではありません。私がほのめかしたように、あなたがしたことは意図したとおりに動作するはずです-私が見る限り、そのオプションには既存のバグはありません。ただし、存在しないことを意味するものではないため、分離ステップとして、最初にそのURLを介してmySQLが提供する規則に従います。t。それが機能する場合、少なくともトラブルシューティングを開始する方向があります。そうでない場合は、別の問題があります。:)
リリンド

回答:


7

問題を解決しようとするもの:

  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. スレーブ上の 'my​​sql -u user -p <dump.sql'
  5. スレーブで「show slave status \ G」を表示して、適切に設定されていることを確認します。MASTER_LOG_POSは0です。
  6. 「スレーブを開始します。」スレーブ上。

また、チェックするもの:

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

変更マスター文字列全体(ログ名と位置番号を含む)を発行すると実際に修正されますが、この時点で、クアンタが既にログ名と位置番号を再入力しなければならないのはなぜですか?ダンプファイル。
リリンド

インポート後、「スレーブ開始」の前にのみ「スレーブstatug \ Gを表示」私たちに答えを与えることができます
ドミトロLeonenko

要求された情報を元の投稿に追加しました。
クォンタ

「CHANGE MASTER ...」を発行せずに、「Master_Host:xxxx Master_User:xx」になりました。または、あなたは答えでそれを言及しなかっただけですか?binlog形式とmysqldumpのコマンドラインを確認しましたか?
ドミトロレオネンコ

私はすでに「ダンプファイルをインポートして実行change master toという投稿で言及しました。MIXEDベースのログを使用しています。MySQL 5.0.77(ステートメントベース)でテストしましたが、このエラーも発生します。完全なmysqldumpはmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
quanta

2

この問題は、ダンプを実行する前に、稼働中の実動サーバー上でマスターをセットアップすることで発生します(私の知る限り)。そのため、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


FLUSH PRIVILEGESを含むように編集。別のエラーの後、ユーザーがダンプでインポートされたとしても、その権限はまだアクティブではないことに気付きました。
BroknDodge

RESET MASTERは、マスターではなく、スレーブで実行する必要があります。percona.com/ blog / 2013/02/08 /…を
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
そのコードが何をするのかを説明し、コードを読みやすくフォーマットする場合、これははるかに良い答えになります。
カスペルド

0

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

次の手順で

STOP SLAVE;
RESET SLAVE;
START SLAVE;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.