約束の地

キャロ組

Mac の MySQL で タイムゾーン を UTC に設定する方法

結論

  1. タイムゾーンの設定ファイルをダウンロードする
  2. ダウンロードした設定ファイルを MySQL にインポートする
  3. my.cnf に設定を追記する
  4. MySQL を再起動する

詳細

1. タイムゾーンの設定ファイルをダウンロードして MySQL にインポートする

タイムゾーンの設定ファイルを以下の MySQL のオフィシャルからダウンロードします。

上記ページに以下のように記述がありますが*1POSIX standard の方をダウンロードします。

The other set is for 5.7+. Each file contains SQL statements to fill the tables:

timezone_2018e_posix_sql.zip - POSIX standard
timezone_2018e_leaps_sql.zip - Non POSIX with leap seconds

ダウンロードしたら解凍します。インポートが終われば不要となるファイルなので、場所はどこでも構いません。

2. ダウンロードした設定ファイルを MySQL にインポートする

ダウンロードしたファイルをインポートします。以降では MySQL のユーザ名は root とし、パスワードは不要であるとします。

$ mysql -uroot -p -Dmysql < ~/timezone_posix.sql

正しくインポートができた場合は特に何も出力されることなくコマンドが終了します。

3. my.cnf に設定を追記する

MySQL の設定ファイルである my.cnf にタイムゾーンの設定を書きます。my.cnf はいろいろな場所に置くことが可能ですが、どのファイルが参照されるかには優先度が存在します。優先度は以下のコマンドの結果で分かります。

$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

一行目は別件で引っかかったので無視して、二行目の順番で参照されます。私の環境では /usr/local/etc/my.cnf 以外には存在していませんでした。あえて別の場所に作ることもないと思いましたので、このファイルを編集しました。

追記するのは以下の4行です*2

[mysqld_safe]
timezone = UTC
[mysqld]
default_time_zone = UTC

4. MySQL を再起動する

あとは MySQL を再起動すればよいです。

$ mysql.server restart
Shutting down MySQL
.. SUCCESS!
Starting MySQL
. SUCCESS!

再起動が正常にできたら、念のために MySQL に入って以下のコマンドで正しく反映できているか確認しましょう。

mysql> SHOW variables LIKE '%time_zone%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | UTC   |
| time_zone        | UTC   |
+------------------+-------+
2 rows in set (0.00 sec)

補足

MySQL の再起動に失敗した場合に ...... ERROR! The server quit without updating PID file (/usr/local/var/mysql/USERNAME.local.pid). と出て一瞬ドキッとするんですが、このときすぐに pid ファイルを作ったり書き込み権限をいじったりするんではなく、単に my.cnf の記述が誤っているだけでもこのメッセージが出るので焦らないほうがいいです。

*1:2018/10/18 現在

*2:[mysqld]のカテゴリがすでに存在していたら、そのカテゴリ内に追記してよいです

Powered by はてなブログ