3

プライマリ mysql サーバーと 2 つのスレーブをバックアップとして使用しています。

スレーブの 1 つにはソリッド ステート ストレージが装備されているため、レポートに頻繁に使用されます。

生成されるデータの一部には時間がかかり (場合によっては約 30 分から 1 時間)、割り当てられたデータを使用および生成します (2 ギガ程度のオーダーで、トランザクションの使用を躊躇します)。レポート テーブルはデータベース全体の小さなサブセットにすぎないため、レプリケーションを完全にシャットダウンすることはやや問題外です。

当面の問題は、データの生成中に生成されるレポートが明らかに不完全で間違っていることです。

  1. マスター サーバーとレポート サーバーの両方でテーブルをロックする最善の方法は何ですか?
  2. 「LOCK TABLES」ステートメントはスレーブに複製されますか、それとも一時テーブルでデータを生成し、1 つの INSERT ... SELECT ステートメントでそれらを最終テーブルにコピーするのが最善の方法でしょうか。
4

1 に答える 1

2

以下を試してください

次のことを試すことができます。

ステップ 01) マスターで、これを実行します

FLUSH TABLES WITH READ LOCK; SELECT CONNECTION_ID(); SELECT SLEEP(300);

ステップ 02)SHOW SLAVE STATUS\G両方のスレーブ (またはレポート スレーブのみ)

ステップ 03) までステップ 02 を繰り返す

  • Relay_Log_Space が変化しなくなる
  • Relay_Log_Pos が変化しなくなる
  • Seconds_Behind_Master は 0 です

この時点で、両方のスレーブが処理する新しい SQL を受け取っていないため、マスターと同じ時点でスレーブ上の MySQL を効果的に凍結しています。

ステップ 04) スレーブ (または単にレポート スレーブ) で実行します。STOP SLAVE;

ステップ 05) マスターで、(CONNECTION_ID() が 789 を返す場合)mysql> KILL 789;別の mysql セッションで実行します。

ステップ 06) レポートを実行する

ステップ 07)START SLAVE;スレーブ (またはレポート スレーブのみ) で実行する

更新 2012-06-05 15:15 EDT

これは、1 つの特定のスキーマ内のいくつかのテーブルのために少し手間がかかるように思われるため、最も簡単な方法STOP SLAVE;は、レポートを実行するスレーブで実行することです。

于 2012-06-05T16:56:35.250 に答える