首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使sql-mode="NO_ENGINE_SUBSTITUTION“在MySQL my.cnf中永久化

如何使sql-mode="NO_ENGINE_SUBSTITUTION“在MySQL my.cnf中永久化
EN

Stack Overflow用户
提问于 2015-03-04 08:03:23
回答 13查看 150.9K关注 0票数 56

更新1/18/15

在我们最近更新到MySQL 5.6.27 (来自Ubuntu )之后,这个选项现在起作用了。因此,这似乎是以前版本的MySQL的一个问题。

原始问题

通过对MySQL的新升级(5.6.20),除非我将sql-模式设置为NO_ENGINE_SUBSTITUTION,否则更新和插入将失败。

多亏了文档,我可以在mysql终端上运行以下代码,从而解决了这个问题(暂时):

代码语言:javascript
复制
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';`

但是,下次MySQL重新启动时,这些设置将丢失。

因此,我试图通过编辑/etc/mysql/my.cnf (在运行Ubuntu12.04.5LTS的标准服务器上)并添加文档应该添加的配置设置来使其永久化:

代码语言:javascript
复制
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"

用于测试的替代语法

仅出于测试目的,我还尝试了以下格式(这些格式在重新启动MySQL时不会导致错误,但不会影响设置)。

代码语言:javascript
复制
# dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
# underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
# underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"

毫无办法。重新启动后,此设置丢失,我必须再次从mysql终端手动运行命令,以使保存再次工作。

替代地点

  • 我知道/etc/mysql/my.cnf正在被引用,因为我们在这个文件中定义了复制,而且这是可行的。
  • 此文件中没有另一个相同的设置正在覆盖它。

通过从命令行运行以下命令,我获得了正在引用的配置文件的列表:

代码语言:javascript
复制
mysqld --help --verbose

我看到一句话:

代码语言:javascript
复制
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

这是它“查找”文件的默认位置,这并不意味着它实际上在那里找到了一个文件,例如,我的服务器没有/etc/my.cnf/usr/etc/my.cnf~/.my.cnf

因此,看起来我在/etc/ mysql /my.cnf中的配置是mysql所引用的唯一文件,因此该设置不会被覆盖。

逻辑检验结论

从逻辑上讲,语法似乎不正确,或者因为其他原因而被忽略。还有其他想法吗?

EN

回答 13

Stack Overflow用户

发布于 2015-11-02 10:50:49

为了将我的配置添加到混合中,我使用的是MySQL 5.7.8,默认情况下它具有相同的严格sql_mode规则。

  • 最后,我在我的/etc/mysql/my.conf中发现了以下工作: mysqld sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION“

也就是说,破折号,而不是下划线和引号周围的价值。

  • 除了/etc/mysql/my.conf之外,我没有其他my.conf文件。
  • 还有一些额外的配置,包括从/etc/mysql/conf.d.d/加载,但它们是空的。

这似乎对我有用。

票数 52
EN

Stack Overflow用户

发布于 2015-03-04 08:26:03

您的服务器可能读取不同于您正在编辑的my.cnf (除非您在启动mysqld时指定它)。

来自MySQL认证研究指南

搜索顺序包括两个通用选项文件,/etc/my.cnf$MYSQL_HOME/my.cnf。只有在设置了MYSQL_HOME环境变量时才使用第二个文件。通常,将其设置为MySQL安装目录。(如果在启动服务器之前没有设置mysqld_safe脚本,则该脚本将尝试设置MYSQL_HOME。)选项文件搜索顺序还包括~/.my.cnf (即主目录)。对于服务器选项来说,这不是一个特别合适的位置。(通常,您以mysqlroot的形式调用服务器,并使用--user=mysql选项。服务器读取的特定于用户的文件将取决于您从哪个登录帐户调用它,可能导致使用的选项集不一致。)

当然,另一种可能性是,您的sql-mode选项会在同一个文件中被进一步覆盖。多个选项必须在同一行中用,分隔。

P.S.:你需要引号,IIRC。既然您已经尝试过没有引号,我敢肯定,您正在编辑错误的文件,因为MySQL不会在选项文件中出现错误时启动。

再看一遍我的配置文件,它是

代码语言:javascript
复制
[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"

而且起作用了。

票数 12
EN

Stack Overflow用户

发布于 2015-03-04 08:26:10

它应该是:

代码语言:javascript
复制
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

而不是

代码语言:javascript
复制
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"

然后重新启动mysqld服务。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28849293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档