MySQL中mysqldump导出timestamp 时间不对
cookqq ›博客列表 ›mysql

MySQL中mysqldump导出timestamp 时间不对

2016-04-28 15:46:19.0|分类: mysql|浏览量: 5234

摘要: mysqldump 导出数据后,时间对不上,--skip-tz-utc解决问题。

今天遇到一个奇葩问题, 使用命令导出数据:mysqldump -uhnc -p --default-character-set=utf8  --skip-tz-utc db --ignore-table=hnc.item_data > db201604281349.sql 。把这个 db201604281349.sql文件导入到win10系统的mysql数据库中,发现时间不对,时间怎么都是凌晨呢??我们系统凌晨很少有人操作。

blob.png

update_at字段类型是timestamp,经过对比发现时间相差8个小时,程序的业务显示时间对,数据库之间比业务时间少8个小时。这是为什么呢??


第一想法 难道是系统的时区设置的不对?

hwclock -r -D查看硬件时间,发现时间确实不对

blob.png

作系统的时间

blob.png

通过比较diff比较时区文件确实是上海时区

diff /etc/localtime /usr/share/zoneinfo/Asia/Shanghai


那为什么系统时间和硬件的时间不一样呢??

      使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true)
       开机: BIOS------->UTC(将BIOS中的时间看成是UTC)------(时区变化)----->CST
       关机: CST -------(时区变化)----->UTC-------存储到------>BIOS


 本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是


本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区

  时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。



第二想法mysql存储的数据对,导出的时候不知道什么原因数据少了8小时?

timestamp字段类型,从大小上你可以看出来,它不是个字符串,实际上是一个整型。当我们读取时间的时候2016-04-28 12:14:52,需要将其转换为整型。这就涉及到转换规则。也就是说,对于相同的时间戳,在不同的时区显示的结果是不一样的。反过来也一样,相同的字符串,在不同的时区解释下,会得到不同的时间戳。

mysqldump结构文件 db201604281349.sql 中,我们可以看到/*!40103 SET TIME_ZONE='+00:00' */; 字样,说明mysqldump在默认情况下,是按’+00:00’(中时区).


查看mysql客户端的时间时区,默认的是系统时间

blob.png

操作系统的时间是东八区

blob.png

所以数据导出的数据时间少8个小时!!


--skip-tz-utc解决这个问题

mysqldump -uhnc -p --default-character-set=utf8  --skip-tz-utc db --ignore-table=hnc.item_data > db201604281349.sql。这样就不会自动转换到了’+00:00’(中时区).


mysql默认转成’+00:00’(中时区) ,实际上是因为要防止跨时区导数据。假设你把中国一个机器上的数据导入到美国的一个mysqld,若不显式地设置一个时区,在导入时就会出错了。因为都用系统默认的时区,相同的字符串值会得到不同的时间戳。如我们前面说的, 时间戳是以整型方式存储的。




hwclock参数:

  --adjust  hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。 
  --debug  显示hwclock执行时详细的信息。 
  --directisa  hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟。 
  --hctosys  将系统时钟调整为与目前的硬件时钟一致。 
  --set --date=<日期与时间>  设定硬件时钟。 
  --show  显示硬件时钟的时间与日期。 
  --systohc  将硬件时钟调整为与目前的系统时钟一致。 
  --test  仅测试程序,而不会实际更改硬件时钟。 
  --utc  若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。 
  --version  显示版本信息。



关于时间、时区、系统时间和硬件时间

时区(Time Zone)是地球上的区域使用同一个时间定义。
1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。

格林威治标准时间 GMT
十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全 球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,也就是同时可以显示原居地和另一个国度的时间。

世界协调时间 UTC
多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是 Coordinated Universal Time- 世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子 时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若 大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标 准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

夏日节约时间DST
所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.),是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。 自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。

系统时间
一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。

硬件时间
主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。

世界时间
(Universal Time)世界标准时间即UTC。

地方时间
(本地时间,Local Time)由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是:
本地时间 = UTC + 时区 或 UTC = 本地时间 – 时区


一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.