如何在mysql 8的my.cnf中设置sql\u模式?

slhcrj9b  于 2021-06-17  发布在  Mysql
关注(0)|答案(8)|浏览(924)

我正在运行mysql 8.0.11社区版。我需要在my.cnf中将sql模式设置为只排除\u full\u group\u 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\u 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\u mode'或'sql mode'转换为'sql\u mode',然后拒绝!
问题是如何解决这个问题?

qlfbtfca

qlfbtfca1#

假设“restart safe”只是永久的意思,语法是:

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”选项,或者 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"
gab6jxml

gab6jxml2#

我只是发现这个选项与my.cnf中的“no\u auto\u create\u user”不兼容。这可能与某些设置冲突。
下面这行代码在mysql 8中适用于我。
[mysqld]sql mode=“严格的\u事务\u表,没有\u zero \u in \u date,没有\u zero \u date,错误\u for \u division \u by \u zero,没有\u引擎\u替换”

ac1kyiln

ac1kyiln3#

编辑 my.cnf 没有使用mysql 8。所以我想出了一个解决办法。我在ubuntu20.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"
xwmevbvl

xwmevbvl4#

在ubuntu/debian的最新版本中,我正在修改这个文件 /lib/systemd/system/mysql.service 使用:

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

之后,只执行:

systemctl daemon-reload
systemctl restart mysql

更改为 *.cnf 文件不起任何作用。

vjhs03f7

vjhs03f75#

第一步。检查sql模式:

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

第二步。在/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

第三步。重新启动mysql:

sudo service mysql restart

第四步。确认更改:

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

MySQL8.0中没有删除自动创建用户sql模式,请查看参考手册中sql模式的完整列表。

qoefvg9y

qoefvg9y6#

我还没有找到解决这个问题的方法使用我的.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

欢迎更好的解决方案。

00jrzges

00jrzges7#

sql模式 NO_AUTO_CREATE_USER 在MySQL8.0中被删除,不再被识别。
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-简而言之,反对者说:
以下与帐户管理相关的功能将被删除:
使用 GRANT 创建用户。相反,使用 CREATE USER . 遵循这一做法 NO_AUTO_CREATE_USER sql模式对于 GRANT 语句,所以它也被删除。
将sql模式更改为“strict\u trans\u tables,no\u zero\u in\u date,no\u zero\u date,error\u for\u division\u by\u zero,no\u engine\u substitution”。我在我的8.0.11沙盒示例上测试了它,它成功了。
sql模式或sql\ U模式的拼写都可以。
使用引号或省略引号都可以。

yyyllmsg

yyyllmsg8#

至于macos catalina,我使用mysqlworkbench在“server/status and../=>system variables and search sql\u mode”中关闭“persist”复选框,如果不执行该操作,它将忽略my.cnf设置/
那是我的:[mysqld]sql\u mode=“严格的\u事务表,没有\u zero\u在\u日期,没有\u zero\u日期,错误\u除以\u zero,没有\u引擎\u替换”

相关问题