phpMyAdmin 本身不记录用户执行的每条 SQL,所有查询均由后端 MySQL/MariaDB 执行,SQL 审计必须依赖数据库服务层日志:MySQL 启用 general_log,MariaDB 推荐 slow_query_log + long_query_time=0。
phpMyAdmin 没有内置 SQL 审计日志功能
直接说结论:phpmyadmin 本身不记录用户执行的每条 sql,它只是一个 web 前端,所有查询都转发给后端 mysql/mariadb 执行。想审计 sql,必须依赖数据库服务层的日志能力,而不是 phpmyadmin 配置。
开启 MySQL 的 general_log 是最直接的方案
MySQL 的 general_log 会记录所有到达服务器的语句(含连接、查询、退出等),正好覆盖 phpMyAdmin 用户操作的全部 SQL。
实操建议:
- 登录 MySQL(用
root或有SUPER权限的账号)执行:SET GLOBAL general_log = 'ON';<br>SET GLOBAL log_output = 'TABLE';
(推荐先设为'TABLE',日志写入mysql.general_log表,避免文件权限问题) - 如果要存到文件,改用:
SET GLOBAL log_output = 'FILE';<br>SET GLOBAL general_log_file = '/var/log/mysql/general.log';
注意确保 MySQL 进程对路径有写权限,且 SELinux/AppArmor 不拦截 -
general_log开启后会影响性能,尤其高并发时;仅用于临时审计,勿长期开启 - 日志表默认无索引,查最近操作可用:
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 50;
MariaDB 用户优先考虑 slow_query_log + long_query_time=0
MariaDB 10.11+ 对 slow_query_log 做了增强:设 long_query_time = 0 可记录所有查询(包括快的),比 general_log 更轻量,且支持按用户过滤(需配合 log_slow_filter = user)。
关键点:
立即学习“PHP免费学习笔记(深入)”;
- 配置文件中启用:
slow_query_log = ON<br>long_query_time = 0<br>log_output = TABLE
- 日志写入
mysql.slow_log表,字段含user_host,能区分是哪个 phpMyAdmin 用户执行的 - 相比
general_log,它不记录USE、SHOW等非查询命令,但覆盖了所有SELECT/INSERT/UPDATE/DELETE—— 这才是审计重点 - 仍需注意磁盘空间和性能,建议搭配
log_slow_rate_limit限频(如设为100表示每秒最多记 100 条)
phpMyAdmin 自身日志只能记录操作行为,不记录 SQL 内容
phpMyAdmin 的 $cfg['Servers'][$i]['verbose'] 或 ./tmp/ 下的 session 日志,只存用户登录、切换库、导出动作等元信息,不会保存实际执行的 SQL 字符串。
如果你看到某些教程提到修改 libraries/classes/Plugins/Export/ExportSql.php 或加 error_log(),那属于自行 hack,不稳定、易被升级覆盖,且无法捕获直接在 SQL 标签页粘贴执行的语句。
真正可靠的审计,永远落在数据库服务端 —— 因为只有那里才能拿到原始、未解析的完整语句,以及真实执行者(user@host),而不是 phpMyAdmin 的 HTTP 用户名。
别在 phpMyAdmin 层找 SQL 审计,它不是干这个的。把精力放在 MySQL 的 general_log 或 MariaDB 的 slow_query_log 上,配好权限、路径和轮转策略,就足够用了。


















