MySQLのログに出力されるタイムスタンプがおかしい件

MySQLで作業をした際にログを見ると、時間がおかしいことに気付きました。

MySQLを起動して、

$sudo -u _mysql mysql.server start
Starting MySQL
.... SUCCESS! 

OSのdateコマンドの結果と

$date
2016年 3月31日 木曜日 00時43分31秒 JST

MySQLのログの時間が

#/usr/local/var/mysql/Air.local.err
…
2016-03-30T15:43:24.678972Z 0 [Note] Event Scheduler: Loaded 0 events
2016-03-30T15:43:24.679586Z 0 [Note] /usr/local/Cellar/mysql/5.7.11/bin/mysqld: ready for connections.
Version: '5.7.11-log'  socket: '/tmp/mysql.sock'  port: 3306  Homebrew

違う。

原因はlog_timestamps

MySQLのログタイムスタンプは「log_timestamps」の値で設定されるのですが、これの初期値がUTCなのです。
この値をSYSTEMにすると、OS時間を採用してくれます。

#/etc/my.cnf
[mysqld]
log_timestamps=SYSTEM

上記の設定をしてから再度MySQLを起動します。

$ sudo -u _mysql mysql.server start
Starting MySQL
... SUCCESS! 

OSのdateの結果と

$ date
2016年 3月31日 木曜日 00時52分52秒 JST

MySQLのログの時間が

#/usr/local/var/mysql/Air.local.err
…
2016-03-31T00:51:57.034824+09:00 0 [Note] Event Scheduler: Loaded 0 events
2016-03-31T00:51:57.035341+09:00 0 [Note] /usr/local/Cellar/mysql/5.7.11/bin/mysqld: ready      for connections.
Version: '5.7.11-log'  socket: '/tmp/mysql.sock'  port: 3306  Homebrew

一致した!

その他時間に関わるパラメータ

ついでにMySQLの時間に関わるパラメータをまとめておきます。

system_time_zone

OSで設定されているタイムゾーンmysqlサーバ起動時に設定され、その後基本的には変更しません。

time_zone

現在のmysqlサーバで利用されているタイムゾーン
テーブル操作等で利用される時刻情報はこの値が基になります。

初期値は「SYSTEM」であり、この値は前述のsystem_time_zoneと同値であることを示します。

/* この場合はtime_zoneも「JST」 */
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+

/* これは日本時刻になる */
mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2016-03-28 23:31:42 |
+---------------------+

/* time_zoneをUTCに変えると */
mysql> set session time_zone=UTC;

mysql> show variables like '%time_zone%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | JST   |
| time_zone        | UTC   |
+------------------+-------+

/* UTC時刻になる */
mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2016-03-28 14:34:13 |
+---------------------+
1 row in set (0.00 sec)

lc_time_names

曜日の表示に使われる言語を設定する。
初期値は「en_US」。

mysql> show variables like 'lc_time_names';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| lc_time_names | en_US |
+---------------+-------+

mysql> select DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| Monday         |
+----------------+

/* 日本語を設定してみる */
mysql> set session lc_time_names=ja_JP;

mysql> show variables like 'lc_time_names';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| lc_time_names | ja_JP |
+---------------+-------+

mysql> select DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| 月曜日         |
+----------------+

参考サイトはこちらです。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.6 MySQL Server でのタイムゾーンのサポート
MySQLのタイムゾーン - @tmtms のメモ

基礎からのMySQL 改訂版 (基礎からシリーズ)

基礎からのMySQL 改訂版 (基礎からシリーズ)

実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

現場で使える MySQL (DB Magazine SELECTION)

現場で使える MySQL (DB Magazine SELECTION)