間違ってmysqlスレーブサーバーに書き込みます

私は1つのマスターと1つのスレーブで設定されたmysqlレプリケーションを持っています。コードのバグのために、途中でエントリがスレーブサーバーに書き込まれ始め、数日後に検出されました。 今私はどのようにどのようにどのような手間や最小限のダウンタイム、これを行うための最良の方法になるだろうが正しく切り替えるのを考えていますか? 1つのテーブルだけを考慮してみましょう...

ソリューション1

auto_incrementをスレーブの最後のIDに設定した後で、今からマスタに書き始めるだけです。マスターとスレーブを同期させないようにするのは面倒ですか?

ソリューション2

マスターからのすべてのデータをクリアして、アプリケーションがmysqldumpを使用してデータを補充してから、正しい設定でアプリケーションを再びオンにすることを止めてください。

stop slave
// load the dump
start slave

これにより、マスターは同じデータをスレーブに書き直そうとするのをやめますか?

どんな助けもありがたい。その他のソリューションも歓迎されています。

ありがとう スシル

1

2 答え

私は解決策2で正しい軌道に乗っていると思います。単にスレーブを止めても、マスタがバイナリログに書き込むのを妨げません。したがって、スレーブを再起動すると、マスタからのすべてのSQL文がレプリケートされます。

ただし、各テーブルの作成前に「DROP TABLE」を含めると、これを有効に利用できます。これはあなたが次のことを意味します:

1)アプリケーションがマスターテーブルにそれ以上エントリを作成しないようにする

2)スレーブからデータをダンプします(各テーブルのインポートの前に mysqldump に 'DROP TABLE'が含まれていることを確認してください - これは mysqldump

3)マスターに対してダンプを実行する

4) SHOW SLAVE STATUS \ G を使用してスレーブステータスを確認します。 Seconds_Behind_Master が0に達すると、アプリを再びオンに切り替えることができます(マスターに書き込んでいることを確認してください!!)

ステップ3は、スレーブからのデータを使用して、マスター上のテーブルを削除して再作成します。このドロップと再作成はスレーブに複製されるため、2つの同期が完了し、正しいマスタースレーブがセットアップされるはずです。

がんばろう!

0
追加された
レプリケーション環境でスレーブを起動および停止すると、単にスレーブが一時停止します。再度スイッチをオンにすると、停止時にマスターbinlogの位置に複製が開始されます。効果的に複製を一時停止します。私の答えは、スレーブに変更を加えたいということです。私の答えでは、あなたのマスタにあるすべてのデータが現在あなたのスレーブにあると仮定しているので、 'アプリケーションを停止し、スレーブデータをダンプし、スレーブデータをマスタにダンプしてスレーブにレプリケートさせます。
追加された 著者 Tom Mac,
おかげでトム!しかし、スレーブの開始/停止は何をするのですか?スレーブ上で実行したくないマスターテーブルを変更するにはどうしたらいいですか?
追加された 著者 Sushil,

あなたの最善の選択肢は、スレーブ/マスターを完全にリセットすることです。スレーブ上のデータが正しい場合は、データをそこからリロードしてから、エクスポートをマスターから新しいダンプにエクスポートしてスレーブにインポートし、新しい「CHANGE MASTER TO ...」コマンドを実行します

スレーブ上の "read_only"グローバル変数の設定をお勧めします。

http://dev.mysql.com /doc/refman/5.1/en/replication-options-slave.html#option_mysqld_read-only

0
追加された