web-dev-qa-db-ja.com

タイムゾーンが異なるサーバー間のmysqldump(tz-utc)

サーバー間でデータベースを移動する場合、タイムゾーンが異なる日付/タイムスタンプフィールド。私はやっています:

mysqldump --tz-utc=false database_name;

次に、タイムゾーンの異なるサーバーに再読み込みします。これは機能しているようで、日付は正しいです。

SQLマニュアルによると、私はこれをする必要はないはずです:

マニュアルから:

--tz-utc

このオプションを使用すると、TIMESTAMP列をダンプして、異なるタイムゾーンのサーバー間で再ロードできます。 mysqldumpは、接続タイムゾーンをUTCに設定し、SET TIME_ZONE='+00:00'をダンプファイルに追加します。このオプションを使用しない場合、TIMESTAMP列はダンプされ、ソースサーバーと宛先サーバーのローカルのタイムゾーンに再ロードされます。これにより、サーバーが異なるタイムゾーンにある場合に値が変更される可能性があります。 --tz-utcは、夏時間による変更からも保護します。 --tz-utcはデフォルトで有効になっています。これを無効にするには、--skip-tz-utcを使用します。

私はこれがどのように機能するのか正確に理解していないと思います。

タイムゾーンが異なるサーバー間でデータを移動する適切な方法は何ですか?

--tz-utc = falseが実際のステートメントであることを示すための編集

cmuench@cmuench:~$ mysqldump --tz-utc=false pos > 1.sql;
cmuench@cmuench:~$ mysqldump --tz-utc=true pos > 2.sql;
cmuench@cmuench:~$ mysqldump --tz-utc pos > 3.sql;
cmuench@cmuench:~$ diff 1.sql 2.sql 

10a11,12
> /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
> /*!40103 SET TIME_ZONE='+00:00' */;
2903a2906
> /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2913c2916
< -- Dump completed on 2017-07-12  0:29:54
---
> -- Dump completed on 2017-07-12  0:29:57

cmuench@cmuench:~$ diff 2.sql 3.sql 
2916c2916
< -- Dump completed on 2017-07-12  0:29:57
---
> -- Dump completed on 2017-07-12  0:30:01
3
Chris Muench

それは「適切な」方法のように聞こえます。

TIMESTAMP列にはUTCでの時刻が含まれますが、格納およびフェッチ時に変換されるため、ローカル時刻に変換された値のみを確認できます。

一方、DATETIME列は、時計の写真を撮るようなものです。ストア/フェッチ中にTZ変換はありません。

Mysqldumpは基本的にSELECTsの束であり、リロードはINSERTsの束であるため、ファイル内のデータは時計の絵のように見えます。フェッチ中にUTCを使用すると、ファイルにUTC時間が含まれます。そのSETを使用することにより、INSERTは値を混乱させる変換を行いません。

3
Rick James