大数据

Doris 诊断工具

Doris Manager 日志

Doris Manager 的日志模块提供了慢 SQL 筛选功能。用户可以通过选择特定 FE 节点上的 fe.audit.log 来查看慢 SQL。只需在搜索框中输入“slow_query”,即可在页面上展示当前系统的历史慢 SQL 信息,如下图所示:

Audit Log

当前 Doris FE 提供了四种类型的 Audit Log,包括 slow_queryqueryload 和 stream_load。Audit Log 除了在安装部署 Manager 服务的集群上通过日志页面访问获取之外,也可以直接访问 FE 所在节点的 fe/log/fe.audit.log 文件获取信息。

通过直查 fe.audit.log 中的 slow_query 标签,可以快速筛选出执行缓慢的查询 SQL,如下所示:

通过 fe.audit.log 获取的慢 SQL,使用者可以方便地获取执行时间、扫描行数、返回行数、SQL 语句等详细信息,为进一步重现和定位性能问题奠定了基础。

audit_log 系统表

Doris 2.1 以后的版本在__internal_schema 数据库下提供了 audit_log 系统表,供用户查看 SQL 运行的情况。使用前需要打开全局配置 set global enable_audit_plugin=true;(此开关默认关闭)

mysql> use __internal_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------------+
| Tables_in___internal_schema |
+-----------------------------+
| audit_log                   |
| column_statistics           |
| histogram_statistics        |
| partition_statistics        |
+-----------------------------+
4 rows in set (0.00 sec)

mysql> desc audit_log;
+-------------------+--------------+------+-------+---------+-------+
| Field             | Type         | Null | Key   | Default | Extra |
+-------------------+--------------+------+-------+---------+-------+
| query_id          | varchar(48)  | Yes  | true  | NULL    |       |
| time              | datetime     | Yes  | true  | NULL    |       |
| client_ip         | varchar(128) | Yes  | true  | NULL    |       |
| user              | varchar(128) | Yes  | false | NULL    | NONE  |
| catalog           | varchar(128) | Yes  | false | NULL    | NONE  |
| db                | varchar(128) | Yes  | false | NULL    | NONE  |
| state             | varchar(128) | Yes  | false | NULL    | NONE  |
| error_code        | int          | Yes  | false | NULL    | NONE  |
| error_message     | text         | Yes  | false | NULL    | NONE  |
| query_time        | bigint       | Yes  | false | NULL    | NONE  |
| scan_bytes        | bigint       | Yes  | false | NULL    | NONE  |
| scan_rows         | bigint       | Yes  | false | NULL    | NONE  |
| return_rows       | bigint       | Yes  | false | NULL    | NONE  |
| stmt_id           | bigint       | Yes  | false | NULL    | NONE  |
| is_query          | tinyint      | Yes  | false | NULL    | NONE  |
| frontend_ip       | varchar(128) | Yes  | false | NULL    | NONE  |
| cpu_time_ms       | bigint       | Yes  | false | NULL    | NONE  |
| sql_hash          | varchar(128) | Yes  | false | NULL    | NONE  |
| sql_digest        | varchar(128) | Yes  | false | NULL    | NONE  |
| peak_memory_bytes | bigint       | Yes  | false | NULL    | NONE  |
| stmt              | text         | Yes  | false | NULL    | NONE  |
+-------------------+--------------+------+-------+---------+-------+

通过 audit_log 内部表,用户可以查询详细的 SQL 执行信息,进行如慢查询筛选等详细统计分析。

总结

Doris Manager 日志,audit log 以及 audit_log 系统表等工具,可以提供慢 SQL 自动或手动筛选过滤,以及细粒度 SQL 执行信息统计分析等能力。这些工具为系统性的性能诊断和调优提供了强大支撑。

查看 audit_log 内部表发现有很有rollback操作数据原因

根本原因

  1. 连接池配置问题
    • 您的 PooledDB 配置中设置了 autocommit=False(默认值)
    • 但您的 select_one 和 select_all 方法只是简单查询,没有显式提交或回滚
  2. 连接关闭行为
    • 当 Python 代码中 with 块结束时,连接会被关闭
    • 由于 autocommit=False 且没有显式提交,Doris 会在连接关闭时自动回滚事务

为什么当前行为无害

尽管日志中有很多 ROLLBACK,但实际上:

  1. 这些只是 SELECT 查询,没有修改数据
  2. ROLLBACK 不会对查询结果产生影响
  3. 不会造成数据一致性问题

性能考虑

过多的 ROLLBACK 记录:

  1. 会增加审计日志量
  2. 可能轻微影响连接关闭速度
  3. 不会影响查询性能本身

最佳方案(推荐):为只读查询启用自动提交

def _create_pool(self, config: Dict) -> PooledDB:
    return PooledDB(
        # 其他参数...
        autocommit=True,  # 为所有操作启用自动提交
    )