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

时间:2015-03-04 08:03:24

标签: mysql

更新2015年1月18日

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

原始问题

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

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

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';`

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

所以我试图通过编辑/etc/mysql/my.cnf(在我运行Ubuntu 12.04.5 LTS的标准服务器上)并添加documentation所说的应添加的配置设置来制作永久物。 :

[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION"

用于测试的替代语法

仅出于测试目的,我还尝试了以下格式(重启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"

没有任何作用。重启后,此设置丢失,我必须再次从mysql终端手动运行命令,以便再次保存。

替代地点

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

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

mysqld --help --verbose

我看到一行内容为:

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引用的唯一文件,因此不会覆盖此设置。

测试的逻辑结论

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

13 个答案:

答案 0 :(得分:34)

只是为了添加我的配置,我正在使用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/加载,但它们都是空白的。

这似乎对我有用。

答案 1 :(得分:9)

应该是:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

而不是

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"

然后重启mysqld服务。

答案 2 :(得分:8)

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

来自MySQL Certification Study Guide

  

搜索顺序包括两个常规选项文件$MYSQL_HOME/my.cnf和   MYSQL_HOME。第二个文件仅在MYSQL_HOME时使用   环境变量已设置。通常,您将它发送到MySQL   安装目录。 (mysqld_safe脚本尝试设置   ~/.my.cnf如果在启动服务器之前未设置它。)   选项文件搜索顺序还包括mysql(即主页   目录)。这不是服务器特别合适的位置   选项。 (通常,您以root--user=mysql方式调用服务器   使用sql-mode选项。由用户读取的特定用户文件   服务器将取决于您从哪个登录帐户调用它,   可能导致使用不一致的选项集。)

另一种可能性是,您的,选项会在同一文件中被进一步覆盖。多个选项必须在同一行中由[mysqld] sql_mode = "NO_ENGINE_SUBSTITUTION" 分隔。

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

P.P.S。:再看一下我的配置文件吧,那就是

{{1}}

它正在工作。

答案 3 :(得分:5)

在ubuntu 16.04上,对我来说很好。 路径:/etc/mysql/mysql.cnf

并粘贴

[mysqld]
#
# * Basic Settings
#
sql_mode = "NO_ENGINE_SUBSTITUTION"

答案 4 :(得分:3)

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

输入:

mysqld --verbose --help | grep -A 1 "Default options"

[警告]全球可写配置文件' /etc/mysql/my.cnf'被忽略了。

因此,请尝试执行以下操作,然后重新启动服务器

chmod 644 '/etc/mysql/my.cnf'

它将赋予mysql访问权限以读取和写入文件。

答案 5 :(得分:2)

Linux Mint 18 上,设置了sql-mode选项的默认配置文件位于此处:

/usr/my.cnf

相关的是:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

所以你可以在那里设置。

如果不确定哪个配置文件有这样的选项你可以搜索它:

$ sudo find / -iname "*my.cnf*"

获取一份清单:

/var/lib/dpkg/alternatives/my.cnf
/usr/my.cnf
/etc/alternatives/my.cnf
/etc/mysql/my.cnf.fallback
/etc/mysql/my.cnf

答案 6 :(得分:2)

我的问题是我在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

答案 7 :(得分:1)

对我来说,sql-mode的两个键都很有用。我是否使用过

# dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION

# underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
my.ini文件中,

没有任何区别,据我测试,两者都被接受。

真正起作用的是my.ini文件末尾的缺少换行符

所以每个人对此有疑问或与my.ini / my.cnf类似的问题:请确保文件末尾有空白行!

使用MySQL 5.7.27测试。

答案 8 :(得分:0)

解决方案非常简单...搜索了一段时间,结果证明你只需要编辑2个配置文件:

  • /usr/my.cnf
  • /etc/mysql/my.cnf

你必须添加两个文件:

[mysqld] ... sql_mode=NO_ENGINE_SUBSTITUTION

至少,这是什么适用于5.6.24-2 + deb.sury.org~sensision + 2

答案 9 :(得分:0)

如果您使用的是mariadb,则必须修改/etc/mysql/conf.d /./中的mariadb.cnf文件。

我认为其他任何基于my-sql的解决方案都是相同的。

答案 10 :(得分:0)

我正在运行WHM 10.2.15-MariaDB。要永久禁用严格模式,请首先找出我们的安装更喜欢的配置文件。为此,我们需要二进制文件的位置:

$ which mysqld
/usr/sbin/mysqld

然后,我们使用此路径执行查找:

$ /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

我们可以看到第一个喜欢的配置文件是etc文件夹的根目录,但是隐藏了第二个.cnf文件 - 〜/ .my.cnf。将以下内容添加到〜/ .my.cnf文件中为我永久禁用严格模式(需要在mysqld部分内):

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

我发现在/etc/my.cnf上添加这行除了让我发疯外没有任何效果。

答案 11 :(得分:0)

[已修复] 服务器版本:10.1.38-MariaDB-mariadb.org二进制分发版

转到:C:\ xampp \ mysql \ bin 在记事本中打开my.ini并找到[mysqld](第27行),然后在此行(第28行)之后键入:skip-grant-tables

保存文件,然后重新加载phpmyadmin页面。它对我有用。

答案 12 :(得分:0)

这也让我发疯,直到我意识到关键所在的段落必须是[mysqld]而不是[mysql]

因此,对于10.3.22-MariaDB-1ubuntu1,我的解决方案是在/etc/mysql/conf.d/mysql.cnf

[mysqld]
sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"