
作者 许升辉 · 沃趣科技数据库技术专家
出品 沃趣科技

之前文章(引用沃趣技术--《当心!使用mysqldump备份可能会让你欲哭无泪》)介绍了当时间字段为timestamp时,使用mysqldump加where条件对时间字段进行过滤导出时,时域问题对导出数据的影响。今天我们就再来讨论一下mysqldump的时域问题。
查看导出数据的where条件为"gmt_modified < date_sub(curdate(),interval 359 day)",基于之前的理解,我们想过有可能是时域的问题,所以确认了一下gmt_modified字段的数据类型,查看确认gmt_modified的数据类型为datetime,由于datetime数据类型是与时域无关的,所以针对这一问题,排除了时域对导出数据的影响。
难道是这个脚本在当前服务器的环境问题?将导出数据的条件改为"gmt_modified < date_sub(curdate(),interval 358 day)",在这个条件下会查询出一天的数据,将脚本当中的数据删除部分注释掉,只执行数据导出的部分,发现该脚本完整的导出了数据。实在让人疑惑,为什么白天上班的时候数据能够备份出来,然而凌晨的时候数据就备不出来?
这时候,怀疑是不是当时数据库处于某种状态,阻止了mysqldump的备份。于是写了一个脚本,每隔一秒去检测当前数据库的连接状态。加入crontab,与删除数据的脚本在凌晨同时调起。数据清理脚本大约1分钟执行完成,于是设定数据库连接监控脚本执行3分钟。第二天观察监控的日志,也并未发现有任何异常的连接。
手动执行脚本能够备份成功,crontab就无法备份,难道真的有什么鬼故事?于是在凌晨2点手动执行备份脚本,发现的确无法备份。将脚本当中的mysqldump语句摘录出来,单独执行,仍然没有备份成功。看来备份失败与脚本、与环境都没有关系,就是mysqldump的问题。又回到问题的起点,难道真的是时域惹的祸?于是在mysqldump时加上--skip-tz-utc的参数。执行备份,这次备份成功了。
为什么--skip-tz-utc参数会影响mysqldump导出的时域呢,下面先简要介绍一下--skip-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.)
--tz-utc参数是mysqldump的默认参数,会使得mysqldump的导出文件的顶部加上一个设置时域的语句SET TIME_ZONE='+00:00',这个时域是格林威治时间,这样当导出timestamp字段时,会把在服务器设置的当前时域下显示的timestamp时间值转化为在格林威治时间下显示的时间。如下图所示,mysqldump导出的文件当中显示的时间值相对于通过数据库查询显示的时间倒退了8个小时。
mysql> show variables like "time_zone";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +08:00 |
+---------------+--------+
1 row in set (0.01 sec)
mysql> show create table t_timestamp;
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_timestamp | CREATE TABLE `t_timestamp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t_timestamp;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
16 rows in set (0.00 sec)
[root@rhel74 timestamp]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF xshtest t_timestamp > full_timestamp.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 timestamp]# vim full_timestamp.sql
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
...
LOCK TABLES `t_timestamp` WRITE;
/*!40000 ALTER TABLE `t_timestamp` DISABLE KEYS */;
INSERT INTO `t_timestamp` VALUES (1,'messi','2019-12-07 05:27:55'),(3,'xavi','2019-12-07 05:28:01'),(5,'xsh','2019-12-07 05:28:08'),(7,'cr7','2019-12-08 06:24:18'),(9,'ozil','2019-12-08 06:24:26'),(11,'ramos','2019-12-08 06:24:33'),(13,'pique','2019-12-09 00:24:24'),(15,'henry','2019-12-09 00:24:34'),(17,'lukaku','2019-12-10 04:00:58'),(19,'rakitici','2019-12-10 04:01:12'),(21,'van dijk','2019-12-11 14:00:46'),(23,'mane','2019-12-11 14:00:57'),(25,'suarez','2019-12-11 14:01:34'),(27,'Ronaldol','2019-12-11 14:01:55'),(29,'Ronaldiho','2019-12-12 10:00:20'),(31,'Deco','2019-12-12 10:00:28');
/*!40000 ALTER TABLE `t_timestamp` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
[root@rhel74 timestamp]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF --skip-tz-utc xshtest t_timestamp > full_timestamp_without_tz_utc.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 timestamp]# vim full_timestamp_without_tz_utc.sql
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
...LOCK TABLES `t_timestamp` WRITE;
/*!40000 ALTER TABLE `t_timestamp` DISABLE KEYS */;
INSERT INTO `t_timestamp` VALUES (1,'messi','2019-12-07 13:27:55'),(3,'xavi','2019-12-07 13:28:01'),(5,'xsh','2019-12-07 13:28:08'),(7,'cr7','2019-12-08 14:24:18'),(9,'ozil','2019-12-08 14:24:26'),(11,'ramos','2019-12-08 14:24:33'),(13,'pique','2019-12-09 08:24:24'),(15,'henry','2019-12-09 08:24:34'),(17,'lukaku','2019-12-10 12:00:58'),(19,'rakitici','2019-12-10 12:01:12'),(21,'van dijk','2019-12-11 22:00:46'),(23,'mane','2019-12-11 22:00:57'),(25,'suarez','2019-12-11 22:01:34'),(27,'Ronaldol','2019-12-11 22:01:55'),(29,'Ronaldiho','2019-12-12 18:00:20'),(31,'Deco','2019-12-12 18:00:28');
/*!40000 ALTER TABLE `t_timestamp` ENABLE KEYS */;
UNLOCK TABLES;
[root@rhel74 timestamp]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> show variables like "time_zone";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +09:00 |
+---------------+--------+
1 row in set (0.02 sec)
#导入不加--skip-tz-utc参数的dump文件
[root@rhel74 timestamp]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest < full_timestamp.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 timestamp]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> select * from t_timestamp;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 14:27:55 |
| 3 | xavi | 2019-12-07 14:28:01 |
| 5 | xsh | 2019-12-07 14:28:08 |
| 7 | cr7 | 2019-12-08 15:24:18 |
| 9 | ozil | 2019-12-08 15:24:26 |
| 11 | ramos | 2019-12-08 15:24:33 |
| 13 | pique | 2019-12-09 09:24:24 |
| 15 | henry | 2019-12-09 09:24:34 |
| 17 | lukaku | 2019-12-10 13:00:58 |
| 19 | rakitici | 2019-12-10 13:01:12 |
| 21 | van dijk | 2019-12-11 23:00:46 |
| 23 | mane | 2019-12-11 23:00:57 |
| 25 | suarez | 2019-12-11 23:01:34 |
| 27 | Ronaldol | 2019-12-11 23:01:55 |
| 29 | Ronaldiho | 2019-12-12 19:00:20 |
| 31 | Deco | 2019-12-12 19:00:28 |
+----+-----------+---------------------+
16 rows in set (0.01 sec)
#导入加上--skip-tz-utc参数的dump文件
[root@rhel74 timestamp]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest < full_timestamp_without_tz_utc.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 timestamp]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> select * from t_timestamp;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
16 rows in set (0.01 sec)
#数据在东八区服务器里的查询情况
mysql> show variables like "time_zone";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +08:00 |
+---------------+--------+
1 row in set (0.00 sec)
mysql> show create table t_datetime;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_datetime | CREATE TABLE `t_datetime` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
mysql> select * from t_datetime;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
16 rows in set (0.00 sec)
#导出时不加--skip-tz-utc参数
[root@rhel74 datetime]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF xshtest t_datetime > full_t_datetime.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# vim full_t_datetime.sql
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
...
LOCK TABLES `t_datetime` WRITE;
/*!40000 ALTER TABLE `t_datetime` DISABLE KEYS */;
INSERT INTO `t_datetime` VALUES (1,'messi','2019-12-07 13:27:55'),(3,'xavi','2019-12-07 13:28:01'),(5,'xsh','2019-12-07 13:28:08'),(7,'cr7','2019-12-08 14:24:18'),(9,'ozil','2019-12-08 14:24:26'),(11,'ramos','2019-12-08 14:24:33'),(13,'pique','2019-12-09 08:24:24'),(15,'henry','2019-12-09 08:24:34'),(17,'lukaku','2019-12-10 12:00:58'),(19,'rakitici','2019-12-10 12:01:12'),(21,'van dijk','2019-12-11 22:00:46'),(23,'mane','2019-12-11 22:00:57'),(25,'suarez','2019-12-11 22:01:34'),(27,'Ronaldol','2019-12-11 22:01:55'),(29,'Ronaldiho','2019-12-12 18:00:20'),(31,'Deco','2019-12-12 18:00:28');
/*!40000 ALTER TABLE `t_datetime` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
#导出时加上--skip-tz-utc参数
[root@rhel74 datetime]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF --skip-tz-utc xshtest t_datetime > full_t_datetime_without_tz_utc.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# vim full_t_datetime_without_tz_utc.sql
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
...
LOCK TABLES `t_datetime` WRITE;
/*!40000 ALTER TABLE `t_datetime` DISABLE KEYS */;
INSERT INTO `t_datetime` VALUES (1,'messi','2019-12-07 13:27:55'),(3,'xavi','2019-12-07 13:28:01'),(5,'xsh','2019-12-07 13:28:08'),(7,'cr7','2019-12-08 14:24:18'),(9,'ozil','2019-12-08 14:24:26'),(11,'ramos','2019-12-08 14:24:33'),(13,'pique','2019-12-09 08:24:24'),(15,'henry','2019-12-09 08:24:34'),(17,'lukaku','2019-12-10 12:00:58'),(19,'rakitici','2019-12-10 12:01:12'),(21,'van dijk','2019-12-11 22:00:46'),(23,'mane','2019-12-11 22:00:57'),(25,'suarez','2019-12-11 22:01:34'),(27,'Ronaldol','2019-12-11 22:01:55'),(29,'Ronaldiho','2019-12-12 18:00:20'),(31,'Deco','2019-12-12 18:00:28');
/*!40000 ALTER TABLE `t_datetime` ENABLE KEYS */;
UNLOCK TABLES;
#东九区服务器
[root@rhel74 datetime]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> show variables like "time_zone";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +09:00 |
+---------------+--------+
1 row in set (0.02 sec)
#导入不加--skip-tz-utc参数的dump文件
[root@rhel74 datetime]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest <full_t_datetime.sql
[root@rhel74 datetime]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> select * from t_datetime;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
16 rows in set (0.00 sec)
#导入加上--skip-tz-utc参数的dump文件
[root@rhel74 datetime]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest < full_t_datetime_without_tz_utc.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# mysql -utokyo -ptokyo -h192.168.239.31 tokyotest
mysql> select * from t_datetime;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
16 rows in set (0.01 sec)
通过上面的测试,我们了解了--skip-tz-utc参数对mysqldump导出timestamp字段是会有影响的,但不会影响datetime字段。但对于最开始我们在生产上遇到的问题,这样的理解反而使我们更加疑惑。时域问题不是不会影响datetime字段的导出吗?那为什么在mysqldump中以datetime字段作为where条件判断的字段导出数据时,在凌晨的时候会导不出来,而在白天的时候却可以正常导出呢?对于这些问题,我们又进行了下面的测试。
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.22-log |
+------------+
mysql> show variables like "time_zone";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | +08:00 |
+---------------+--------+
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2019-12-13 02:17:36 |
+---------------------+
CREATE TABLE `t_datetime` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
mysql> select * from t_datetime;
+----+-----------+---------------------+
| id | name | create_time |
+----+-----------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
| 7 | cr7 | 2019-12-08 14:24:18 |
| 9 | ozil | 2019-12-08 14:24:26 |
| 11 | ramos | 2019-12-08 14:24:33 |
| 13 | pique | 2019-12-09 08:24:24 |
| 15 | henry | 2019-12-09 08:24:34 |
| 17 | lukaku | 2019-12-10 12:00:58 |
| 19 | rakitici | 2019-12-10 12:01:12 |
| 21 | van dijk | 2019-12-11 22:00:46 |
| 23 | mane | 2019-12-11 22:00:57 |
| 25 | suarez | 2019-12-11 22:01:34 |
| 27 | Ronaldol | 2019-12-11 22:01:55 |
| 29 | Ronaldiho | 2019-12-12 18:00:20 |
| 31 | Deco | 2019-12-12 18:00:28 |
+----+-----------+---------------------+
mysql> select * from t_datetime where create_time < date_sub(curdate(), interval 5 day);
+----+-------+---------------------+
| id | name | create_time |
+----+-------+---------------------+
| 1 | messi | 2019-12-07 13:27:55 |
| 3 | xavi | 2019-12-07 13:28:01 |
| 5 | xsh | 2019-12-07 13:28:08 |
+----+-------+---------------------+
然而,事实上,按照create_time < date_sub(curdate(), interval 5 day)的条件,mysqldump没有备份出任何的数据。
[root@rhel74 datetime]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF xshtest t_datetime --where="create_time < date_sub(curdate(), interval 5 day)" > 5_day_ago_without_skip_tz_utc.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# vim 5_day_ago_without_skip_tz_utc.sql
--
-- Dumping data for table `t_datetime`
--
-- WHERE: create_time < date_sub(curdate(), interval 5 day)
LOCK TABLES `t_datetime` WRITE;
/*!40000 ALTER TABLE `t_datetime` DISABLE KEYS */;
/*!40000 ALTER TABLE `t_datetime` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
3. 带skip-tz-utc备份t_datetime表5天以前的数据
[root@rhel74 datetime]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF --skip-tz-utc xshtest t_datetime --where="create_time < date_sub(curdate(), interval 5 day)" > 5_day_ago_with_skip_tz_utc.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# vim 5_day_ago_with_skip_tz_utc.sql
--
-- Dumping data for table `t_datetime`
--
-- WHERE: create_time < date_sub(curdate(), interval 5 day)
LOCK TABLES `t_datetime` WRITE;
/*!40000 ALTER TABLE `t_datetime` DISABLE KEYS */;
INSERT INTO `t_datetime` VALUES (1,'messi','2019-12-07 13:27:55'),(3,'xavi','2019-12-07 13:28:01'),(5,'xsh','2019-12-07 13:28:08');
/*!40000 ALTER TABLE `t_datetime` ENABLE KEYS */;
UNLOCK TABLES;
4. 查阅官方文档

第一段的前面两句找到了我们想要的答案:会话时域的设置会影响具有时域敏感性的时间值的显示。包括NOW()、CURDATE()函数,和用timestamp数据类型存储的字段。
[root@rhel74 datetime]# mysqldump --single-transaction -uroot -p123456 -S /home/mysql/data/mysqldata1/sock/mysql.sock --set-gtid-purged=OFF xshtest t_datetime --where="create_time < date_sub('2019-12-13', interval 5 day)" > 5_day_ago_without_curdate.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@rhel74 datetime]# vim 5_day_ago_without_curdate.sql
--
-- Dumping data for table `t_datetime`
--
-- WHERE: create_time < date_sub('2019-12-13', interval 5 day)
LOCK TABLES `t_datetime` WRITE;
/*!40000 ALTER TABLE `t_datetime` DISABLE KEYS */;
INSERT INTO `t_datetime` VALUES (1,'messi','2019-12-07 13:27:55'),(3,'xavi','2019-12-07 13:28:01'),(5,'xsh','2019-12-07 13:28:08');
/*!40000 ALTER TABLE `t_datetime` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
熟悉MySQL体系结构和innodb存储引擎工作原理;擅长数据库问题分析,性能调优;对mysql备份恢复、数据迁移有丰富的实践。
相关链接
MySQL行级别并行复制能并行应用多少个binlog group?
MySQL高可用工具Orchestrator系列四:拓扑恢复
MySQL高可用工具Orchestrator系列三:探测机制
Oracle RAC Cache Fusion系列十八:Oracle RAC Statisticsand Wait Events

更多干货,欢迎来撩~




