Mysql使用mysqldump按时间导出时的一个注意事项

在使用Mysql的mysqldump命令按时间进行数据导出时,咱们可能会遇到导出数据与原库中不符或者导出数据和咱们指望的数据不一样的状况。mysql

咱们知道Mysql数据库导出可使用命令mysqldump,使用方式能够经过在终端中输入mysqldump --help来查看。
简单的使用方式以下:
1. 导出整个数据库(包括数据库中的数据)
mysqldump -u username -p dbname > dbname.sql sql

2. 导出数据库结构(不含数据)
mysqldump -u username -p -d dbname > dbname.sql 数据库

3. 导出数据库中的某张数据表(包含数据)
mysqldump -u username -p dbname tablename > tablename.sql oop

4. 导出数据库中的某张数据表的表结构(不含数据)
mysqldump -u username -p -d dbname tablename > tablename.sql spa

咱们能够用-w(或-where)指定备份条件。在使用过程当中遇到一个问题,按时间导出时,导出的数据时“丢失”了一部分数据,而且时间与库中的不一样。code

例如咱们有下面这个表:blog

CREATE TABLE `test_timestamp` (
`pk` int(20) unsigned NOT NULL AUTO_INCREMENT,
`record_time` timestamp NULL DEFAULT NULL COMMENT '记录日期',
PRIMARY KEY (`pk`),
KEY `time` (`record_time`)
) ENGINE=MyISAM AUTO_INCREMENT=564374307 DEFAULT CHARSET=utf8;

INSERT INTO `test_timestamp` VALUES (1,'2016-08-04 16:00:00'),(2,'2016-08-04 20:00:00'),(3,'2016-08-05 00:00:00'),(4,'2016-08-05 04:00:00');

其中record_time为timestamp类型,在数据库中查询为:ip

mysql> SELECT * FROM iptv.test_timestamp;
+----+-----------------------------+
| pk | record_time |
+----+-----------------------------+
| 1 | 2016-08-05 00:00:00 |
| 2 | 2016-08-05 04:00:00 |
| 3 | 2016-08-05 08:00:00 |
| 4 | 2016-08-05 12:00:00 |
+----+-----------------------------+

 

咱们将时间大于等于2016-08-05 00:00:00的数据导出:hadoop

mysqldump -u root -p iptv test_timestamp -w"record_time >= '2016-08-05 00:00:00' " > /home/test.sql

 

而后将其导入到原来的库中后再查询:table

mysql> SELECT * FROM iptv.test_timestamp;
+----+-----------------------------+
| pk | record_time |
+----+-----------------------------+
| 3 | 2016-08-05 08:00:00 |
| 4 | 2016-08-05 12:00:00 |
+----+-----------------------------+
2 rows in set (0.00 sec)

 

发现只有两条数据。此时,若是咱们查看导出的test.sql文件,发现里面只有两条记录:
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00')

这与之前库中的记录相差8个小时。

缘由就是在导出时,若是没有加其余选项,在咱们的导出文件中有这样几行:
….
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
….
也就是说,在导出时,首先会将时区time_zone设置为'+00:00',而time_zone这个值在数据库中默认是什么呢:

mysql> show variables like '%time_zone%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+--------------------------+------------+
2 rows in set (0.00 sec)

 

是系统默认时区,查看系统默认时区:

[root@hadoop-data-1 /]# date -R
Thu, 25 Aug 2016 16:25:06 +0800

 

全部咱们的在导出数据时,时间会先作转换,而后再进行查询,转换后的记录为:
(1,'2016-08-04 16:00:00'),
(2,'2016-08-04 20:00:00'),
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00');

按照 -w"record_time >= '2016-08-05 00:00:00' "过滤后只剩下:
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00');

因此插入后只剩下两条数据了。

咱们在按时间导出数据时须要注意这个问题。解决的方式一种是在-w参数中将时间本身进行转换,另一种方式是先将须要导出的库的时区进行设置
set time_zone='+00:00';
导出结束后再恢复:
set time_zone='SYSTEM';

同时,若是导出和导入的库所使用 的时区不一样,那么导入的只是时间显示就不同,若是把两个库时区设置为同样,数值显示就相同了。全部当一样的数据在不一样数据库中显示不一样时,须要先确认一下时区的问题。

相关文章
相关标签/搜索