创建触发器记录information_schema.PROCESSLIST变更遇权限问题求助
问题分析与解决办法
为啥你的触发器方案行不通
information_schema是MySQL的系统元数据库,MySQL本身就禁止用户在这个库上创建触发器、存储过程这类对象,哪怕你用root用户也不行,这不是单纯的权限不够,是系统机制的限制,所以你那套代码从根上就跑不通。
针对你的需求,给几个可行方案
你要的是记录用户(尤其是通过phpMyAdmin)的手动操作,结合AWS RDS MySQL的环境,推荐这几种办法:
方案1:开通用查询日志(快速上手)
这个是最快的方式,通用查询日志会把所有发给MySQL的SQL都记下来,包括phpMyAdmin的手动操作。
- 在AWS RDS上这么弄:
- 找到你实例对应的参数组,把
general_log设为1,general_log_file指定日志路径(RDS会自动管理存储) - 要是这个参数是动态的就不用重启实例,静态参数的话得重启生效
- 找到你实例对应的参数组,把
- 注意:日志会记录所有SQL,包括你PHP和Node应用的自动操作,之后得过滤出phpMyAdmin的请求——比如看
PROCESSLIST里的host或者user字段,比如phpMyAdmin用的数据库用户、或者它的服务器IP地址 - 可以写个脚本定期把符合条件的操作导入你的
history_changes表,示例SQL:INSERT INTO myDatabase.history_changes (host, db, query) SELECT host, db, info FROM information_schema.PROCESSLIST WHERE user = 'phpmyadmin专用用户' OR host LIKE 'phpmyadmin服务器IP%';
方案2:用MySQL审计插件(生产环境首选)
AWS RDS MySQL支持官方的audit_log插件,能精细控制要记录的用户和操作类型,适合生产环境。
- 设置步骤:
- 在参数组里配置
plugin-load-add = audit_log.so,还可以设audit_log_format = JSON方便后续解析 - 配置
audit_log_include_users指定要审计的用户——就是phpMyAdmin连接数据库用的那个用户 - 重启实例生效
- 在参数组里配置
- 审计日志存在RDS的日志系统里,你可以通过AWS控制台下载,或者写脚本同步到你的历史表。
方案3:让phpMyAdmin自己记操作日志
phpMyAdmin本身就有记录用户操作的功能,开启很简单:
- 修改phpMyAdmin的
config.inc.php配置文件,添加这两行:$cfg['QueryHistoryDB'] = true; $cfg['QueryHistoryMax'] = 1000; // 最多存1000条记录,按需调整 - 之后phpMyAdmin会把用户执行的SQL存在自己的数据库表里,你定期把这些数据同步到
history_changes就行。
方案4:应用+数据库双层控制(长期优化)
- 你的PHP和Node应用,在代码层加操作日志,把应用发起的所有SQL都记下来;
- 给phpMyAdmin单独建一个数据库用户,只授予必要的权限(比如只能修改特定库表),然后用审计插件或者通用日志专门记录这个用户的操作;
- 这样就能把应用自动操作和用户手动操作区分开,排查问题更方便。
总结
别再打information_schema的主意了,MySQL根本不让在这上面建触发器。结合你的AWS RDS环境,优先用审计插件或者通用日志,再配合用户过滤,就能实现你要的手动操作记录需求。
内容的提问来源于stack exchange,提问作者Vishal Dubey
相关产品推荐
相关产品推荐

