このエントリーは 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行目のほうが問題なんだろうな、と思いつつ、本人に伺ってみることに。
MySQL5.5では確認しようにもshow-old-temporalsパラメータが無かったり、 information_schemaにinnodb_sys_foreignが無くて、動かない部分があり引っ掛かった模様。
色々話してて現状の最終的な修正箇所は
をコメントアウトすれば動きますよ、とのことでした。
(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作って流してみるか。
最後に
さすがyoku0825さん、そこにしびれるあこがれるぅ!! 明日はそのyoku0825さんです。
追記
今日、yoku0825さんのほうでアップデートが入ったので何もしなくても動くようになってます。
ありがとうございます!