【转帖】纳尼,mysqldump导出的数据居然少了40万?
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
老叶茶馆镇店之宝,扫码识别或访问 http://yejinrong.com 直达
人赞赏
</div><div><div></div></div>
</div>
</article>
【转帖】纳尼,mysqldump导出的数据居然少了40万?的更多相关文章
- mysqldump导出部分数据的方法: 加入--where参数
mysqldump导出部分数据的方法: 加入--where参数 mysqldump -u用户名 -p密码 数据库名 表名 --where="筛选条件" > 导出文件路径 my ...
- Mysql 用命令行导出导入数据方法
方法一: 导出参考:https://www.cnblogs.com/activiti/p/6700044.html 用mysqldump可以导出整个数据库里的表和数据,不单单是只导出某个表的数据 命令 ...
- MYSQL使用mysqldump导出某个表的部分数据
命令格式如下: mysqldump -u用户名 -p密码 数据库名 表名 --where="筛选条件" > 导出文件路径 例子: 从meteo数据库的sdata表中导出sen ...
- mysql使用mysqldump导出数据出错
mysqldump -hlocalhost -uroot -p123456 student_info jssypk > c:/databackup.sql 导出表结构 mysqldump - ...
- MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
- mysql第一天【mysqldump导出数据和mysql导入数据】
1.使用mysqldump导出数据到本地sql文件 在mysql>bin下执行: 例如: mysqldump -hrm-2ze8mpi5i65429l1qvo.mysql.rds.aliyunc ...
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- mysql使用navicat和mysqldump导出数据
1.navicat 方式一:选中表,右键转储:(含有表结构和数据) 方式二:选择右上角工具,点击数据传输,在这个页面右侧选择数据库,左侧选择文件. 点击下一步,选择导出的表名和各种函数什么的,然后点击 ...
- mysqldump导出数据
如果导出的数据是乱码,需要制定--default-character-set= mysqldump -h wn-fala-v2-cluster.cluster-cczg3tb617nn.eu-cent ...
- mysqldump进行复制数据导出导入时的问题
在执行数据导入到从库时,若使用mysqldump命令进行数据导出,应当一次性将需要同步的库导出. mysqldump -uroot -p --single-transaction --database ...
随机推荐
- 跨越全场景统一架构三大挑战,MindSpore亮出“四招”
摘要:本文重点剖析全场景统一的AI框架的挑战和MindSpore的解决思路. 2020年的最后一天,MindSpore发布了1.1版本,1.1中很重要的特性是构建了端边云全场景统一的基础架构: htt ...
- nginx启动后,服务器还是无法访问,问题排除:设置防护墙开放断开
首先检查 nignx -t 然后查看 ps -ef | grep nginx 如果以上都没有问题那就是防火墙的问题 如果以上都没有问题那就是防火墙的问题 查看版本 firewall-cmd --ve ...
- 【教程】app备案流程简单三部曲即可完成
[教程]app备案流程简单三部曲即可完成 APP备案流程包括以下步骤: 1. 开发者实名认证:在提交备案申请之前,开发者需要通过移动应用开发平台进行实名认证.这个步骤需要提供身份证号码.姓名.联系 ...
- 字节跳动基于ClickHouse优化实践之“高可用”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量生产使用中 ...
- KB21N、KB24N作业分配与冲销
一.KB21N 调用BAPI:BAPI_ACC_ACTIVITY_ALLOC_POST 经测试,分配订单时行项目一次性最多传332条数据 "------------------------- ...
- WEB端播放华为海康大华视频方案
WEB端播放华为海康大华视频方案 类似标题:谷歌浏览器播放华为海康大华视频方案 方案 以下方案相当于给需要播放视频的WEB系统做了一个专用的浏览器,通过专用浏览器的CS客户端组件播放视频,当然,这个专 ...
- 库函数 | C++17 std::filesystem文件系统 用法指北
本文将针对常用的场景,对 std::filesystem 的使用逐一进行验证: 判断文件夹是否存在 创建单层目录 逐级创建多层目录 创建多级目录 当前文件路径 创建文件"from.dat&q ...
- Mac | HomeBrew 安装 & 配置 MySQL
这个是我最新并且一直推崇的方法: 1.安装:brew install mysql 2.开启mysql:mysql.server start 3.使用mysql的配置脚本:/usr/local/opt/ ...
- 详解 Serverless 架构的 6 大应用场景
导读 Serverless 架构将成为未来云计算领域重要的技术架构,将会被更多的业务所采纳.进一步深究,Serverless 架构在什么场景下有优秀的表现,在什么场景下可能表现得并不是很理想呢?或者说 ...
- oracle表空间已满解决
在日常的oralce使用中最长遇到的问题就是oralce的表空间满了,数据无法写入报错,这种情况下通常是磁盘没有足够的空间或者表空间的数据文件达到32G(linux最大限制单个文件不超过32G)无法继 ...