20

我正在运行 MySQL 8.0.11 社区版。我需要将 sql_mode 设置为在 my.cnf 中排除 ONLY_FULL_GROUP_BY 以便它可以安全重启。我尝试了以下变体:

sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

无论变量名为“sql_mode”还是“sql-mode”,它们都以相同的方式失败:

mysqld --verbose --help | grep "sql[-_]mode"
2018-06-19T15:22:51.667734Z 0 [ERROR] [MY-011071] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'
    --sql-mode=name     Syntax: sql-mode=mode[,mode[,mode...]]. See the manual
2018-06-19T15:22:51.675498Z 0 [ERROR] [MY-010119] [Server] Aborting

sql模式

似乎 mysqld 处理 my.cnf 并将 'sql_mode' 或 'sql-mode' 转换为 'sql_mode',然后它会拒绝!

问题是如何解决这个问题?

4

8 回答 8

42

SQL 模式NO_AUTO_CREATE_USER在 MySQL 8.0 中被移除,并且不再被识别。

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-deprecations说:

删除了以下与帐户管理相关的功能:

  • 用于GRANT创建用户。相反,使用CREATE USER. 遵循这种做法会使NO_AUTO_CREATE_USERSQL 模式对语句不重要 GRANT,因此也将其删除。

将您的 sql_mode 更改为“STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION”。我在我的 8.0.11 沙盒实例上对此进行了测试,它工作正常。

sql-mode 或 sql_mode 的拼写都可以。

使用引号或省略引号都可以。

于 2019-01-02T18:03:30.587 回答
7

假设“重启安全”只是意味着永久,语法是:

sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

设置 SQL 模式

要在服务器启动时设置 SQL 模式,请在命令行或sql-mode="modes"my.cnf(Unix 操作系统)或 my.ini(Windows)等选项文件中使用 --sql-mode="modes" 选项。modes 是用逗号分隔的不同模式的列表。

如果它对您不起作用,则可能是您将其放在错误的部分下。对于需要的服务器设置[mysqld],如:

[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"
于 2019-01-02T14:21:58.777 回答
4

步骤 1. 检查 sql 模式:

mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

Step 2. 在/etc/mysql/conf.d/目录下新建配置文件:

sudo nano /etc/mysql/conf.d/disable_strict_mode.cnf 

在编辑器中输入以下文本:

[mysqld]

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

步骤 3. 重启 MySQL:

sudo service mysql restart

步骤 4. 确认更改:

mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

NO_AUTO_CREATE_USER SQL 模式已在 MySQL 8.0 中删除,请查看参考手册以获取SQL 模式的完整列表

于 2020-12-21T21:17:58.840 回答
2

我还没有找到使用 my.cnf 解决问题的方法。为了安全重启mysqld,我需要避免这样做:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

我发现解决这个问题的唯一方法是设置一个环境变量:

sudo systemctl set-environment MYSQLD_OPTS="--sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sudo systemctl restart mysqld

欢迎更好的解决方案。

于 2019-01-02T14:09:27.373 回答
2

编辑my.cnf不适用于 MySQL 8。所以我开发了一个解决方法。我在 Ubuntu 20.04 中使用 MySQL 8

我创建了一个文件/etc/mysql/mysqlmode.sql

SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

接下来,我编辑/etc/mysql/my.cnf并在最后添加了这些代码行:

[mysqld]
init-file="/etc/mysql/mysqlmode.sql"
于 2020-10-03T15:01:43.063 回答
2

在最新版本的 Ubuntu/Debian 中,就我而言,我正在修改文件/lib/systemd/system/mysql.service

ExecStart=/usr/sbin/mysqld --sql-mode=NO_ENGINE_SUBSTITUTION

之后,然后只执行:

systemctl daemon-reload
systemctl restart mysql

*.cnf文件的更改什么都不做。

示例执行

于 2020-07-07T17:23:48.333 回答
-1

至于 MacOs Catalina,我使用 MysqlWorkbench 在“Server/Status and../ => System Variables and search sql_mode”中关闭“persist”复选框,如果没有该操作,它会忽略 my.cnf 设置/

那是我的:[mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

于 2020-09-29T17:36:22.823 回答
-1

我只是发现该选项与 my.cnf 中的“NO_AUTO_CREATE_USER”不兼容。这可能与某些设置冲突。

以下行在 MySQL 8 中适用于我。

[mysqld] sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

于 2020-11-30T02:23:29.660 回答