如何在MySQL 8中的my.cnf中设置sql_mode?

时间:2019-01-02 14:09:27

标签: mysql mysql-8.0 sql-mode

我正在运行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-mode

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

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

8 个答案:

答案 0 :(得分:3)

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_USER SQL模式对于   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的拼写都很好。

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

答案 1 :(得分:2)

第一步,检查sql模式:

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

步骤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 中删除,请查看 full list of SQL modes 的参考手册。

答案 2 :(得分:1)

我没有使用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

欢迎使用更好的解决方案。

答案 3 :(得分:1)

假定“安全重启”仅表示永久性,语法为:

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

来自Setting the SQL Mode

  

要在服务器启动时设置SQL模式,请使用--sql-mode =“ modes”   命令行上的选项,或选项文件中的sql-mode="modes"   例如my.cnf(Unix操作系统)或my.ini(Windows)。 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"

答案 4 :(得分:1)

在最新版本的Ubuntu / Debian中,我正在使用以下命令修改文件/lib/systemd/system/mysql.service

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

之后,仅执行:

systemctl daemon-reload
systemctl restart mysql

更改*.cnf个文件无效。

Example execution

答案 5 :(得分:0)

对于MacOs Catalina,我使用MysqlWorkbench关闭“服务器/状态和../ =>系统变量并搜索sql_mode”中的“持久”复选框。 如果不执行该操作,它将忽略my.cnf设置/

是我的: [mysqld] sql_mode =“ STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION”

答案 6 :(得分:0)

使用MySQL 8无法编辑my.cnf。因此,我开发了一种解决方法。我在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"

答案 7 :(得分:-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”