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

Cha*_*yer 39 mysql

更新2015年1月18日修订

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

原始问题

随着对MySQL(5.6.20)的新升级,除非我将sql-mode设置为NO_ENGINE_SUBSTITUTION,否则更新和插入将失败.

感谢文档,我可以从mysql终端运行以下内容并解决问题(暂时):

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';`
Run Code Online (Sandbox Code Playgroud)

但是下次MySQL重启时,这些设置会丢失.

所以我试图通过编辑/etc/mysql/my.cnf(在我运行Ubuntu 12.04.5 LTS的标准服务器上)来创建永久物,然后添加文档中应该添加的配置设置:

[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

用于测试的替代语法

仅出于测试目的,我还尝试了以下格式(重启MySQL时不会导致错误,但它们不会影响设置).

# dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
# underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
# underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

什么都行不通.重启后,此设置丢失,我必须再次从mysql终端手动运行命令,以便再次保存.

替代地点

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

我通过命令行运行它来获取正在引用的配置文件列表:

mysqld --help --verbose
Run Code Online (Sandbox Code Playgroud)

我看到一行内容如下:

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 
Run Code Online (Sandbox Code Playgroud)

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

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

测试的逻辑结论

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

Mik*_*ote 36

只是为了添加我的配置,我正在使用MySQL 5.7.8,它默认具有相同的严格sql_mode规则.

即破折号,而不是下划线和价值周围的报价.

  • 除了/etc/mysql/my.conf之外,我没有其他my.conf文件

  • 有一些额外的配置包括从/etc/mysql/conf.d/加载,但它们是空白的.

这似乎对我有用.

  • 正如这些答案所证明的那样,它应该是什么以及实际起作用的内容似乎有很多变化:D有时是下划线或短划线,有时是引用的.(捂脸) (2认同)
  • 对我来说,我注意到当它不在 `[mysqld]` 部分时解析存在问题。希望这可以帮助某人。 (2认同)

fan*_*nts 9

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

来自MySQL认证学习指南:

搜索顺序包括两个常规选项文件,/etc/my.cnf$MYSQL_HOME/my.cnf.仅在MYSQL_HOME 设置了环境变量时才使用第二个文件.通常,您将它设置为MySQL安装目录.(mysqld_safe脚本尝试设置 MYSQL_HOME是否在启动服务器之前未设置.)选项文件搜索顺序还包括~/.my.cnf(即主目录).这不是服务器选项特别合适的位置.(通常,您将服务器作为选项调用mysql,或者root--user=mysql选项一样调用.服务器读取的用户特定文件将取决于您调用它的登录帐户,可能导致使用不一致的选项集.)

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

PS:你需要报价,IIRC.现在您已经尝试过没有引号,我很确定,您正在编辑错误的文件,因为当选项文件中出现错误时MySQL无法启动.

PPS:再次查看我的配置文件,就是这样

[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

它正在发挥作用.


Ria*_*iad 9

它应该是:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Run Code Online (Sandbox Code Playgroud)

代替

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

然后重启mysqld服务.


小智 5

在Ubuntu 16.04上对我来说还不错。路径:/etc/mysql/mysql.cnf

并粘贴

[mysqld]
#
# * Basic Settings
#
sql_mode = "NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,这是一个许可问题。

进入:

mysqld --verbose --help | grep -A 1 "Default options"
Run Code Online (Sandbox Code Playgroud)

[警告] 世界可写的配置文件 '/etc/mysql/my.cnf' 被忽略。

于是尝试执行以下,然后重启服务器

chmod 644 '/etc/mysql/my.cnf'
Run Code Online (Sandbox Code Playgroud)

它将授予 mysql 读取和写入文件的权限。


A G*_*A G 5

我的问题是 5.7.20 上的选项之间有空格。删除它们,使线路看起来像

[mysqld]
sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)