MySQL 5.1.72のmysql_upgradeにモンキーパッチしたはなし
mysql

MySQL 5.1.72のmysql_upgradeにモンキーパッチしたはなし

このエントリーをはてなブックマークに追加

こんにちは、DBAのたなかです。

直近でMySQL 5.0を5.1にアップデートするサービスがあり手順をまとめていたんですが、mysql_upgradeの動作がどうもおかしい。具体的には--skip-write-binlogを指定すると、OKとか出るくせにALTERが実行されていない。

トラッキングしてみると、どうもmysql_upgradeが--skip-write-binlogオプションをパースしてから内部的にmysqlコマンドラインクライアントにそのままオプションを渡しているところが良くないっぽいところまでは突き止めたのでバグレポート。

( ´-`).oO(このあたりの顛末はまた別の話として。

が、バグの修正をのんびり待っているわけにも行かないし、ワークアラウンドもスローログを無効にして回るか、SQLスレッドが止まるたびにsql_slave_skip_counter= 1するという面倒くさい感じなので(15インスタンスくらいやらないといけないので非常に手間)、mysqlコマンドラインクライアントに渡すオプションから"--write-binlog"を握りつぶすモンキーパッチで対応することにしますた。

が。

残念なことにmysql_upgradeはC。(能力的に)読めはしても書くのは微妙なC。何度もSegfaultと戦い、Cの文字列操作に四苦八苦してはオプションを壊して後段の処理がエラったり、直してはSegfaultし。。

すっかり不貞腐れて、「YAPCでキラキラしていた某セキュリティエンジニア」のirok氏に「Cの文字列操作大嫌い超嫌い」とかエレベータートークで愚痴ったところ、「それくらいならこうすればいいんじゃん? ソース見せてくれれば直したげるよ?」とありがたい言葉をいただいたので直してもらった。

彼のいわく、「俺MySQL判らないからこの(パッチを当てる部分)だけ見ても全体として正しく動くのか判断できないよ?」と心配してくれたけれども、mysql_upgradeがどうやってmysqlcheckをキックしてmysqlをキックしてアップグレード処理かけるのかは俺が知ってる。どう(少なくとも動く様に)直せばいいのかも俺が前後のコードおっかけて理解できる。

俺のできるところと、誰かのできるところで、何かが完成するっていいですよね。このパターン大好きです。

くだんのパッチは最終的にこちらです。同じ問題で困る人がいればご参考までに。

https://gist.github.com/yoku0825/7003161


名無しのエンジニア
スタートアップ出来なかった件
dev.mysql.comの歩き方(ダウンロード編)