2013年9月19日木曜日

pt-online-schema-changeのクエリーをレプリケーションしない方法

みんなのヒーロー pt-online-schema-change ですが、HandlerSocketと非常に相性が悪い。というかHandlerSocketとテーブルのメタデータをロックするDDL(つまりフツーのALTER TABLEでも)相性がすごく悪い。

去年もハマってましたね。季節ものなんでしょうか。まだ試す予定ってタイトルに書いてあった割に1年放置してましたはい。
⇒ HandlerSocketの不思議な動作(まだ試す予定)

HandlerSocketで読み書きしている環境でALTER TABLEをかけようとすると、

  1. ALTER TABLEはHandlerSocketのTable Closeを待つ
  2. 後続のクエリーはALTER TABLEのメタデータロックを待つ
  3. 何故かいつまでもTableをクローズせず使いまわすHandlerSocketがいる気配
  4. HandlerSocketの中にはテーブルをクローズして、ALTER TABLEのメタデータロック待ちに入るスレッドもいる
  5. もうだめぽ
という訳で、HandlerSocketを(readの時だけ)使っているウチの環境でpt-online-schema-changeをする時は、

  1. マスターにはHandlerSocketが来ていないのでsql_log_bin= OFFでpt-online-schema-change
  2. スレーブに来ているHandlerSocketの向き先を全てマスターに向ける
  3. スレーブの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 件のコメント :

コメントを投稿