Laravel通过ProxySQL连接MySQL8时报NO_AUTO_CREATE_USER错误求助
解决Laravel通过ProxySQL连接MySQL8时报错1231: Variable 'sql_mode' can't be set to 'NO_AUTO_CREATE_USER'
问题根源
MySQL 8.0 已移除了 NO_AUTO_CREATE_USER 这个sql_mode参数,而ProxySQL可能在会话初始化阶段,自动为Laravel的连接设置了包含该参数的sql_mode,导致MySQL拒绝执行并报错。直接连接MySQL8或Node应用通过ProxySQL连接没问题,是因为前者不会触发ProxySQL的额外变量注入,后者的驱动未触发ProxySQL的会话初始化逻辑。
解决步骤
1. 修正ProxySQL全局sql_mode设置
登录ProxySQL的管理终端(默认端口6032),执行以下命令:
-- 设置符合MySQL8要求的sql_mode,移除NO_AUTO_CREATE_USER SET mysql-global_variables.sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- 保存配置到磁盘 SAVE MYSQL VARIABLES TO DISK; -- 加载生效 LOAD MYSQL VARIABLES TO RUNTIME;
2. 检查并修正用户级sql_mode配置
如果ProxySQL为Laravel使用的数据库用户单独配置了sql_mode,需要单独更新:
-- 查看目标用户的配置 SELECT username, variables FROM mysql_users WHERE username='your_laravel_db_user'; -- 如果variables字段包含NO_AUTO_CREATE_USER,执行更新 UPDATE mysql_users SET variables='sql_mode=''ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION''' WHERE username='your_laravel_db_user'; -- 保存并加载用户配置 SAVE MYSQL USERS TO DISK; LOAD MYSQL USERS TO RUNTIME;
3. 排查ProxySQL查询规则中的强制sql_mode注入
检查是否有查询规则在连接时自动注入包含NO_AUTO_CREATE_USER的sql_mode:
-- 列出所有查询规则 SELECT rule_id, active, match_pattern, replace_pattern FROM mysql_query_rules; -- 如果发现有规则注入SET sql_mode=...包含目标参数,删除或修改该规则 DELETE FROM mysql_query_rules WHERE rule_id=XX; -- XX为对应规则ID -- 保存并加载规则配置 SAVE MYSQL QUERY RULES TO DISK; LOAD MYSQL QUERY RULES TO RUNTIME;
验证
修改完成后,重启Laravel应用或刷新数据库连接,测试是否还会出现该报错。
内容的提问来源于stack exchange,提问作者Mujtaba Tarar
相关产品推荐
相关产品推荐

