41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

非公式なmysql-upgrade-checkerをMySQL5.5で試してみる

このエントリーは MySQL Casual Advent Calendar 2018 の5日目の記事です。

そもそもMySQL Upgrade Checkerって?

今まではリリースノートを読んで、つぶさに問題点を洗い出して、現行のDB環境に問題が無いかを人手にチェックしていました。 それをMySQL5.7の場合にMySQL8.0にアップグレードする場合に限って、Oracle社が公式にアップグレード時のチェックツールを作りました。 (Oracleデータベースとかだと昔からあるんで、その文化がMySQLにも入ってきた感じですね)

現在のUpgrade Checkerでは以下のようなことがチェックできる

  • 古い temporal type の使用
  • DBのオブジェクト名と予約語の競合
  • utf8mb3キャラクタセットの使用
  • mysqlスキーマの予約されたテーブル名
  • 64文字を超える外部キーの名前
  • 廃止された sql_mode の使用
  • 255文字を超える要素を含むENUM/SET型の列
  • 共有テーブルスペースでのパーティショニングテーブルの使用
  • 廃止された関数の使用
  • 廃止された GROUP BY ASC/DESC の使用
  • ”check table” と ”for upgrade”コマンドによって報告される問題

今後の機能追加に伴いチェック項目については増えていくとのこと。

詳しくは『MySQL 8.0へのバージョンアップの事前準備とアップグレードチェッカー』ってファイルがOracleにあるんでダウンロードして読んでみるといいです。

https://www.mysql.com/jp/why-mysql/presentations/mysql-80-upgrade-checker-201811-jp/

非公式なmysql-upgrade-checkerとは?

MySQL Upgrade Checkerのツラみ、それはMySQL5.7からMySQL8へのバージョンアップにしか対応していないこと。

MySQL5.5や5.6から8にしたい人は今のところ蚊帳の外なのだ。

悲しい!MySQL8も検討したいのに!

そこで出てくるみんな大好きyoku0825さん

yoku0825さんはMySQL5.5や5.6の人でも使えるように、Perl製のMySQL Upgrade Checkerを作りました。

yoku0825さんのスライドでも紹介されていた掲題のツール

こいつは是非とも試してみたい!

という気持ちから手元に作ったMySQL5.5環境に対して流してみることにした。

さっそくダウンロード

https://github.com/yoku0825/p5-mysql-upgrade-checker#example

実行

$ perl p5-mysql-upgrade-checker.pl -uroot -pxxxxx -hxxxx -Pxxxx  --execute

ところが・・・

Can't return outside a subroutine at p5-mysql-upgrade-checker.pl line 107.

107行目を見る。

return "5.7 to 8.0 only" if \$src_version < 50700 || $src_version >= 80000 || DST_VERSION < 80000 || DST_VERSION >= 80100;

多分108行目のほうが問題なんだろうな、と思いつつ、本人に伺ってみることに。

f:id:next4us-ti:20181204160024p:plain

MySQL5.5では確認しようにもshow-old-temporalsパラメータが無かったり、 information_schemaにinnodb_sys_foreignが無くて、動かない部分があり引っ掛かった模様。

色々話してて現状の最終的な修正箇所は

https://github.com/yoku0825/p5-mysql-upgrade-checker/blob/master/p5-mysql-upgrade-checker.pl#L107-L108

https://github.com/yoku0825/p5-mysql-upgrade-checker/blob/master/p5-mysql-upgrade-checker.pl#L116-L117

コメントアウトすれば動きますよ、とのことでした。

(L116のコメントアウトの代わりにSET show_old_temporals の記載されている行をコメントアウトでも問題無い)

(innodb_sys_foreignが無いんだけど、TABLE_CONSTRAINTSとREFERENTIAL_CONSTRAINTSあたりから同様のテーブルが作れそうな気もする)

あらためて実行

$ perl p5-mysql-upgrade-checker.pl -uroot -pxxxxx -hxxxx -Pxxxx  --execute
ok 1 - Usage of db objects with names conflicting with reserved keywords in 8.0
ok 2 - Usage of utf8mb3 charset
ok 3 - Usage of use ZEROFILL/display length type attributes
ok 4 - Issues reported by 'check table x for upgrade' command
ok 5 - Table names in the mysql schema conflicting with new tables in 8.0
ok 6 - usage of obsolete MAXDB sql_mode flag
ok 7 - get_obsolete_sql_mode_flags_check
ok 8 - Usage of partitioned tables in shared tablespaces
ok 9 - get_removed_functions_check
1..9

うん、動いた。 実行できる環境ができたんでこれから本番相当のDB作って流してみるか。

最後に

f:id:next4us-ti:20181204160946p:plain

さすがyoku0825さん、そこにしびれるあこがれるぅ!! 明日はそのyoku0825さんです。

追記

今日、yoku0825さんのほうでアップデートが入ったので何もしなくても動くようになってます。 f:id:next4us-ti:20181205173337p:plain

ありがとうございます!