MariaDB 10.2.27中init_connect对单个用户不生效问题求助
MariaDB init_connect对特定用户不生效排查与解决方案
核心原因
你当前的存储过程和init_connect配置本身没有语法问题,对普通用户生效说明配置逻辑正确。异常只针对特定用户的核心原因是:MariaDB/MySQL内置机制会跳过SUPER权限用户的init_connect逻辑执行,目的是避免错误的init_connect配置导致管理员完全无法登录数据库。你提到的用户大概率被误授予了SUPER权限,而非仅持有REPLICATION CLIENT权限。
排查步骤
- 核查用户实际权限,执行如下命令,检查返回结果是否包含SUPER权限:
SHOW GRANTS FOR '异常用户名'@'该用户登录的主机地址';
- 若确认无SUPER权限,临时开启通用日志抓连接流程,确认是否调用存储过程、是否有执行报错:
-- 开启通用日志,注意替换日志路径为你服务器的合法路径 SET GLOBAL general_log = 'ON'; SET GLOBAL general_log_file = '/data/mysql/general_conn.log';
测试完成后及时关闭日志避免占用磁盘:SET GLOBAL general_log = 'OFF';
- 检查
test.tracking表的主键规则,你的存储过程使用了ON DUPLICATE KEY UPDATE逻辑,若主键仅设置了user字段,同用户多主机登录会更新原有记录,不会生成新行,可排查是否存在被覆盖的情况。
修复方案
- 若确认用户持有多余的SUPER权限,直接回收即可:
REVOKE SUPER ON *.* FROM '异常用户名'@'该用户登录的主机地址'; FLUSH PRIVILEGES;
回收后init_connect会对该用户正常生效,连接记录会写入test.tracking表。
- 若该用户业务必须保留SUPER权限,则无法通过
init_connect实现审计,可改用MariaDB内置审计插件,开启连接日志功能,该方式不受用户权限限制,可覆盖所有用户的连接行为审计。 - 若排查为存储过程执行报错,确认存储过程DEFINER用户对
test.tracking表有INSERT、UPDATE权限即可,由于你配置了SQL SECURITY DEFINER,无需给登录用户单独授权表权限。
内容的提问来源于stack exchange,提问作者Prabhakar
相关产品推荐
相关产品推荐

