8

バージョン5.1.63を実行しているmysqlサーバーがいくつかあり、今週初めにスレーブに対していくつかのクエリを実行しているときに、マスターでupdateステートメントを使用して削除する必要があるスレーブ上のデータに気づきました。

私の最初の考えは次のとおりです。

  • チームの誰かがスレーブを更新していましたが、それ以来私は反証しました
  • 更新される列が変更されたこと

そこで、mysql showstatus"table"クエリを実行して調査しました。これは、各サーバーのテストデータベースに対して実行され、データの長さが何であるかを確認しました。多くの場合、サーバー間でデータの長さが異なることがわかりましたが、データを見ると、データが同じため、エラーが発生しやすいように見えるため、この方法を使用して違いがあるかどうかを確認することはできませんでした。

次に、各テーブルに対して単純な(すべてのデータベースで)行数を実行して、行数が同じであることを確認しました。

次に、binログでレプリケーションを調べ始めました。実行されるべきであった更新ステートメントがログにはっきりと表示されているのを確認できましたが、更新は実行されませんでした。

私が知る必要があるのは:

  1. 複製は壊れていますか?私はそれが
  2. 新しいスレーブサーバーを作成した場合、同じ問題が発生しますか?
  3. サーバーの問題の範囲を確認するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

3 に答える 3

0

ステータスの詳細は、Mysqlインスタンスのデータベース統計からのデータを照合するinformation_schemaからのものであり、実行のたびに同じままになることはありません。これは、バイト単位のデータサイズの単なる概算と見なすことができますが、インデックスとデータ長の正確な値にはなりません。見積もりには使用できますが、クロスチェックには使用できません。レプリケーションの場合、マスターが実行されているかどうかに対してスレーブioおよびsqlを確認できます。また、relay-infoには、マスターとスレーブの対応するログの詳細が表示される場合があります。

もちろん、(1)の方法は、テーブルのcount(*)です。EODは、マスターとスレーブのテーブルのデータに一貫性があるかどうかを保証します。ただし、正確を期すには、(2)ランダムな値のフィールドを取得し、マスターおよびスレーブとクロスチェックします。また、満足できない場合は、(3)それらをoutfileに取り込んで、diffまたはchecksumを取得することができます。私は(1)と(2)が好きです。(1)不可能な場合でも(2)私を納得させます。;)

于 2012-08-28T09:14:16.150 に答える
0

pt-table-checksumという名前のレプリケーションを検証するツールがあります

于 2014-04-23T12:54:07.910 に答える
0

ステートメントベースのレプリケーションを使用している場合、INSERTステートメントの構成が不適切なため、マスターとスレーブで異なる結果になる可能性があります。

ORDER BYなしでINSERTSELECTを実行するか、ORDER BYが非決定論的な結果を残す可能性がある場合、スレーブはマスターから分岐します。

MySQLサイトからhttp://dev.mysql.com/doc/refman/5.1/en/insert-select.html

ORDERBY句のないSELECTステートメントによって行が返される順序は決定されていません。これは、レプリケーションを使用する場合、そのようなSELECTがマスターとスレーブで同じ順序で行を返すという保証がないことを意味します。これは、それらの間の不整合につながる可能性があります。これが発生しないようにするには、常にINSERT ... SELECT ...ORDERBY列として複製されるINSERT...SELECTステートメントを記述する必要があります。マスターとスレーブの両方で行を返すための同じ順序が適用されている限り、列の選択は重要ではありません。セクション16.4.1.15「レプリケーションと制限」も参照してください。

これが発生した場合、レプリカは分岐しており、それらを元に戻す唯一の安全な方法は、マスターDBの最近のバックアップからレプリカを再構築することです。これの最悪の部分は、エラーによってレプリケーションが失敗することは決してないかもしれませんが、結果は一貫していません。通常、UPDATEまたはDELETEステートメントがマスターとは異なる行数に影響を与えるとレプリケーションは失敗します。実際にエラーを引き起こしたのはUPDATEではなかったため、これは混乱を招きます。問題を修正する唯一の方法は、ですべてのINSERTクエリを検査することです。コードベース!

于 2014-09-05T11:17:06.230 に答える