結論
- タイムゾーンの設定ファイルをダウンロードする
- ダウンロードした設定ファイルを MySQL にインポートする
my.cnf
に設定を追記する- MySQL を再起動する
詳細
1. タイムゾーンの設定ファイルをダウンロードして MySQL にインポートする
タイムゾーンの設定ファイルを以下の MySQL のオフィシャルからダウンロードします。
上記ページに以下のように記述がありますが*1、POSIX 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
の記述が誤っているだけでもこのメッセージが出るので焦らないほうがいいです。