当前位置:首页 > 短网址资讯

纳尼,mysqldump导出的数据居然少了40万?

www.ft12.com9年前 (2017-07-22)短网址资讯1173

0、导读

用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况?

本文约1500字,阅读时间约5分钟。

1、问题

我的朋友小文前几天遇到一个怪事,他用mysqldump备份数据时,加上了 -w 选项过滤部分数据,发现导出的数据比实际上少了40万。

要进行备份表DDL见下:

CREATE TABLE `oldbiao` (

  `aaaid` int(11) NOT NULL,

  `bbbid` int(11) NOT NULL,

  `cccid` int(11) NOT NULL,

  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  `dddid` int(11) DEFAULT NULL,

  KEY `index01` (`ccccid`),

  KEY `index02` (`dddid`,`time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

顺便吐槽下,这个表DDL设计的真是low啊。没主键,允许NULL。

mysqldump备份指令增加的 -w/--where 选项是:

-w "time>‘2016-08-01 00:00:00'"

加上这个参数的作用是:只备份 2016-8-1 之后的所有数据,相当于执行了下面这样的SQL命令:

SELECT SQL_NO_CACHE * FROM t WHERE time>‘2016-08-01 00:00:00'

然后把导出的SQL文件恢复后,再随机抽查下数据看看是否有遗漏的。不查不知道,一查吓一跳,发现 2016-12-12 下午的数据是缺失的。经过仔细核查,发现比原数据大概少了40万条记录。

百思不得其解的小文请我帮忙排查问题。

2、排查

既然是少了一部分数据,那就要先定位到底是丢失了的是哪部分数据。

那么,如何定位呢?

搞数据库的人,应该都知道折半查找法,这是计算机科学里比较基础的概念之一。我们就利用这种方法来快速定位。

经过排查,发现是缺少的数据有个特点,根据时间排序,发现最早的数据是 2016-8-1 8点的,而我们上面设定的条件则是 2016-8-1 0点开始的所有数据,整整差了8个小时。

看到8小时这个特点,我想你应该大概想到什么原因了吧。对,没错,就是因为时区的因素导致的。

经过排查,发现是因为原先写数据时,是以 0时区 时间写入的,但执行mysqldump备份时则使用的是本地 东8区 的时间,所以就有了8小时的差距。

2、解决

知道了问题所在,方法就简单了。有两个方法:

1、修改mysqldump中的where条件时间值,减去8个小时。建议采用该方法。

mysqldump ... -w "time>‘2016-07-31 16:00:00'"

2、修改MySQL全局时区,从 0时区 改成 东8区,并且mysqldump加上 --skip-tz-utc 选项。这种方法需要修改MySQL的全局时区,可能会导致更多的业务问题,因此强烈不建议使用

mysqldump ... --skip-tz-utc -w "time>‘2016-08-01 08:00:00'"

问题暂且按下,我们先来看下时区因素怎么影响查询结果的。

先看下系统本地时间:

[yejr@imsyql]$ date -R

Wed, 21 Dec 2016 14:04:51 +0800


测试表DDL:

CREATE TABLE `t1` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

...

  `c1` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB;


查看MySQL的时区设置:
图1

然后写入一条数据:
图2


第一次备份,用本地时间条件去过滤:

mysqldump -w "dt >= '2016-12-21 14:00:00'"

这种情况下,显然是没有结果的。
图3


第二次备份,用本地时间减去8小时再去过滤:

mysqldump -w "dt >= '2016-12-21 06:00:00'"

这种就可以备份出数据了。
图4


此外,我们注意到mysqldump的 --tz-utc 选项,它是和时区设定有关系的:

--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.

(Defaults to on; use --skip-tz-utc to disable.)

这个选项的作用,就是以 0时区  备份数据,把所有时间都转换成 0时区 的数据。比如本来是在 东8区(+08:00) 的时间 14:00:00,转换成 0时区 后,会变成 06:00:00,原来是 西8区(-08:00) 的时间14:00:00,则转换成 22:00:00。这个选项是默认启用的。

在上面第一次备份时没有数据,就是因为MySQL里本身存储的就是 0时区 的数据,mysqldump也设定了转换成 0时区,我们传递进去的参数却是 东8区 的时间,因此没有数据。

3、总结

本来只想简单写一下的,结果啰里啰嗦写了好多。

其实我们只需要注意一点,服务器在哪里,就是用哪里的时区,也就是 SYSTEM 时区,在做SQL查询以及mysqldump备份数据时,也使用服务器上的时间,而不使用我们本地时间。
图5

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_319.html

分享给朋友:

相关文章

SEO七大常见误区知多少

SEO七大常见误区知多少

不管是培训机构,还是一些SEO教程,甚至是各种SEO网站上所充斥着的很多SEO知识点都存在着盲区。而这个所谓的盲区对于多数的SEO从业新人来说影响巨大,甚至影响着自己手上实战排名优化的站点。结合多个SEO朋友所向我提出的各种SEO问题,我整…

全球纯电动车制造商出货量排名:特斯拉仅第二

全球纯电动车制造商出货量排名:特斯拉仅第二

提到电动汽车,我们往往首先想到的是特斯拉,然而根据一份最新调查数据显示,特斯拉并非全球最大的电动汽车制造商。据JATO数据提供商最新公开的纯电动车制造商排名显示,目前雷诺-日产是全球最大的纯电动车制造商,特斯拉排在第二位,其它前十名厂商分别…

内容电商的时代 看同路大叔怎样下这盘棋

内容电商的时代 看同路大叔怎样下这盘棋

【ft12短链接网讯】同路大叔——这个靠星座吐槽发家的网红IP,在新浪微博上具有超越1210万名粉丝,微信推送音讯简直能做到条条“十万+”。这个坐拥无穷粉丝集体的自媒体,本来早就走上了内容电商变现的路途。现在同路大叔开设了天猫官方旗舰店,具…

FT12短网址详解亚马逊、美团点评和京东的业绩

FT12短网址详解亚马逊、美团点评和京东的业绩

巴菲特曾经坦言看不懂亚马逊,招致错失如今市值已高达4610亿美金的亚马逊(截止2017年5月16日)。认真看亚马逊的收入和净利润,能够看出从2007年开端的表现逐步开端呈现分化。收入增长势不可当,2014-2016年,连续打破800、100…

支付宝官方曝光“刷脸支付”系统  刷脸的时代即将来临

支付宝官方曝光“刷脸支付”系统 刷脸的时代即将来临

昨天上午短网址资讯报道了支付宝“刷脸支付”功用曝光的音讯,疑似呈现了支付宝刷脸支付终端机,网友们纷繁表示“靠脸吃饭”时期要来了。如今支付宝官方向IT之家确认,这项“刷脸支付”功用行将上线。在视频中显现,一位测试者不用手机、不输入账号,仅靠刷…

西安一破旧小区楼顶掉下两辆共享单车,车胎爆裂

西安一破旧小区楼顶掉下两辆共享单车,车胎爆裂

“当时住户们听到了很大的响声,后来发现有人从楼上扔下了两辆共享单车。”西安市青松路雅兰花园小区住户说,工作发生在5月17日晚,也不知道是什么人干的。5月18日下午2时许,记者来到该小区B座一家住户家中,从窗子向外看去,两辆单车依然在连接两座…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。