embulk-input-mysqlの時刻ずれまとめ


調査のきっかけ

EmbulkでMySQLからDatetimeやTimestampを取得すると、DBが日本時間(+900)なのにEmbulkではUTC(+000)となる。
このUTC変換は、どの場所のタイムゾーンを使って変換しているのかわからなかったので調べてみた。

MySQLの調査データ

JSTの場合
mysql> desc dt;
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| d     | datetime  | YES  |     | NULL    |       |
| t     | timestamp | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM | <-- SYSTEMはsystem_time_zoneの設定に倣うという意味
+------------------+--------+

mysql> select * from dt;
+---------------------+---------------------+
| d                   | t                   |
+---------------------+---------------------+
| 2019-03-25 13:14:00 | 2019-03-25 13:14:00 |
+---------------------+---------------------+
UTCの場合
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM | <-- SYSTEMはsystem_time_zoneの設定に倣うという意味
+------------------+--------+

mysql> select * from dt;
+---------------------+---------------------+
| d                   | t                   |
+---------------------+---------------------+
| 2019-03-25 13:14:00 | 2019-03-25 04:14:00 |
+---------------------+---------------------+

Embulkのバージョンとyml

root@9d86773c89eb:/home/embulk# embulk --help
Embulk v0.9.16
in:
  type: mysql
  host: mysql_host
  user: root
  password: pass
  database: embulk
# 今はTZが未設定。下記をそれぞれ有効化して変化を調べる
#  options: {useLegacyDatetimeCode: false, serverTimezone: Etc/UTC}
#  options: {useLegacyDatetimeCode: false, serverTimezone: Asia/Tokyo}
  query: "select d, t from dt"

一覧

DBサーバ Embulkサーバ Embulk設定 DB:datetime DB:timestamp Embulk:datetime Embulk:timestamp 時間差 メモ
UTC UTC 未指定 2019/3/25 13:14 2019/3/25 4:14 2019-03-25 13:14:00 UTC 2019-03-25 04:14:00 UTC 時間そのまま  
UTC UTC Asia/Tokyo 2019/3/25 13:14 2019/3/25 4:14 2019-03-25 04:14:00 UTC 2019-03-24 19:14:00 UTC -9時間 Embulkの設定が利いてる
UTC Asia/Tokyo 未指定 2019/3/25 13:14 2019/3/25 4:14 2019-03-25 13:14:00 UTC 2019-03-25 04:14:00 UTC 時間そのまま Embulkサーバーのタイムゾーンは無視してる
UTC Asia/Tokyo Asia/Tokyo 2019/3/25 13:14 2019/3/25 4:14 2019-03-25 04:14:00 UTC 2019-03-24 19:14:00 UTC -9時間  
JST UTC 未指定 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 04:14:00 UTC 2019-03-25 04:14:00 UTC -9時間 DBのタイムゾーンが利いてる
JST UTC Asia/Tokyo 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 04:14:00 UTC 2019-03-25 04:14:00 UTC -9時間  
JST Asia/Tokyo 未指定 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 04:14:00 UTC 2019-03-25 04:14:00 UTC -9時間  
JST Asia/Tokyo Asia/Tokyo 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 04:14:00 UTC 2019-03-25 04:14:00 UTC -9時間  
JST UTC UTC 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 13:14:00 UTC 2019-03-25 13:14:00 UTC 時間そのまま Embulkの設定でDBのタイムゾーンを上書きしてる
JST Asia/Tokyo UTC 2019/3/25 13:14 2019/3/25 13:14 2019-03-25 13:14:00 UTC 2019-03-25 13:14:00 UTC 時間そのまま  

※追記 上の表は改行が入って見ずらいので画像化

まとめ

MySQLが採用しているタイムゾーンを使ってUTC化している。
しかしEmbulk側のserverTimezoneでタイムゾーンの上書きができる。