# 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 连接,后续查询才会记录;仅预编译、发送长参数、释放语句、被拦截的请求和其他管理命令不记录查询返回行。