12

ROW ベースのレプリケーションを使用するシステムがあります。昨日、私は誤ってマスターに重い声明を出し、奴隷がマスターよりはるかに遅れていることを発見しました. マスターでクエリを中断しましたが、まだスレーブで実行されていました。だから私はマスターから15時間遅れて奴隷を手に入れました。

スレーブをリセットして MASTER_LOG_POS を増やすことで、すでに 1 つの位置を超えようとしましたが、うまくいきませんでした: 重いクエリ イベントよりもリレー ログが読み取られなかったため、位置が見つかりませんでした。

Read_Master_Log_Pos == Exec_Master_Log_Pos
  • 重いクエリをスキップする方法はありますか? (クエリで変更する必要があるデータは気にしません)
  • リレー ログから取得したスレーブのクエリを強制終了する方法はありますか?
  • スレーブを 1 つの位置にロールバックし、マスターの bin-log からイベントを削除して、レプリケーションを再開する方法はありますか?
4

5 に答える 5

39

スレーブで次のことを試してください。

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

これにより、スレーブ スレッドが停止し、マスターからの次のイベントがスキップされます。これは通常、ステートメントに問題がある場合に使用して、ステートメントをスキップします。

mysql ドキュメントの次の部分もお読みください: set-global-sql-slave-skip-counter

于 2013-07-17T14:10:38.717 に答える
12

最初にマスターのバイナリ ログを調べて、マスターで次のコマンドを使用して、問題の原因となっている SQL ステートメントを見つけます。

SHOW BINLOG EVENTS IN 'mysql-bin.000XXX' LIMIT 100;

次に、その前のステートメントまでのみ同期するようにスレーブを設定します。

STOP SLAVE;
START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos;

不正なステートメントの後でレプリケーションを続行したい場合 (警告、ステートメントがデータを変更した場合、これは危険な場合があります)、マスター ログの特定のポイントから続行するようにスレーブに指示できます。これを行うには、マスターで最初のコマンドを使用して位置を取得し、次にスレーブを移動するように設定します。

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000663', MASTER_LOG_POS=4;
START SLAVE;
于 2014-07-08T22:07:29.317 に答える
3

Amazon RDS MySQL の場合、スレーブで一度に 1 つのエラーをスキップできます。

CALL mysql.rds_skip_repl_error;

これを実行する前にレプリケーションを停止する必要はありません。

于 2016-03-18T18:38:42.730 に答える
0

次のようにスキップ カウンターを設定できます。

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE; 

プロセスリストを表示するには:

mysql> show [full] processlist;
kill "number from first col";

特定の位置からスレーブを開始します。

START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos

参照: http://dev.mysql.com/doc/refman/5.0/en/start-slave.html

于 2013-07-17T14:08:31.510 に答える