RDS(MySQL)のタイムゾーンを変更する
init_connectで設定することの問題点
RDSのパラメータグループにinit_connect
とあり、以下のように設定することで
接続毎にタイムゾーンをデフォルトのUTCから変更することが出来る。
SET SESSION time_zone = IF(POSITION) = 1,'UTC','Asia/Tokyo')
しかしこの方法は、現状公式も推奨していない
ほぼ週刊AWSマイスターシリーズ Reloaded ~Amazon Relational Database
Service~
というのも、この設定を施した上でRDSが再起動もしくはfailoverするとMySQL接続後クエリを発行出来なくなるという不具合があるからである。
ちなみにその場合の対処としては、
パラメータinit_connect
を一旦UTCなど別の値に変更・適用した後、再度MySQL接続することである。
SET SESSION time_zone = IF(POSITION('rdsadmin@' IN CURRENT_USER()) = 1,'UTC','UTC')
init_connect
はデフォルトnullですが、nullに戻そうとするとエラーとなるため。。上記のような対応となります。
現状出来る対処
ストアドプロシージャを定義しCALLで呼び出す
■1.ストアドプロシージャ定義
※既存のデータベースmysqlに定義する場合
※ストアドプロシージャ名は任意、今回は「adjust_time_zone」としています
mysql> DELIMITER |
mysql> CREATE PROCEDURE mysql.`adjust_time_zone`()
-> IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
-> SET SESSION time_zone = 'Asia/Tokyo';
-> END IF |
mysql> DELIMITER ;
※rdsadmin
というRDS特有のMySQLユーザでログインしている際にTimezoneをUTC
以外に変更すると不具合が起きるとのこと。
そのため、上記ではrdsadmin
以外のユーザの時のみ、Timezoneを変更するよう定義しています。
■2.プロシージャをCALL(ストアドプロシージャの定義が正しいことの確認)
mysql> CALL mysql.adjust_time_zone;
Query OK, 0 rows affected (0.00 sec)
■3.Timezoneの変更を確認
mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
■4.パラメータグループよりストアドプロシージャを呼び出す
Name | Value |
---|---|
init_connect | CALL mysql.adjust_time_zone |
■5.パラメータ反映のため、数秒待つ
init_connect
オプションのApply Type
はdynamic
(即時反映)であるため、
反映される(Parameter Groupのステータスがapplying
からin-sync
になる)まで数秒待つ
■6. 動作確認
MySQL接続し、Timezoneが自動的かつ設定どおりに変更されていることを確認する。
[root@web01 ~]# mysql -h *****.*****.ap-northeast-1.rds.amazonaws.com -u ***** -p
Enter password:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2014-08-12 23:01:35 |
+---------------------+
1 row in set (0.00 sec)
mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
上記のように自動的にtimezoneが変更されていることを確認出来ました。
以上になります。