ARCHIVESDRIVE HB

オイラはホームベーカリー!

MySQL のロケールを JST にする

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

UTC から JST(Asia/Tokyo)へ変更できた。

再度試してみる

再び 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'

あとログファイルに出力される時刻が違うとかだとこういうのがあるらしい。

yoku0825.blogspot.jp

気をつけるべき点が一杯ありますねえ。