執行 mysqldump 備份後,應用新插入 DATETIME/TIMESTAMP 欄位的時間比實際時間**多 8 小時**(北京時區 UTC+8)。
mysqldump 預設啟用 --tz-utc 參數:
SET TIME_ZONE='+00:00')SET TIME_ZONE='+00:00';
--tz-utc:確保 TIMESTAMP 欄位在不同時區伺服器間正確遷移。預設開啟。使用--skip-tz-utc關閉。MySQL 5.1.2+ 引入。
mysqldump --skip-tz-utc -u root -p mydb > backup.sql
導出檔不再包含 SET TIME_ZONE,連線時區保持系統預設(如 SYSTEM / +08:00)。
在連線歸還池前執行:
SET time_zone = SYSTEM; -- 或 '+08:00'
連線池配置 connectionInitSqls(HikariCP)或 initSQL(Druid)自動執行。
jdbc:mysql://host:3306/db?serverTimezone=Asia/Shanghai&useTimezone=true
-- 備份檔檢查
head -30 backup.sql | grep TIME_ZONE
-- 連線池連線檢查
SHOW VARIABLES LIKE 'time_zone';
SELECT NOW(); -- 對比系統時間
| 場景 | 建議 |
|---|---|
| 同時區遷移/備份 | --skip-tz-utc 簡單安全 |
| 跨時區遷移 | 保留 --tz-utc,目標端同步執行 SET TIME_ZONE |
| 長連線池環境 | 必須關閉 --tz-utc 或連線歸還時重置時區 |
| 應用層統一時區 | JDBC URL 指定 serverTimezone,資料庫層存 UTC |
TIMESTAMP:儲存 UTC,讀取時按 Session 時區轉換,**受時區影響**DATETIME:儲存原始值,**不受時區影響**DATETIME + 應用層統一 UTC 存儲