11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-27

調査のきっかけ

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 時間そのまま  

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

まとめ

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

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?