AWS 上で RDS 使ってて「UTC やんけ JST にしたろ!」みたいな記事は見るけど、生の MySQL ってそういえばどうなん?ってなったので、インストールから一式試してみました。
ロケ地:EC2@t2.micro MySQL 5.7.16
準備
[root@ip-172-31-25-109 ~]# yum update [root@ip-172-31-25-109 ~]# yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm [root@ip-172-31-25-109 ~]# yum install mysql-community-server その他client等必要そうなものをインストールする [root@ip-172-31-25-109 ~]# mysql_secure_installation #=> 設定を行う
MySQL
インストールののち、起動直後
作業したのが 21 時頃だったので、-9:00 の UTC で時間は合ってる。
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-11-15 12:20:44 | +---------------------+ 1 row in set (0.00 sec) mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
現在の接続で利用してるセッションだけ、JST っぽい値にしてみる。
mysql> SET @@SESSION.time_zone = "Asia/Tokyo"; ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Tokyo' mysql> SET @@SESSION.time_zone = "JST"; ERROR 1298 (HY000): Unknown or incorrect time zone: 'JST' mysql> select * from mysql.time_zone; Empty set (0.00 sec)
だめー、各種タイムゾーンの情報もインポートされてない状態。 ここで一度 MySQL を抜ける。
Linuxのタイムゾーンを変更してみる
ここで MySQL を動作させている Linux 自体の時間とロケールを確認する。
[root@ip-172-31-25-109 ~]# timedatectl status Local time: Tue 2016-11-15 12:21:39 UTC Universal time: Tue 2016-11-15 12:21:39 UTC RTC time: Tue 2016-11-15 12:21:39 Time zone: UTC (UTC, +0000) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a [root@ip-172-31-25-109 ~]# timedatectl set-timezone Asia/Tokyo [root@ip-172-31-25-109 ~]# timedatectl status Local time: Tue 2016-11-15 21:21:49 JST Universal time: Tue 2016-11-15 12:21:49 UTC RTC time: Tue 2016-11-15 12:21:48 Time zone: Asia/Tokyo (JST, +0900) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
再度試してみる
再び MySQL にログインする。
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-11-15 12:22:59 | +---------------------+ 1 row in set (0.00 sec) mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
UTC のまま。
mysqld再起動する
ここで mysqld を再起動する。
[root@ip-172-31-25-109 ~]# systemctl restart mysqld mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
おっ。
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-11-15 21:39:48 | +---------------------+ 1 row in set (0.00 sec)
わあい。
という訳で、timedatectl set-timezone したあとに、プロセスの再起動をすればシステムのロケールと同期を取ってくれるようです。 特に my.cnf に設定を追記することもないでしょう。
mysql> select * from mysql.time_zone; Empty set (0.00 sec)
インポートしなくてもシステムのタイムゾーンに合わせるなら、mysql.time_zone は空でも良いのですかね。 (過去の記事なんかを見てると、変更したい時はインポートしよう!というものをいくつか見ました。)
ちなみに
このあと、以下のようにすると怒られるので、やっぱ mysql.time_zone にインポートしないとシステム外のタイムゾーンは設定できないようですね。
mysql> SET @@SESSION.time_zone = "UTC"; ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC'
あとログファイルに出力される時刻が違うとかだとこういうのがあるらしい。
気をつけるべき点が一杯ありますねえ。