mysqldump的一个大失误.关于--compact参数使用不当的教训...记录...备用...
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,mysqldump 的一个参数 --compact官网给出的说法是这样:--compactProduce more compact output. This option enables the --
千家信息网最后更新 2026年11月04日mysqldump的一个大失误.关于--compact参数使用不当的教训...记录...备用...mysqldump 的一个参数 --compact
官网给出的说法是这样:
--compact
Produce more compact output. This option enables the --skip-add-drop-table, --skip-addlocks, --skip-comments, --skip-disable-keys, and --skip-set-charset options.
大概意思就是让导出的脚本里面取消一些注释和不必要的sql.
下面这这几行就是加了--compact参数后的抬头几行....
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000503', MASTER_LOG_POS=107;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_for_withdraw` (
`account_id` varchar(30) NOT NULL COMMENT '资金流水号',
`withdraw_id` varchar(30) DEFAULT NULL COMMENT '提现流水号',
`biz_no` varchar(20) NOT NULL COMMENT '交易流水号',
`withdraw_time` int(11) DEFAULT NULL COMMENT '延迟提现时间(每天定时任务递减)',
下面在来比较下不加--compact导出后的脚本抬头几行:
-- MySQL dump 10.13 Distrib 5.5.33, for Linux (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.5.33-log
/*!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 */;
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000508', MASTER_LOG_POS=107;
--
-- Current Database: `test`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER S
USE `test`;
--
-- Table structure for table `account_for_withdraw`
--
DROP TABLE IF EXISTS `account_for_withdraw`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_for_withdraw` (
`account_id` varchar(30) NOT NULL COMMENT '资金流水号',
`withdraw_id` varchar(30) DEFAULT NULL COMMENT '提现流水号',
`biz_no` varchar(20) NOT NULL COMMENT '交易流水号',
`withdraw_time` int(11) DEFAULT NULL COMMENT '延迟提现时间(每天定时任务递减)',
两相比较,就可以看出,加了compact后的脚本的确更紧凑了...少了很多注释...
最开始我以为是好事,毕竟这些注释对一相同环境来说,没什么大的影响..可后来在线上一次操作,导致了大问题产生...
这里,只记录我这次操作失误有关的参数...其他的参数,另请参考官网.
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
.......(中间建表啊,插入sql啊忽略)
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
我的失误就是由这三行造成的....在加了compact参数后,是没有这三行参数的...
失误是什么勒? 时间...时间相差8小时....都知道了吧....刚好8个时区...我们是北京时间...
先不说原因和问题,,先做一个测试:
mysql> desc test;
+-------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| txt | varchar(20) | YES | | NULL | |
| time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| time2 | datetime | YES | | NULL | |
+-------+-------------+------+-----+-------------------+-----------------------------+
4 rows in set (0.00 sec)
mysql> select * from test;
+------+------+---------------------+---------------------+
| id | txt | time | time2 |
+------+------+---------------------+---------------------+
| 1 | test | 2015-07-09 10:14:47 | 2015-07-09 10:14:47 |
| 2 | test | 2015-07-09 10:14:50 | 2015-07-09 10:14:50 |
| 3 | test | 2015-07-09 10:14:53 | 2015-07-09 10:14:53 |
| 4 | test | 2015-07-09 10:14:56 | 2015-07-09 10:14:56 |
| 5 | test | 2015-07-09 10:14:59 | 2015-07-09 10:14:59 |
+------+------+---------------------+---------------------+
5 rows in set (0.00 sec)
[root@localhost ~]# mysqldump --compact --database test1 >test1.sql
Warning: Using unique option prefix database instead of databases is deprecated and will be removed in a future release. Please use the full name instead.
[root@localhost ~]# more test1.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test1`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`txt` varchar(20) DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`time2` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `test` VALUES (1,'test','2015-07-09 02:14:47','2015-07-09 10:14:47'),(2,'test','2015-07-09 02:14:50','2015-07-09 10:14:50'),(3,'test','2015-07-09 02:14:53',
'2015-07-09 10:14:53'),(4,'test','2015-07-09 02:14:56','2015-07-09 10:14:56'),(5,'test','2015-07-09 02:14:59','2015-07-09 10:14:59');
可以看到,mysqldump出来的数据,在脚本里面只要是timestamp类型的时间,都是采用的0时区.
这就是因为在dump之初,mysql就已经做了设置,现在来讲讲,刚开始提到的3行参数:
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
.......(中间建表啊,插入sql啊忽略)
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
第一行: /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 是表示将现在mysql的时区重新命名,相当于备份当前使用的时区(就这么理解吧,小学语文是体育老师教的).重命名的目的是,在后面还需要用到,后面再讲;
第二行: /*!40103 SET TIME_ZONE='+00:00' */; 设置当前会话的时区为0时区,不多做解释,这就是为什么在dump出来的时候,timestamp时间会少了8个小时的原因.
前面两行都是在dump文件最开始的时候就定义的...这一抬头就能看到的...
第三行,/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 是在文件的尾端,基本上就是在最后一张表的unlock table table_name;后面.
这一行参数的目的就是将当前会话修改成原来的时区....
这么解释下来..就清楚明了了...
我在线上做的时候,加了compact,导致timestamp类型的时间被改成了0时区了..导致数据混乱...
血的教训啊....哎....
有位大牛跟我说了句:官方给的默认信息,是有一定道理才给的,在自己不是非常清楚的情况下,不要随便修改官方给的默认信息....
很有道理啊....继续干巴爹!
官网给出的说法是这样:
--compact
Produce more compact output. This option enables the --skip-add-drop-table, --skip-addlocks, --skip-comments, --skip-disable-keys, and --skip-set-charset options.
大概意思就是让导出的脚本里面取消一些注释和不必要的sql.
下面这这几行就是加了--compact参数后的抬头几行....
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000503', MASTER_LOG_POS=107;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_for_withdraw` (
`account_id` varchar(30) NOT NULL COMMENT '资金流水号',
`withdraw_id` varchar(30) DEFAULT NULL COMMENT '提现流水号',
`biz_no` varchar(20) NOT NULL COMMENT '交易流水号',
`withdraw_time` int(11) DEFAULT NULL COMMENT '延迟提现时间(每天定时任务递减)',
下面在来比较下不加--compact导出后的脚本抬头几行:
-- MySQL dump 10.13 Distrib 5.5.33, for Linux (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.5.33-log
/*!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 */;
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000508', MASTER_LOG_POS=107;
--
-- Current Database: `test`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER S
USE `test`;
--
-- Table structure for table `account_for_withdraw`
--
DROP TABLE IF EXISTS `account_for_withdraw`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `account_for_withdraw` (
`account_id` varchar(30) NOT NULL COMMENT '资金流水号',
`withdraw_id` varchar(30) DEFAULT NULL COMMENT '提现流水号',
`biz_no` varchar(20) NOT NULL COMMENT '交易流水号',
`withdraw_time` int(11) DEFAULT NULL COMMENT '延迟提现时间(每天定时任务递减)',
两相比较,就可以看出,加了compact后的脚本的确更紧凑了...少了很多注释...
最开始我以为是好事,毕竟这些注释对一相同环境来说,没什么大的影响..可后来在线上一次操作,导致了大问题产生...
这里,只记录我这次操作失误有关的参数...其他的参数,另请参考官网.
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
.......(中间建表啊,插入sql啊忽略)
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
我的失误就是由这三行造成的....在加了compact参数后,是没有这三行参数的...
失误是什么勒? 时间...时间相差8小时....都知道了吧....刚好8个时区...我们是北京时间...
先不说原因和问题,,先做一个测试:
mysql> desc test;
+-------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | YES | | NULL | |
| txt | varchar(20) | YES | | NULL | |
| time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| time2 | datetime | YES | | NULL | |
+-------+-------------+------+-----+-------------------+-----------------------------+
4 rows in set (0.00 sec)
mysql> select * from test;
+------+------+---------------------+---------------------+
| id | txt | time | time2 |
+------+------+---------------------+---------------------+
| 1 | test | 2015-07-09 10:14:47 | 2015-07-09 10:14:47 |
| 2 | test | 2015-07-09 10:14:50 | 2015-07-09 10:14:50 |
| 3 | test | 2015-07-09 10:14:53 | 2015-07-09 10:14:53 |
| 4 | test | 2015-07-09 10:14:56 | 2015-07-09 10:14:56 |
| 5 | test | 2015-07-09 10:14:59 | 2015-07-09 10:14:59 |
+------+------+---------------------+---------------------+
5 rows in set (0.00 sec)
[root@localhost ~]# mysqldump --compact --database test1 >test1.sql
Warning: Using unique option prefix database instead of databases is deprecated and will be removed in a future release. Please use the full name instead.
[root@localhost ~]# more test1.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test1`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`txt` varchar(20) DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`time2` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `test` VALUES (1,'test','2015-07-09 02:14:47','2015-07-09 10:14:47'),(2,'test','2015-07-09 02:14:50','2015-07-09 10:14:50'),(3,'test','2015-07-09 02:14:53',
'2015-07-09 10:14:53'),(4,'test','2015-07-09 02:14:56','2015-07-09 10:14:56'),(5,'test','2015-07-09 02:14:59','2015-07-09 10:14:59');
可以看到,mysqldump出来的数据,在脚本里面只要是timestamp类型的时间,都是采用的0时区.
这就是因为在dump之初,mysql就已经做了设置,现在来讲讲,刚开始提到的3行参数:
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
.......(中间建表啊,插入sql啊忽略)
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
第一行: /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 是表示将现在mysql的时区重新命名,相当于备份当前使用的时区(就这么理解吧,小学语文是体育老师教的).重命名的目的是,在后面还需要用到,后面再讲;
第二行: /*!40103 SET TIME_ZONE='+00:00' */; 设置当前会话的时区为0时区,不多做解释,这就是为什么在dump出来的时候,timestamp时间会少了8个小时的原因.
前面两行都是在dump文件最开始的时候就定义的...这一抬头就能看到的...
第三行,/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 是在文件的尾端,基本上就是在最后一张表的unlock table table_name;后面.
这一行参数的目的就是将当前会话修改成原来的时区....
这么解释下来..就清楚明了了...
我在线上做的时候,加了compact,导致timestamp类型的时间被改成了0时区了..导致数据混乱...
血的教训啊....哎....
有位大牛跟我说了句:官方给的默认信息,是有一定道理才给的,在自己不是非常清楚的情况下,不要随便修改官方给的默认信息....
很有道理啊....继续干巴爹!
参数
时区
时间
就是
流水
流水号
脚本
时候
注释
三行
清楚
一行
任务
信息
原因
官方
小时
数据
文件
是在
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网黑科技
苏州找大状互联网科技有限公司
厦门中拓互联网络科技有限公司
上海互联网科技有限公司
迪茉互联网科技
上海致骋互联网科技
互联网科技论坛
常德市电业局互联网科技部
中国航天科技大学国际工业互联网
苏州铭阳互联网科技有限公司
互联网金融科技名词解释
伊宁互联网科技做什么的
智帮互联网科技公司最近动向
中国互联网有什么科技
广东工业互联网大赛深圳学泰科技
互联网科技股为什么大涨
互联网科技包装股
长沙渺峰互联网科技有限公司
互联网科技创新创业项目
互联网高科技绘画
互联网科技公司经营范围
互联网科技作文
上游互联网科技
互联网实体化科技化
科技互联网的估值
北京大学互联网科技怎么样
佛山市拉法互联网科技有限公司
美国互联网科技公司
互联网时代高科技布局
马化腾互联网科技教学