サーバー間でデータベースを移動する場合、タイムゾーンが異なる日付/タイムスタンプフィールド。私はやっています:
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
それは「適切な」方法のように聞こえます。
TIMESTAMP
列にはUTCでの時刻が含まれますが、格納およびフェッチ時に変換されるため、ローカル時刻に変換された値のみを確認できます。
一方、DATETIME
列は、時計の写真を撮るようなものです。ストア/フェッチ中にTZ変換はありません。
Mysqldumpは基本的にSELECTs
の束であり、リロードはINSERTs
の束であるため、ファイル内のデータは時計の絵のように見えます。フェッチ中にUTCを使用すると、ファイルにUTC時間が含まれます。そのSET
を使用することにより、INSERT
は値を混乱させる変換を行いません。