2011-12-17 26 views
10

私はMySql DBにマスター/スレーブレプリケーションを持っています。MySqlレプリケーション - スレーブ後ろに遅れてマスター

私のスレーブDBが数時間ダウンしていて、再びバックアップされています(マスターは常に上がっていました)。show slave statusを発行すると、スレーブがマスタのX秒後になっていることがわかります。

問題は、スレーブがマスタに追いつくように見えるいけないということである、マスターの背後にX秒をドロップするように見えるいけない...

私はスレーブが追いつくことができますどのように上の任意のアイデア?

+0

ロックテーブルがありますか? –

+0

私は – Ran

+0

のことを知っていません。最終的には、マスターに更新や挿入などのクエリがたくさんある場合を除き、スレーブは追いつきます。あなたはサーバーから来ているたくさんの質問をしていますか? –

答えて

13

は、ここでは、MySQLが完全にリレーログからSQLを処理していることを知っているようにするためにはアイデア

です。次のコマンドを実行してください:

これにより、マスターからの新しいエントリが中継ログにダウンロードされなくなります。

SQLスレッドと呼ばれるもう1つのスレッドは、マスターからダウンロードしたSQL文の処理を続行します。

SHOW SLAVE STATUS\Gを実行すると、Exec_Master_Log_Posに注目してください。再度SHOW SLAVE STATUS\Gを実行してください。 Exec_Master_Log_Posが1分後に移動しない場合は、START SLAVE IO_THREAD;を実行してください。これにより、Seconds_Behind_Masterの数が減少する場合があります。参照するSQLスレッドの

  • トラストレプリケーション
  • モニターSeconds_Behind_Master
  • モニターExec_Master_Log_Pos
  • 実行SHOW PROCESSLIST;、取るノート:それ以外

    は、本当にあなたがを除いてできることは何もありません長期実行クエリを処理している場合

ところであなたは、レプリケーションの実行とSHOW PROCESSLIST;を実行すると、そのユーザー名system user 2つのDBコネクションがなければならないことを覚えておいてください。これらのDB接続の1つに、現行のSQL文がレプリケーションによって処理されます。 SHOW PROCESSLIST;を実行するたびに異なるSQL文が表示されている限り、mysqlが依然として適切に複製していると信じることができます。

+0

スレッドの停止は私には役に立ちませんでしたが、代わりにExec_Master_Log_Posとシステムユーザからの2つの接続を監視することで、私が驚くことはありません。スレーブを再起動すると、すべて正常になります。 Rolandoありがとうございます。 –

3

「秒後ろ」は、あなたが本当にマスターの後ろにどれくらいあるかを知るための非常に良いツールではありません。それは、「私が実行したクエリは、X秒前にマスタで実行されました」ということです。それは、あなたが追いつき、次の第二にマスターのすぐ後ろにいることを意味しません。

スレーブが通常遅れておらず、マスターの作業負荷がほぼ一定であれば追いつくが、時間がかかることもあり、スレーブが通常ほとんど気にしないマスターと一緒に。スレーブは1つのスレッドで動作するため、マスターよりもはるかに遅いため、マスターでしばらく時間がかかるクエリがあると、スレーブで実行中にレプリケーションをブロックします。

1

マスターとスレーブの両方のサーバーで同じ時刻とタイムゾーンが設定されているかどうかを確認してください。

6

どのようなバイナリログ形式を使用していますか?ROWまたはSTATEMENTを使用していますか?あなたは、例えば実行すると

SELECT t.table_schema,t.table_name,engine 
FROM information_schema.tables t 
INNER JOIN information_schema .columns c 
on t.table_schema=c.table_schema 
and t.table_name=c.table_name 
and t.table_schema not in ('performance_schema','information_schema','mysql') 
GROUP BY t.table_schema,t.table_name 
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0; 

SHOW GLOBAL VARIABLES LIKE 'binlog_format'; 

あなたはすべてのテーブルは主キーまたは一意キーを持っていることを確認してくださいbinlogのフォーマットとしてROWを使用している場合PKまたはユニークキーのないテーブル上の100万レコードを削除するためのマスタに対する1つのdeleteステートメントは、マスター側で1回のフルテーブルスキャンのみが行われますが、スレーブ側ではそうではありません。

ROW binlog_formatが使用されている場合、MySQLは行の変更をバイナリログに書き出します(STATEMENT binlog_formatのようなステートメントではありません)。その変更はスレーブ側のローごとに適用されます。スキャンはスレーブ側で行われ、マスタ側に1つのdelete文しか反映されず、スレーブ遅れの問題が発生しています。

0

私たちは、最新のバックアップから私たちのスレーブを設定した後、全く同じ問題がありました。

我々はより多くのクラッシュセーフであることが私たちのスレーブの構成を変更した

:私はこのスレーブの仕様は中ほど速くないよう特にsync_binlog = 1は、問題を引き起こすことを考える

sync_binlog = 1 
sync_master_info = 1 
relay_log_info_repository = TABLE 
relay_log_recovery = 1 

マスター。この設定オプションはスレーブに(10kトランザクションごとのデフォルトではなく)実行される前にすべてのトランザクションをバイナリloに格納するよう強制します。

これらの設定オプションをデフォルト値に戻した後、私はスレーブが再び追いついているのを見ています。

0

私の同様のケースで結果を追加するだけです。

スレーブのリレーログから大部分の領域を占有していたマスターでバルクテンポラリテーブルの挿入/更新/削除がほとんど発生していませんでした。そして、Mysql 5.5では、シングルスレッド化されて以来、CPUは常に100%であり、これらのレコードを処理するのに多くの時間がかかりました。

私がしたすべては

mysqlのCNFファイルにこれらの行を追加する
replicate-ignore-table=<dbname>.<temptablename1> 
replicate-ignore-table=<dbname>.<temptablename2> 

だったし、すべてが再びスムーズになりました。

どのテーブルがリレーログでより多くの領域を占めているのかを理解するには、次のコマンドを試してから、テキストエディタで開きます。 uは、複数のスキーマの比較的新しい機能であるマルチスレッドスレーブreplication.Thisを使用することを検討している場合、あなたはいくつかのヒント

cd /var/lib/mysql 
mysqlbinlog relay-bin.000010 > /root/RelayQueries.txt 
less /root/RelayQueries.txt 
0

を得ることができます。

これは、サーバを停止することなく動的に行うことができます。スレーブSQLスレッドを停止してください。

STOP SLAVE SQL_THREAD; 
SET GLOBAL slave_parallel_threads = 4; 
START SLAVE SQL_THREAD; 
関連する問題