TL;DR
- lefred や MySQL Server Team もすなる checkForServerUpgrade といふものを、yoku0825もしてみむとしてするなり。
- オリジナルはMySQL Shellのjsモードで使うものらしく、
X PluginをインストールしなければいけないX PluginなしのClassic Protocol + jsモードでもイケた 。これを書いている最中に気が付いた…。 - それもアレだし、どんなことをチェックして良し悪しを判断してるのかも気になったのでPerl 5で書き下してみたのがこちら。
MySQLの中の人が最近(?)ちょくちょく推してる Upgrade Checker だけど、MySQL Shellの機能なのでX Plugin必須かなと思ってちょっと敬遠していたのだけれど。
checkForServerUpgrade() can use either an X Protocol connection or a classic MySQL protocol connection.
ってなことで実はPerlに打ち直す必要なんてなかったことがこの記事を書いている最中に判明した。かなしい。
$ mysqlsh -S /usr/mysql/5.7.22/data/mysql.sock -uroot --mysql
Creating a Classic session to 'root@/usr%2Fmysql%2F5.7.22%2Fdata%2Fmysql.sock'
Enter password:
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 77
Server version: 5.7.22-log Source distribution
No default schema selected; type \use <schema> to set one.
MySQL Shell 8.0.11
MySQL localhost JS > util.checkForServerUpgrade();
The MySQL server at /usr%2Fmysql%2F5.7.22%2Fdata%2Fmysql.sock will now be checked for compatibility issues for upgrade to MySQL 8.0...
MySQL version: 5.7.22-log - Source distribution
...
よいこはちゃんとドキュメントを読もう、という話で終わっちゃいそうだけれど、折角書き下したのでちょっと紹介。
シンタックスが気にくわなくて直したのはいくつかあるけれど、割と素直にSQLを移植しただけなのでSQLごとにちょっと感じが違うのはある。
あと、本家はワーニングとエラーと分けられているけれど面倒だったので全部 Test::More でOKかNGかしか返さなくしちゃった。
あと、本家はワーニングとエラーと分けられているけれど面倒だったので全部 Test::More でOKかNGかしか返さなくしちゃった。
チェック全体の流れとしてはざっとこんな感じ。
ok(get_reserved_keywords_check(),
"Usage of db objects with names conflicting with reserved keywords in 8.0");
ok(get_utf8mb3_check(), "Usage of utf8mb3 charset");
ok(get_zerofill_check(), "Usage of use ZEROFILL/display length type attributes");
ok(Check_table_command(), "Issues reported by 'check table x for upgrade' command");
ok(get_mysql_schema_check(), "Table names in the mysql schema conflicting with new tables in 8.0");
ok(get_old_temporal_check(), "Usage of old temporal type");
ok(get_foreign_key_length_check(), "Foreign key constraint names longer than 64 characters");
ok(get_maxdb_sql_mode_flags_check(), "usage of obsolete MAXDB sql_mode flag");
ok(get_obsolete_sql_mode_flags_check(), "get_obsolete_sql_mode_flags_check");
ok(get_partitioned_tables_in_shared_tablespaces_check(), "Usage of partitioned tables in shared tablespaces");
ok(get_removed_functions_check(), "get_removed_functions_check");
予約語が使われているオブジェクトがないか、utf8mb3(3バイトUTF-8)が使われているオブジェクトはないか、zerofill属性を期待している(ように思われる)データ型はないか、
CHECK TABLE .. FOR UPGRADE
は通るか、8.0で新しく追加されたテーブルと競合するオブジェクトはないか、5.5とそれ以前までで使用されていた古い形式のDATETIME/TIMESTAMP型(マイクロ秒非対応の古いデータ型)はないか、64文字を超える外部キー制約はないか、古い複合sql_modeが使われているオブジェクトはないか、ibdata1に格納されているパーティションはないか、削除された関数を使っているストアドやgenerated columnはないか、をチェックしている。
具体的なSQLは、
p5-mysql-upgrade-checker
を --execute
なしで実行するか、general_log = ON
にしてMySQL Shellから実行などすると良いと思われる。
あとはREADMEにサンプル(
CHECK TABLE .. FOR UPGRADE
だけ可変だけど他は固定)が貼ってあるのでそれでも雰囲気は感じ取ってもらえるのではないか。get_reserved_keywords_check
は「新しく予約語になったもの」が使われていないかを探すけれど、「キーワードから予約語になって俺のスキーマを殺した row
」とかは入っていないので注意。フツーに入ってました。。
0 件のコメント :
コメントを投稿