公司去年升級數據庫的時候,從舊的mysql4.0升級至mysql5.1.45時,經歷了很多困難,在成功解決了跨多版本升級,字符編碼等一系列問題後,終於升級完成了。
可是在升級完成後,在準備對外發佈網站時,檢查網站後臺的訂單時發現,所有訂單的日期都推遲了6個小時(公司服務器使用的是Los Angel時區)。 檢查了很久之後,才發現是mysql跨時區遷移數據的問題,現在記錄爲下,以便日於不犯同樣的錯誤。
MySQL跨時區遷移數據的解決方法,重要!
問: 如果數據表中有時間字段,現在要遷移到其他時區的服務器上,該如何處理呢?
答:在高版本的mysqldump中,新增了一個選項:–tz-utc,默認是啓用的,來看看它的說明
- SET TIME_ZONE='+00:00' at top of dump to allow dumping of
- TIMESTAMP data when a server has data in different time
- zones or data is being moved between servers with
- different time zones.
看明白了吧。
簡言之,就是導出時增加一個說明,把當地時間都轉換成0時區的時間,然後再導入,就能確保跨時區遷移數據了,來看下例子:
- mysql> select * from t1;
- +----+---------------------+
- | id | cur_time |
- +----+---------------------+
- | 1 | 2010-03-14 08:58:18 |
- +----+---------------------+
現在導出數據:
- mysqldump --tz-utc=1 -t test t1 > t1.sql
- --tz-utc=false
- #查看內容
- cat t1.sql
- /*!40103 SET TIME_ZONE='+00:00' */;
- ....
- INSERT INTO `t1` VALUES (1,'2010-03-14 00:58:18');
可以看到,增加了設定時區的標誌。
- mysqldump --tz-utc=0 -t test t1 > t1_1.sql
- #查看內容
- cat t1_1.sql
- INSERT INTO `t1` VALUES (1,'2010-03-14 08:58:18');