Nekakoshi’s blog

柏の葉でWEB会社やってます。RailsとかGoとかやってます。

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;

そうするとうまくいく。

感想

CUImysqlを操作するのが普通だったのに、 GUImysqlコメンドのみで操作していくことになれるのに時間がかかりそうだな。 と思います。

詳しくなくてもすぐに出来るツールである一方、何かあった時の対応は大変なんだろうな。 と思う今日このごろです。

追伸

init_connectの設定値で最後にセミコロン「;」がなくて、設定をしました。 これをRDSへ反映させたところ、全てのクエリが受け付けられなくなりました。 取り扱いには気をつけてくださいね。