mysqldump实用程序不包含输出中的my.cnf中的SQL_MODE

时间:2017-04-19 10:19:05

标签: mysql sql

在my.cnf里面我指定了:

sql-mode = STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY

然后我重新启动了mysql服务器:

sudo systemctl restart mysql 

然后我检查了SQL_MODE变量的值:

show variables like '%sql_mode%';
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                                           |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+

然后我用命令转储mydatabase:

mysqldump --user root --password=root --host=localhost --add-drop-table --add-locks --allow-keywords --comments --complete-insert --create-options --disable-keys --extended-insert --lock-tables --quick --quote-names --routines --set-charset --dump-date --tz-utc --verbose --databases mydatabase

然后我看到了输出:

... omitted
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
... omitted

预期产出:

... omitted
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY' */;
... omitted

怎么了?

1 个答案:

答案 0 :(得分:1)

这里没有错。该行与转储文件开头的另一行类似,会在导入期间临时更改sql mode以获得受控环境。这可确保您的服务器设置(例如character settime zonesql mode)不会影响数据的添加方式。会有一个

/*!40101 SET SQL_MODE=@OLD_SQL_MODE*/;
转储结束时

在导入完成后重置模式(以及其他设置)。服务器配置不是转储文件的一部分,您必须单独备份它。

这是默认行为,请参阅NO_AUTO_VALUE_ON_ZERO的文档:

  

NO_AUTO_VALUE_ON_ZERO会影响AUTO_INCREMENT列的处理。通常,通过在其中插入NULL或0来为列生成下一个序列号。 NO_AUTO_VALUE_ON_ZERO将此行为抑制为0,以便只有NULL生成下一个序列号。

     

如果0已存储在表的AUTO_INCREMENT列中,则此模式非常有用。 [...]例如,如果您使用mysqldump转储表然后重新加载它,MySQL通常会在遇到0值时生成新的序列号,从而生成一个内容与转储的内容不同的表。 [...] mysqldump现在自动在其输出中包含一个启用NO_AUTO_VALUE_ON_ZERO 的语句,以避免此问题。