10年ぐらい前のシステムのAWS化に際し、
オンプレミス上のMySQLをAWS RDSに移行しました。
移行作業の中で何点かハマりポイントがあったので書き記します。
環境
既存環境
- MySQL5.2
新環境
- AWS RDS
- MySQL5.7
ポイント1 テーブル名が大文字小文字が区別されるようになる。
Unix では、lower_case_table_names のデフォルト値は 0 です。Windows では、デフォルト値は 1 です。OS X では、デフォルト値は 2 です。
MySQLでSQLにテーブル名を書く時、大文字小文字を区別するかどうかは、lower_case_table_names
のパラメータに依存します。
どうも今回対象としたシステムは最初Windowsで動かしていたみたいでlower_case_table_names
が1になっていました。
RDSの同パラメータのデフォルト値はゼロです。
既存のSQLはWindows上で開発してたようでテーブル名の大文字小文字が統一されておらず、
結構な数のSQLが動作不良を起こしました。
これについては、SQLの方では直しきれなかったのでパラメータの方を変更してます。
なお、lower_case_table_names
RDSのMySQLが5.6未満だと0以外選べないので注意が必要です。
ポイント2 ファンクションが移行できない。
ファンクションと一部のストアードプロシージャが移行に失敗しました。
ファンクションにはSUPER権限が必要ですが、RDS上のユーザーにはこの権限が提供されていません。
従って、ファンクションを作るDDLが通りません。
CREATE PROCEDURE および CREATE FUNCTION には、CREATE ROUTINE 権限が必要です。
SYS アクセス (SUPER 権限) は提供されていません。MySQL DB インスタンスでバイナリログが有効になっている場合は、DB インスタンス用に作成するカスタム DB パラメータグループで log_bin_trust_function_creators パラメータを true に設定します。
以上からlog_bin_trust_function_creators
をtrueにして、
RDSを再起動するとファンクションのDDLが通るようになりました。
ポイントは以上です。
上記2点を修正したところ、無事移行完了し安定して動くようになっています。