繁体   English   中英

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

[英]How to make sql-mode=“NO_ENGINE_SUBSTITUTION” permanent in MySQL my.cnf

更新已于 15 年 1 月 18 日修复

在我们最近更新到 MySQL 5.6.27(来自 Ubuntu 存储库)之后,这个选项现在可以工作了。 所以这似乎是以前版本的 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';`

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

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

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

测试的逻辑结论

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

只是为了将我的配置添加到组合中,我使用的是 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/ 加载,但它们是空白的。

这似乎对我有用。

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

来自MySQL 认证学习指南

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

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

PS:你需要引号,IIRC。 现在你已经尝试了它没有引号,我很确定,你正在编辑错误的文件,因为在选项文件中没有错误时,MySQL不会启动。

PPS:再次查看我的配置文件,它在那里

[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"

它正在工作。

它应该是:

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

代替

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION"

然后重启mysqld服务。

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

并粘贴

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

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

进入:

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

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

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

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

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

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

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

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

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

在这两个文件中,您必须添加:

[mysqld]
...
sql_mode=NO_ENGINE_SUBSTITUTION

至少,这适用于 5.6.24-2+deb.sury.org~precise+2

对我来说, 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 测试。

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

我想这些东西对于任何其他基于 mysql 的解决方案都是一样的。

我正在运行 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 除了让我发疯之外根本没有任何影响。

这也让我发疯,直到我意识到关键所在的段落是 [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"

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM