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

简介: 纳尼,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的时区设置:

image.png

图1



然后写入一条数据:

image.png

图2



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

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


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

image.png

图3


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

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

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


image.png

图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备份数据时,也使用服务器上的时间,而不使用我们本地时间。

image.png

图5



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
安全 编译器 C语言
【C语言】typeof 关键字详解
`typeof` 关键字在GCC中用于获取表达式的类型,便于动态类型定义和宏编程。它可以用于简化代码、提高代码的灵活性和可维护性。虽然 `typeof` 是 GCC 扩展,并非标准C的一部分,但它在实际编程中非常有用。
617 1
|
Java 关系型数据库 MySQL
实时计算 Flink版操作报错合集之同步tidb到hudi报错,一般是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
JavaScript 前端开发 物联网
Node.js
Node.js
232 3
|
小程序 开发者
mPaaS问题之重新导入配置文件报错如何解决
mPaaS小程序是阿里巴巴移动平台服务(mPaaS)推出的一种轻量级应用解决方案,旨在帮助开发者快速构建跨平台的小程序应用;本合集将聚焦mPaaS小程序的开发流程、技术架构和最佳实践,以及如何解决开发中遇到的问题,从而助力开发者高效打造和维护小程序应用。
143 1
|
弹性计算 人工智能 监控
ECS如何构建弹性高可用|开发者分享会
本期内容主要分享阿里云ECS构建弹性高可用的应用,即弹性伸缩(简称ESS),是指根据业务需求和策略自动调整计算能力(即实例数量)的服务。全文围绕ECS构建弹性高可用应用的挑战、构建弹性高可用应用最佳实践以及用户案例分享这3个主题进行讲解。
|
监控 前端开发 IDE
把网关系统设计的炉火纯青!(3)
把网关系统设计的炉火纯青!
207 0
把网关系统设计的炉火纯青!(3)
|
算法 关系型数据库 5G
前几代移动通信的演进 | 带你读《5G-NR信道编码》之二
本章节介绍了前几代移动通信的演进,带你感受移动通信的进化之路。
前几代移动通信的演进  | 带你读《5G-NR信道编码》之二
|
存储 Cloud Native 安全
《阿里云认证的解析与实战-关系型数据库ACP认证》——PolarDB云原生关系型数据库的解析与实践(中)—— 一、PolarDB的备份与恢复
《阿里云认证的解析与实战-关系型数据库ACP认证》——PolarDB云原生关系型数据库的解析与实践(中)—— 一、PolarDB的备份与恢复
|
机器学习/深度学习 人工智能 自然语言处理
7 Papers & Radios | 可控核聚变登Nature封面;去噪扩散概率模型极限修复图像
7 Papers & Radios | 可控核聚变登Nature封面;去噪扩散概率模型极限修复图像
223 0
|
Linux C语言 Python
aws云服务器centOS下升级python版本
centOS下升级python版本,在aws云服务器,申请一台小vm机器,自带2.7.6 版本的python,现在我要升级至3.9.13版本
1068 0