去年もハマってましたね。季節ものなんでしょうか。まだ試す予定ってタイトルに書いてあった割に1年放置してましたはい。
⇒ HandlerSocketの不思議な動作(まだ試す予定)
HandlerSocketで読み書きしている環境でALTER TABLEをかけようとすると、
- ALTER TABLEはHandlerSocketのTable Closeを待つ
- 後続のクエリーはALTER TABLEのメタデータロックを待つ
- 何故かいつまでもTableをクローズせず使いまわすHandlerSocketがいる気配
- HandlerSocketの中にはテーブルをクローズして、ALTER TABLEのメタデータロック待ちに入るスレッドもいる
- もうだめぽ
- マスターにはHandlerSocketが来ていないのでsql_log_bin= OFFでpt-online-schema-change
- スレーブに来ているHandlerSocketの向き先を全てマスターに向ける
- スレーブのHSコネクションが全部切れたら、FLUSH TABLESしてからpt-online-schema-change
pt-online-schema-changeでセッション変数を押し込むには--set-vars=".."で設定します。
$ pt-online-schema-change --execute --set-vars="sql_log_bin= OFF" --alter "MODIFY order_col varchar(100) COLLATE utf8_bin NOT NULL, DROP KEY IX_ORDER_COL, Engine= InnoDB" h=localhost,D=dbname,t=tablename,u=root,p=xxxx,S=/var/lib/mysql/mysql.sock
これで一連の操作の手前に"SET SESSION sql_log_bin= OFF;"が叩き込まれるので、1つ目のステップが実行できます。
Percona-toolkit 2.2.1, 2.2.2のpt-online-schema-changeには--set-vars="SQL_LOG_BIN= 0"を渡すとInvalidだと怒られるバグがあるので、なんとなくsql_log_bin= OFFで設定するようにしてあります。
⇒ https://bugs.launchpad.net/percona-toolkit/+bug/1182856
これ素敵だよなぁ。。
0 件のコメント :
コメントを投稿