一聚教程网:一个值得你收藏的教程网站

热门教程

Grafana 如何使用 SQL 查询方式连接数据源

时间:2026-08-27 08:12:49 编辑:袖梨 来源:一聚教程网

Grafana 通过配置支持 SQL 的数据源(如 MySQL、PostgreSQL 等)直接执行 SQL 查询,无需中间同步组件或时序数据限制;关键前提是数据源必须原生支持 SQL。

Grafana 使用 SQL 查询方式连接数据源,本质是通过配置支持 SQL 的数据源(如 MySQL、PostgreSQL、SQL Server、Oracle 等),然后在面板查询中直接编写标准或方言适配的 SQL 语句获取数据。它不依赖中间同步组件,也不要求数据必须是时序型——只要数据库能响应 SQL,Grafana 就能查、能展示。

关键前提:数据源本身要支持原生 SQL 查询

Grafana 最新插件中,MySQL、PostgreSQL、Microsoft SQL Server、Oracle、TDengine、ClickHouse 等都内置了 SQL 查询能力;而 Prometheus、InfluxDB 等则使用各自专属查询语言(PromQL / Flux),不能写 SQL。


配置支持 SQL 的数据源

  1. 进入 Grafana → 左侧菜单 Configuration → Data SourcesAdd data source
  2. 搜索并选择对应数据库类型(例如 “MySQL”)
  3. 填写连接参数:
    1. Host(如 127.0.0.1:3306
    2. Database(目标库名)
    3. User / Password(建议用最小权限只读账号)
    4. 其他可选:SSL 模式、时区、连接池参数(如 maxOpen,但注意 PostgreSQL 场景下 Grafana 实际不复用连接)
  4. 点击 Save & Test,绿色提示即表示连通成功

⚠️ 生产环境务必避免使用 root 或高权限账号;应单独创建 grafana_ro 类只读用户,并 GRANT SELECT ON your_db.your_table TO 'grafana_ro'@'%'


在面板中写 SQL 查询

  1. 新建 Dashboard → Add new panel → Query 标签页
  2. 选择刚配置好的 SQL 类型数据源(如 MySQL)
  3. 在查询编辑器中输入 SQL,例如:
SELECT DATE(create_time) AS day,COUNT(*) AS total_orders,ROUND(AVG(amount), 2) AS avg_amountFROM orders WHERE create_time >= $__timeFilter(create_time)GROUP BY dayORDER BY day
  1. $__timeFilter(create_time) 是 Grafana 内置宏,会自动替换成当前时间范围筛选条件(如 create_time BETWEEN '2026-08-12 00:00:00' AND '2026-08-13 00:00:00'),无需手动拼接
  2. 其他常用宏:$__timeGroup(time_col, '1h')(按小时分组)、$__timeEpoch(time_col)(转毫秒时间戳)、$__timeFrom() / $__timeTo()(起止时间)

✅ 查询结果列名将直接作为表格字段或图表坐标轴标签;时间列需显式别名为 time 或用 ($__time) 宏标记,才能被时序图识别


选择合适的可视化类型

  1. Table(表格):适合展示明细、统计汇总、状态列表(如订单状态分布、错误码 TOP10)
  2. Time series(折线/柱状图):要求至少一列是时间类型(且已用 time 相关宏处理),另一列是数值
  3. Stat / Pie chart / Bar gauge:适合聚合指标(如总订单数、成功率百分比、各状态占比)

? 注意:SQL 查询返回的列数和类型决定可视化是否可用。例如折线图需要 time + value 两列;饼图需要 name + value 两列;表格则无此限制


进阶技巧提升实用性

  1. 使用模板变量动态切换条件

    例如定义变量 region,SQL 中写 WHERE region = '$region',即可下拉切换地区查看不同数据

  2. 多表 JOIN 查询完全支持

    SELECT u.name, COUNT(o.id) FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id

  3. 支持子查询、窗口函数(取决于底层数据库能力)

    如 PostgreSQL 可用 ROW_NUMBER() OVER (PARTITION BY ...),MySQL 8.0+ 同样支持

  4. 开启查询缓存(v9.1+)

    在数据源设置中启用 Cache mode: Enabled,对相同时间范围+变量组合的查询自动复用结果,减轻 DB 压力

不复杂但容易忽略

热门栏目