RDSのtimezoneを調整する。
事の発端
RDSで作成したmysqlで以下のコマンドを実行した所「UTC」である事が判明
mysql > SELECT date();
これはあかん。 ということで対策を取る。
とりあえず変更してみる。
SESSIONでTimeZoneをTokyoに変更する。
mysql > SET SESSION time_zone = ‘Asia/Tokyo’;
するとTimeZoneが日本時間になることが判明する。
しかし問題があることがわかった。
・再起動した場合に時間が「UTC」に変更される。
「SESSIONだからダメだよなー」と思って GLOBALでコマンドを実行した所、RDSはrdsadminユーザ以外出来なさそう。とのこと。 (詳しくは調べてないけど。)
そのためSESSIONにての変更は再起動しない限定となる。。
次へ進む
init_connectにストアドを突っ込む
SESSIONは使用できるので、ストアドに突っ込むのが主流のようだ。 rdsadminの時間が変更されるとおかしな挙動が発生するようなので、除外するストアドを入れます。
mysql> CREATE DATABASE shared; mysql> DELIMITER | CREATE PROCEDURE shared.`store_time_zone`() IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN SET SESSION time_zone = 'Asia/Tokyo'; END IF | mysql> DELIMITER ; mysql> CALL shared.store_time_zone; mysql> select now();
このストアドをRDSのParameterGroupのinit_connectに設定すると再起動時に呼ばれるため TimeZoneが任意のものに変更できる。
\(ヽo^)/ヨカター
以下を参考にしました。 dev.classmethod.jp
ただ、この話には続きがあります。。。
作成ユーザがクエリを実行できない問題
同じRDSでもDB別にユーザ、権限別にユーザを作成するのはよくあることだと思います。
しかし先ほどのinit_connectを設定することにより、 作成したユーザが実行しようとした時に動かないという事象が発生。 (ここの引っ掛かり小一時間かかるという)
以下のように普通にユーザを作ると
CREATE USER my_user IDENTIFIED BY [PASSWORD] 'password'; GRANT ALL ON database_name.* TO my_user; SHOW GRANTS FOR my_user
以下のようにエラーが発生する
ERROR 2006 (HY000): MySQL server has gone away
実行権限を以下のように付与しないとうまくいかないとのことで、 つけてみる
GRANT execute ON *.* TO my_user;
そうするとうまくいく。
感想
CUIでmysqlを操作するのが普通だったのに、 GUIとmysqlコメンドのみで操作していくことになれるのに時間がかかりそうだな。 と思います。
詳しくなくてもすぐに出来るツールである一方、何かあった時の対応は大変なんだろうな。 と思う今日このごろです。
追伸
init_connectの設定値で最後にセミコロン「;」がなくて、設定をしました。 これをRDSへ反映させたところ、全てのクエリが受け付けられなくなりました。 取り扱いには気をつけてくださいね。