MySQL5.1->5.5へのアップデート(バージョンアップ)でmysql_upgradeするとレプリが止まる
MySQLを 5.1 から 5.5 にアップデートした際に、mysql_upgradeしたらレプリケーションが止まってしまった。実行直後から、スレーブ側でエラーが出てレプリのSQLスレッドが止まる。
エラーログその1
120228 15:05:14 [ERROR] Slave SQL: Error 'Duplicate column name 'plugin'' on query. Default database: 'mysql'. Query: 'ALTER TABLE user ADD plugin char(64) DEFAULT '', ADD authentication_string TEXT', Error_code: 1060
120228 15:05:14 [Warning] Slave: Duplicate column name 'plugin' Error_code: 1060
120228 15:05:14 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart
エラーログその2
120228 14:58:40 [ERROR] Slave SQL: Error 'Duplicate column name 'Create_tablespace_priv'' on query. Default database: 'mysql'. Query: 'ALTER TABLE user ADD Create_tablespace_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Trigger_priv', Error_code: 1060
120228 14:58:40 [Warning] Slave: Duplicate column name 'Create_tablespace_priv' Error_code: 1060
120228 14:58:40 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'log-bin.000021' position 45258
エラーログその3
120228 14:21:10 [ERROR] Slave SQL: Error 'You cannot 'ALTER' a log table if logging is enabled' on query. Default database: 'mysql'. Query: 'ALTER TABLE slow_log
MODIFY start_time TIMESTAMP NOT NULL,
MODIFY user_host MEDIUMTEXT NOT NULL,
MODIFY query_time TIME NOT NULL,
MODIFY lock_time TIME NOT NULL,
MODIFY rows_sent INTEGER NOT NULL,
MODIFY rows_examined INTEGER NOT NULL,
MODIFY db VARCHAR(512) NOT NULL,
MODIFY last_insert_id INTEGER NOT NULL,
MODIFY insert_id INTEGER NOT NULL,
MODIFY server_id INTEGER UNSIGNED NOT NULL,
MODIFY sql_text MEDIUMTEXT NOT NULL', Error_code: 1580
120228 14:21:10 [Warning] Slave: You cannot 'ALTER' a log table if logging is enabled Error_code: 1580
120228 14:21:10 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'log-bin.000021' position 32074
なんでそうなるか
mysqlデータベースをレプリ対象としていて、スレーブ->マスタ の順番でバージョンアップ作業をやったことが原因の模様。
1. スレーブ側を先にバージョンアップして mysql_upgrade を済ませる → mysqlデータベースの内容を、5.5向けに修正する。
- 新しいテーブル追加
- 既存テーブルにカラム追加 など
- この状態だとレプリケーションは失敗せず、システム全体として問題なく稼動する。
2. マスタをバージョンアップして mysql_upgrade を実行 → mysqlデータベースの内容を、5.5向けに修正する。
3. これをスレーブにレプリケーション → すでに同じ内容の修正がされている → Duplicate のエラー。
4. SQLスレッドが止まる。
回避方法としては以下がありそう。
1. マスタから先にバージョンアップする。
- でも mysql データベースの修正がレプリされてしまうので、動きがおかしくなるかもしれない。
2. スレーブからバージョンアップしていくが、mysql_upgrade はマスタのバージョンアップが終わったあと、マスタから実行する。
3. スレーブからバージョンアップしていくが、マスタのバージョンアップ時の mysql_upgrade 実行時にバイナリログを作成しない。
4. スレーブからバージョンアップしていくが、マスタのバージョンアップと mysql_upgrade 実行が終わったあと、スレーブ側でエラーとなったクエリをスキップさせる。
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
5. スレーブからバージョンアップしていくが、マスタのバージョンアップと mysql_upgrade 実行が終わったあと、マスタの内容すべてをダンプしてスレーブに取りこんで、マスタとスレーブを完全に同じ状態に保つ。
6. マスタ(log_slave_updatesをやっているならスレーブも)のバイナリログ出力を、バージョンアップ中に止めておく。my.cnf で以下の定義をコメントにしてリスタート。その上でバージョンアップ作業に取りかかる。
#log_bin
#sync_binlog
#binlog_format
--- スレーブで log_slave_updates をしているなら、スレーブでは上に加えて以下のものもコメントアウトする
#log-bin-index
#log_slave_updates
まぁそれ以前に、mysqlデータベースをレプリ対象にしていること自体が問題だよなーと思ったりする。
| 固定リンク
| コメント (0)
| トラックバック (0)


最近のコメント