公司去年升级数据库的时候,从旧的mysql4.0升级至mysql5.1.45时,经历了很多困难,在成功解决了跨多版本升级,字符编码等一系列问题后,终于升级完成了。

    可是在升级完成后,在准备对外发布网站时,检查网站后台的订单时发现,所有订单的日期都推迟了6个小时(公司服务器使用的是Los Angel时区)。 检查了很久之后,才发现是mysql跨时区迁移数据的问题,现在记录为下,以便日于不犯同样的错误。

MySQL跨时区迁移数据的解决方法,重要!

问: 如果数据表中有时间字段,现在要迁移到其他时区的服务器上,该如何处理呢?
答:在高版本的mysqldump中,新增了一个选项:–tz-utc,默认是启用的,来看看它的说明 

 
  
  1. SET TIME_ZONE='+00:00' at top of dump to allow dumping of 
  2. TIMESTAMP data when a server has data in different time 
  3. zones or data is being moved between servers with 
  4. different time zones. 

看明白了吧。
简言之,就是导出时增加一个说明,把当地时间都转换成0时区的时间,然后再导入,就能确保跨时区迁移数据了,来看下例子:

 
  
  1. mysql> select * from t1; 
  2. +----+---------------------+ 
  3. | id | cur_time            | 
  4. +----+---------------------+ 
  5. |  1 | 2010-03-14 08:58:18 | 
  6. +----+---------------------+ 

现在导出数据:

 
  
  1. mysqldump --tz-utc=1 -t test t1 > t1.sql 
  2. --tz-utc=false 
  3. #查看内容 
  4. cat t1.sql 
  5. /*!40103 SET TIME_ZONE='+00:00' */; 
  6. .... 
  7. INSERT INTO `t1` VALUES (1,'2010-03-14 00:58:18'); 

可以看到,增加了设定时区的标志。

 
  
  1. mysqldump --tz-utc=0 -t test t1 > t1_1.sql 
  2. #查看内容 
  3. cat t1_1.sql 
  4. INSERT INTO `t1` VALUES (1,'2010-03-14 08:58:18');