mysql同期に関する小さな問題
2837 ワード
履歴に問題が残っているため、MySQLマスタースレーブライブラリのテーブル構造が一致せず、マスターライブラリのテーブルtableaがスレーブテーブルtableaより1つ少ないフィールドがあります.
プライマリ・ライブラリでテーブル構造を変更しようとすると、binlogとともにこの行のalter文がスレーブ・ライブラリに同期され、ライブラリからこの行の文を実行中にエラーが発生すると、スレーブ・同期スレッドが自動的に停止し、手動でエラーを処理してからslave上のスレーブ・同期スレッドを開始できます.シーンは次のようになります.
1,メインライブラリ上でalter table aaa add column xxx int default 1 after yyyを実行する.
2.ライブラリから同時にこのような文が実行されますが、ライブラリからxxxというフィールドがすでに存在するため、プライマリ・スレーブ・スレッドがテーブルを変更できません.このときshow slave statusでプライマリ・スレーブのステータスを表示すると、次のような文が表示されます.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
メインライブラリからbinlogのsalve_をコピーすることがわかります.ioスレッドはまだ忙しいが、ライブラリから更新されたslave_を実行する.sqlはストライキをしたLastからerror:メインライブラリの中国からのalter table aaa add column xxx int default 1 after yyyを実行中にエラーが発生したことがわかります.具体的には、この表にxxxという列があるからです.
手動で解決する方法は、ライブラリslave_からsqlスレッドは、このエラーを無視して実行を続行させます.
1
2
上の文はslaveに現在詰まっているeventをスキップして、再び起きて仕事をするように伝えます.
上記の方法はslaveが少ない場合でも大丈夫ですが、ライブラリから数十台ある場合、1台ずつ処理するのは時間がかかり、エラーが発生しやすいので、主ライブラリ側で苦労して永遠に避けるにはどうすればいいのでしょうか.
はい、メインライブラリの側でこのようなalterのような文をbinlogに書き込まないでください.MySQLはさすがに世界的なソフトウェア製品です.session粒度のオプションを提供しています.このオプションを閉じることで、メインライブラリがこのオプションを開くか、接続を閉じる前のSQL文をbinlogに書き込まないようにすることができます.
1
2
プライマリ・ライブラリでテーブル構造を変更しようとすると、binlogとともにこの行のalter文がスレーブ・ライブラリに同期され、ライブラリからこの行の文を実行中にエラーが発生すると、スレーブ・同期スレッドが自動的に停止し、手動でエラーを処理してからslave上のスレーブ・同期スレッドを開始できます.シーンは次のようになります.
1,メインライブラリ上でalter table aaa add column xxx int default 1 after yyyを実行する.
2.ライブラリから同時にこのような文が実行されますが、ライブラリからxxxというフィールドがすでに存在するため、プライマリ・スレーブ・スレッドがテーブルを変更できません.このときshow slave statusでプライマリ・スレーブのステータスを表示すると、次のような文が表示されます.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1060
Last_Error: Error
'Duplicate column name '
xxx
''
on query. Default database:
'dbxxx'
. Query:
'alter table aaa add column xxx int default 1 after yyy'
//
Last_SQL_Errno: 1060
Last_SQL_Error: Error
'Duplicate column name '
xxx
''
on query. Default database:
'dbxxx'
. Query:
'alter table aaa add column xxx int default 1 after yyy'
メインライブラリからbinlogのsalve_をコピーすることがわかります.ioスレッドはまだ忙しいが、ライブラリから更新されたslave_を実行する.sqlはストライキをしたLastからerror:メインライブラリの中国からのalter table aaa add column xxx int default 1 after yyyを実行中にエラーが発生したことがわかります.具体的には、この表にxxxという列があるからです.
手動で解決する方法は、ライブラリslave_からsqlスレッドは、このエラーを無視して実行を続行させます.
1
2
mysql>set global sql_slave_skip_counter=1;
mysql>start slave;
上の文はslaveに現在詰まっているeventをスキップして、再び起きて仕事をするように伝えます.
上記の方法はslaveが少ない場合でも大丈夫ですが、ライブラリから数十台ある場合、1台ずつ処理するのは時間がかかり、エラーが発生しやすいので、主ライブラリ側で苦労して永遠に避けるにはどうすればいいのでしょうか.
はい、メインライブラリの側でこのようなalterのような文をbinlogに書き込まないでください.MySQLはさすがに世界的なソフトウェア製品です.session粒度のオプションを提供しています.このオプションを閉じることで、メインライブラリがこのオプションを開くか、接続を閉じる前のSQL文をbinlogに書き込まないようにすることができます.
1
2
mysql>set sql_log_bin=off;
mysql>alter table aaa add column xxx
int
default
1 after yyy;