AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

MySQL にタイムゾーンを追加する

先日の Unbale ... の記事でも書いた通り、インストール直後の MySQLAsia/Tokyoタイムゾーンに指定するとエラーを返します。

ゆるせねえよ……、わからせてやる!

しかしこの手の話題、 OS とか物理筐体移行する際に毎回書いてる気がするんだよな。

zoneinfo を読み込ませる

zoneinfo ファイルを mysql データベースに流し込むことで、タイムゾーンを理解するようになります。

Warning が出るやんけ! とお思いでしょうが、実際出るものは仕方がない。 実害は無いのでスキップします。

❯ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Warning: Unable to load '/usr/share/zoneinfo/+VERSION' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.

もし production な環境に導入するので Warning 出たりしたら困るもしくは Windows や! というのであれば、以下公式が書いている通り、 DevelopperZone から SQL ファイルをダウンロードして読み込ませましょう。

dev.mysql.com

確認

mysql.time_zone テーブルに 600 件近いデータが入っていれば成功です。 インストール直後は空なので、極論、自分が必要なタイムゾーンさえ追加されていればインポート途中で失敗しても大丈夫だと思う。

mysql> SELECT COUNT(*) FROM mysql.time_zone;
+----------+
| COUNT(*) |
+----------+
|      598 |
+----------+
1 row in set (0.00 sec)

設定

my.cnfタイムゾーン設定を入れて mysqld プロセスを再起動すればオッケーです。

フレームワークタイムゾーン設定や言語のデフォルトに依存すると、 本番環境の RDS などに持ち込んだ時 UTC になって JST と 9 時間ずれる〜、みたいな事になりがち。 なるべく気をつけましょう!

my.cnf
# timezone
default_time_zone='Asia/Tokyo'

変更前

macOSJST で利用しているので、 system_time_zoneJST ですね。 前述の通り、ここに依存するとアブナイ。

mysql> SHOW VARIABLES LIKE "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

変更後

日本向けの時間になりました、これでオッケー。

mysql> SHOW VARIABLES LIKE "%time_zone%";
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)