Files
LinkPort/docs/mysql-result-audit.md

4.1 KiB

MySQL 查询结果审计

MySQL 网关为 COM_QUERY 普通查询和 COM_STMT_EXECUTE 预编译执行记录返回结果,并关联到原命令审计 ID。SQL 命令记录仍沿用 16 KiB 文本上限及截断标记;预编译执行关联 SQL 模板和 statement ID,不展开输入参数。返回结果不受该 SQL 文本上限影响。

记录内容

  • 结果集:列名、列顺序、表名、MySQL 类型、字符集/排序规则 ID、列标志,以及返回的每一行数据。空结果集也会保留列定义。
  • 非结果集响应:影响行数、新增 ID、警告数量、服务器状态及消息。
  • 数据库错误:错误码、SQLSTATE、错误消息;中途返回错误时保留之前已经采集的行。
  • 多个结果:网关已支持的查询批次及返回流分别按结果序号保存。该功能不扩大现有只读策略、批次或服务端游标的支持范围。
  • 性能摘要:记录网关观察到的完整响应耗时,并累计 OK/EOF 包中的 SERVER_STATUS_NO_INDEX_USED 与 SERVER_STATUS_NO_GOOD_INDEX_USED 状态位。

数值使用字符串保存,避免 JavaScript 大整数和小数精度丢失。SQL NULL 使用 JSON null,空字符串仍为空字符串。二进制、非 UTF-8 字符集和无法用 UTF-8 表示的值保存为 {"base64":"..."},保留字节。无法解码的返回包保存完整 Base64 载荷并标记解码不完整,不把猜测的数据当成正常结果。

只采集经过网关返回的数据,不重新执行查询。查询结果先写入加密审计库,再向客户端转发;写入失败会中止连接。大结果会增加存储占用与转发开销。异常断开标记为采集中断;进程异常退出时可能保留“尚未收到完整结果”,不视为完整成功。

执行性能与扫描风险

执行时间从网关接受并记录命令后开始,到完整响应、数据库错误或连接中断时结束,包含网关审计和结果转发开销。达到 3000ms 的查询在命令列表与结果详情中显示红色“慢查询”。

MySQL 返回 SERVER_STATUS_NO_INDEX_USED 时显示红色“全表扫描风险”,返回 SERVER_STATUS_NO_GOOD_INDEX_USED 时显示黄色“索引效果不佳”。状态位是服务端针对该语句给出的风险信号,不等同于对执行计划的完整证明,小表扫描等情况也可能出现,因此界面不显示为确定的“全表扫描”。

网关不会自动执行 EXPLAIN:额外查询会增加目标负载、可能要求额外权限,并可能改变事务和锁行为。普通查询响应也不包含实际索引名称;需要确认使用了哪个索引时,应由有权限的操作者对相同 SQL 和参数单独执行 EXPLAIN 或 EXPLAIN ANALYZE。

查看与下载

打开「命令审计 → 查看」,在“查询返回结果”中查看数据、切换结果集并加载更多。宽表支持横向滚动,工具栏随窗口宽度换行;单页显示 50 行、20 列,可分别翻页。页面预览最多约 8 MiB,数据库中的结果不按该大小截断。

“下载完整结果”导出 NDJSON,每行是一个独立 JSON 事件:begin、column、metadata、row、end、ok、error 或 raw。事件的 index 对应结果序号,行的 values 按列顺序排列。下载包含开始下载时已保存的内容;运行中的查询可稍后再次下载。CSV 命令导出仍只导出命令记录,结果单独下载。

结果和状态加密保存在原命令所在的 UTC 日期审计库中,随命令的 7 天保留期清理;要求个人会话或 audit API Token。配置 WebDAV 备份不包含审计结果,完整审计备份需停服后复制整个数据目录。

旧记录无法补录查询结果或性能指标;已有结果摘要但缺少新字段的历史记录会在详情显示指标不可用,没有结果摘要的记录仍显示未采集结果。新增字段保存在既有加密结果摘要 JSON 中,不修改 SQLite 表结构,也不需要迁移。部署新版后重新建立 MySQL 连接,后续查询才会记录;仅预编译、发送长参数、释放语句、被拦截的请求和其他管理命令不记录查询返回行。