2008-08-27 15 views
11

私はマスタースレーブのMySQLバイナリログ複製システム(phew!)を実行していますが、一部のデータでは同期していません(つまり、マスターはスレーブより多くのデータを保持しています)。しかし、スレーブは非常に軽いMySQLエラーで頻繁に停止しますが、これを無効にすることはできますか? (レプリケートするスレーブの複製のためのmy.cnfの設定は無視されるかもしれないし、ソートのいくつかは無視されるかもしれない))MySQLバイナリログレプリケーション:エラーを無視するように設定できますか?

これは、スレーブが存在しないアイテムスレーブはちょうど死ぬ。 で素早くチェックしてください。SLOW STATUS \ G;最近、これは面倒のようなものを取得し、前にされた...

STOP SLAVE; 
RESET SLAVE; 
START SLAVE; 

を:

(私はスレーブが停止されたことを認識したら)私は、速やかに次の操作を実行して、修正
 Slave-IO-Running: Yes 
     Slave-SQL-Running: No 
     Replicate-Do-DB: 
      Last-Errno: 1062 
      Last-Error: Error 'Duplicate entry '15218' for key 1' on query. Default database: 'db'. Query: 'INSERT INTO db.table (FIELDS) VALUES (VALUES)' 

を与えます私は私のためにこれを行ういくつかの種類のPHPを吐き出した、私は最初のエラーでスレーブを殺さないいくつかのmy.cnfエントリがあるのだろうかと思っていた。

乾杯、

/MP

+0

"RESET SLAVE"は、もう一度開始から複製を開始します。同じ列の同じエラーは遅かれ早かれ到着したはずです...そして、どうやってそれがあなたの問題を解決したのでしょうか。 – Uday

答えて

11

はい、my.cnfに--slave-skip-errors = xxxがあります。ここで、xxxは「すべて」またはエラーコードのコンマ区切りリストです。

+4

このようにすると、実際にスレーブデータベースが壊れる可能性があるという警告が表示されます。彼らは理由のために誤りです。 :) – Riedsio

+0

my.cnfに、私はあなたが先頭の " - "なしに配置すると信じています。 – TheSatinKnight

3

まず、あなたは本当にエラーを無視したいですか?エラーが発生した場合、データがそれ以上同期していない可能性があります。おそらくあなたが望むのは、スレーブデータベースを削除し、エラーが発生したときに同期プロセスを再開することです。

第2に、存在しない項目を複製するときにエラーが発生しているとは思わない(それはどういう意味ですか?) - 既にスレーブデータベースに存在する項目を複製しているようです。

問題は主にクリーンなデータコピーから開始しないことが原因であると思われます。マスターがスレーブにコピーされたようです。レプリケーションはオフになっています(または失敗しました)。スレーブに逃したことに追いつく機会を与えることなく、それは再び始まった。

データベースをクローンしてスレーブにインポートするのに十分な長さの書き込みアクセスが可能な場合は、これで問題が解決する可能性があります。

1

現代mysqldumpコマンドには、一貫性のある複製の設定を支援するための2つのオプションがあります。 --master-dataをチェックして、バイナリログファイルと位置をダンプに入れ、スレーブにロードされると自動的に設定されます。また、--single-transactionはトランザクション内でダンプを行い、一貫したダンプを実行するための書き込みロックが不要になります。

+0

--single-transactionはInnoDBのようなトランザクションテーブルに対してのみ使用されることに注意してください。 –

1

レプリケーション以外の書き込みにスレーブが使用されていない場合、ハイパフォーマンスMySQLの作成者は、スレーブサーバ上にread_onlyを追加することを推奨します。これにより、ユーザは誤ってスレーブ上のデータを変更しないようにしますあなたが経験したエラー。

0

は、私はあなたが、データベースが最初にデータベースを同期とレプリケーションのために試してみて、サーバが同じ一意のIDを生成しているとオートincermentが

15

停止スレーブオフセットを設定しようとして同期とレプリケーションを行っていると思います。グローバルを設定するsql_slave_skip_counter = 1;スレーブを開始する。

現在のエラーだけを無視して、レプリケーションプロセスを続行できます。

+1

これは完璧に動作します、ありがとう。私はこの答えがなぜ最高でないのか理解していません。 – Tech4Wilco

+0

オリジナルの投稿は自動処理を要求していましたが、これはまだ手動ですが、 – SeanDowney

+0

でも動作する可能性がありますが、エラー1062の多くは、同期外れのデータベーススレーブの兆候です。あなたは、最も「最新の」データベースか「正しい」データベースを分離し、そのマスターをマスターし、新しいクラスターにスレーブをもう少し追加し、元のマスター/スレーブを撤去することをお勧めします – nandoP

関連する問題