如何永久修复MySQL自动启用ONLY_FULL_GROUP_BY模式的问题
永久修复sql_mode自动开启ONLY_FULL_GROUP_BY问题方案
SET GLOBAL 命令修改的是MySQL内存中的运行时参数,不会写入持久化配置,一旦MySQL服务重启、高权限账号执行配置重置、云平台/运维面板的定时参数同步任务触发,参数就会恢复默认值,这是故障定期复发的核心原因。
步骤1:持久化修改sql_mode配置
根据你的部署场景选择对应操作:
- 云RDS部署场景
不要直接修改服务器上的配置文件(云平台会自动覆盖本地修改),直接登录对应云厂商的RDS管理控制台,找到参数配置页面,搜索sql_mode参数,删除值中的ONLY_FULL_GROUP_BY项,保存后选择应用到实例,等待参数同步完成即可,配置会被云平台持久化保存。 - 自建MySQL部署场景
找到MySQL配置文件,常见路径如下:- Linux系统:
/etc/my.cnf、/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf - Windows系统:MySQL安装目录下的
my.ini
打开配置文件定位到[mysqld]段落,新增或修改sql_mode配置,参考兼容旧项目的常用配置(保留其他必要校验规则,不要留空避免数据一致性问题):
保存文件后重启MySQL服务,根据系统初始化方式选择重启命令:[mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION- Systemd管理的Linux系统:
systemctl restart mysqld或systemctl restart mysql - Windows系统:执行
net stop mysql && net start mysql,或在服务管理器中重启MySQL服务
- Linux系统:
步骤2:排查定期重置的触发源
如果完成上述配置后故障依然定期复发,逐一排查以下常见触发点:
- 服务器上是否配置了自动备份、自动初始化数据库的定时任务,任务执行时会重置MySQL参数
- 服务器是否安装了宝塔、phpMyAdmin等运维管理面板,面板是否开启了自动优化数据库配置的定时规则,会定期把sql_mode改回默认值
- 检查项目代码、数据库连接中间件配置,是否存在新建连接时主动执行
SET SESSION sql_mode的逻辑,部分框架配置不当时会在连接初始化阶段主动设置session级别的sql_mode,覆盖全局配置
步骤3:验证配置有效性
配置完成后执行以下两条SQL验证参数:
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
确认返回结果中不包含ONLY_FULL_GROUP_BY后,观察一个故障周期,确认没有复现即为修复完成。
补充说明:移除
ONLY_FULL_GROUP_BY只是兼容旧项目的过渡方案,该模式是SQL标准要求的校验规则,长期建议重构项目中不符合GROUP BY语法规范的SQL语句,避免后续版本升级出现兼容问题。
内容的提问来源于stack exchange,提问作者Nitiphone Xayaseng
相关产品推荐
相关产品推荐

