39
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RDS(MySQLエンジンにてタイムゾーンを変更する方法を整理)

Last updated at Posted at 2014-08-12

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 Typedynamic(即時反映)であるため、
反映される(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が変更されていることを確認出来ました。

以上になります。

39
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?