如何避免MySQL重启后全局系统变量重置,永久禁用ONLY_FULL_GROUP_BY
永久禁用MySQL ONLY_FULL_GROUP_BY(重启生效方案)
前置操作
执行SQL查询获取当前完整的sql_mode配置,避免修改时丢失其他默认规则:
SELECT @@sql_mode;
复制查询结果,删除其中的ONLY_FULL_GROUP_BY字符串,保留剩余全部内容备用。
修改配置文件
- 找到MySQL服务端加载的配置文件,不同系统默认路径如下:
- Linux系统:
/etc/my.cnf、/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf - Windows系统:MySQL安装目录下的
my.ini,或C:\ProgramData\MySQL\对应版本目录\my.ini
不确定加载路径可执行命令查看优先级:
mysql --help | grep "Default options" -A 1,输出列表中越靠前的配置文件优先级越高
- 打开配置文件,找到
[mysqld]段落(必须是服务端配置段落,写到其他段落不会生效),添加或修改sql_mode配置项:
[mysqld] # 等号后面替换为你删除ONLY_FULL_GROUP_BY之后的完整配置 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
- 保存配置文件并退出。
重启服务并验证
- Linux重启命令:
systemctl restart mysqld或service mysql restart - Windows重启操作:打开服务管理器找到MySQL对应服务右键重启,或执行命令
net stop mysql && net start mysql(服务名带版本的需替换为实际名称)
重启完成后再次执行SQL查询验证:
SELECT @@sql_mode;
返回结果中无ONLY_FULL_GROUP_BY即为配置生效。
常见失效排查
- 配置写到了
[mysql]、[client]等客户端配置段落,未写到[mysqld]服务端段落 - 存在更高优先级的配置文件覆盖了你的修改,按上述查看配置加载优先级的命令确认使用的配置文件
- 配置文件中存在重复的sql_mode配置项,MySQL会以最后一次出现的配置为准,需删除多余的重复项
内容的提问来源于stack exchange,提问作者david marook
相关产品推荐
相关产品推荐

