タイムゾーンの設定手順

日本向けディストリビューション以外の環境では、おおくの場合タイムゾーンがUTC(グリニッジ標準時)に設定されており、JST(日本標準時)と9時間ずれていることがあります。
(現在の時間帯設定は、シェルのdateコマンドで確認できます)

Linuxのタイムゾーンを変更するには、システム設定を変更する必要があります。

Debianのタイムゾーン設定

/etc/localtimeを参照して設定されるため、zoneinfoから引き写してdpkg-reconfigureします。

以下のコマンドで非対話的にJSTに設定可能です。

# ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# dpkg-reconfigure -f noninteractive tzdata

Current default time zone: 'Asia/Tokyo'
Local time is now:      Wed May  9 10:27:46 JST 2018.
Universal Time is now:  Wed May  9 01:27:46 UTC 2018.

MySQLのタイムゾーン設定

MySQLのタイムゾーンはOSの設定を参照する方式と、MySQL自体でtime_zone設定する方式の両方とれます。

以下のようなコマンドで現在の設定を調査できます。

mysql> SELECT now();

+---------------------+
| now()               |
+---------------------+
| 2018-05-09 13:26:13 |
+---------------------+

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.01 sec)

この例では、SYSTEM設定を参照した結果、UTCになっておりnow()もグリニッジ時刻を返します。
OSのタイムゾーンを変更した場合、system_time_zoneの値は自動では変更されず、MySQLインスタンスの再起動が必要です。
また、read only設定のためSET GLOBAL system_time_zoneはできません。

OS設定ではなく、MySQLに独立したタイムゾーン設定をしたい場合、あらかじめ付属ツールを利用してmysqlテーブルにタイムゾーンのカタログを作成しておく必要があります。

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

タイムゾーンのカタログを生成できたら、my.cnfでタイムゾーン指定できます。

[mysqld]
default-time-zone = 'Asia/Tokyo'