web-dev-qa-db-ja.com

MySQLレプリケーションに使用するバイナリログ形式はどれですか?

MySQLレプリケーションの使用を開始しようとしていますが、どの種類のbinlog形式が最適なのでしょうか。 Row、Statement、Mixedがあります。

5.1.49を使用します。

現在はローが勝っていますが、なぜローの代わりに混合を使用する必要があるのか​​疑問に思っています。

どうもありがとう、

デレンダ

6
delenda

ステートメントベースのレプリケーションは最も速くてコンパクトですが、状況によっては、スレーブとマスターで異なる結果(非決定論的)が生成される可能性があり、結果として一貫性が失われます。例は次のとおりです。

UPDATE mytable SET a = a + 1 LIMIT 1;

並べ替え順序がなく、ディスク上の順序が予測不可能または一貫していないため、どの行が更新されるかを保証する方法はありません。

行ベースのレプリケーションでは、クエリではなく変更されたデータをレプリケートすることでこの問題を回避しますが、次のようなステートメントは

UPDATE mytable SET a = a + 1;

影響を受ける行の数に関係なく、ステートメントベースのレプリケーションでは数バイトだけをレプリケートする必要があります。100万行を更新すると、行ベースのレプリケーションは100万行すべてをレプリケートします。これは非常に遅く、はるかに大きなバイナリログを作成します。

混合モードは、最も効率的または安全な方を使用して、2つを切り替えます(たとえば、単純な挿入は、おそらく行ベースのレプリケーションで最もよく行われます-ステートメントの使用は遅くなる場合があります)。問題の機会は、どのステートメントが非決定的であるかを認識することであり、これは重要な問題です。

要約すれば:

  • 行ベース:常に安全で、おそらく非常に遅く、時間とスペースが非効率的
  • ステートメントベース:常に安全であるとは限りませんが、はるかに高速になる可能性があります
  • 混合モード:理論的には両方の長所がありますが、間違った結果になり、パフォーマンスが低下するか、データが間違った方法によっては間違ったデータになる可能性があります。

公式ドキュメントは here です。

これも古い質問です。新しいビルドには、MySQL 5.5を使用する必要があります。私はPerconaのビルドを好みます。

9
Synchro