什么时候用 SQL 数据源
订单、用户、账单这类业务数据往往就躺在关系库里,不值得为它们再同步一份到时序数据库。Grafana 内置 MySQL 与 PostgreSQL 数据源插件(同族的还有 MSSQL、SQLite、Oracle 等),支持直接写 SQL,也提供可视化查询构建器(Query builder)给不熟悉 SQL 的同事用。
连接配置
- 打开 Connections → Data sources → Add data source,选择 PostgreSQL 或 MySQL。
- Host 填
主机:端口,如localhost:5432、localhost:3306;MySQL 与 PostgreSQL 也都支持填 Unix socket 路径。 - 填 Database、User、Password;PostgreSQL 可按需选择 SSL 模式并配置证书。
- 建议顺手设置 Row limit(返回行数上限),防止失控查询拖垮数据库。
- 点击 Save & test。
宏速查
Grafana 在执行前把「宏」展开成 SQL 片段,这是仪表盘时间范围、刷新粒度与查询联动的关键:
| 宏 | 展开为 | 典型用法 |
|---|---|---|
$__timeFilter(col) |
col BETWEEN '起' AND '止' |
WHERE 里跟随仪表盘时间范围 |
$__timeFrom() / $__timeTo() |
时间范围的起止值 | 自定义边界条件 |
$__timeGroup(col, '5m') |
按 5 分钟做时间分桶 | 把行数据聚成时间序列 |
$__timeGroupAlias(col, $__interval) |
分桶并输出 AS time |
时间序列面板的第一列 |
$__interval / $__interval_ms |
当前步长(秒/毫秒) | 分桶粒度随时间范围自适应 |
$__unixEpochFilter(col) |
针对 Unix 秒级时间戳列的过滤 | 表里没有 TIMESTAMP 类型时 |
MySQL 与 PostgreSQL 的宏同名但展开语法略有差异,个别参数(如分桶间隔的引号写法)以查询报错提示为准。
示例查询
一个标准的「按时间桶统计订单状态」时间序列查询(PostgreSQL 写法,MySQL 基本一致):
SELECT
$__timeGroupAlias(created_at, $__interval),
status AS metric,
count(*) AS value
FROM orders
WHERE $__timeFilter(created_at)
GROUP BY 1, 2
ORDER BY 1;
要点:第一列必须是时间类型,第二、三列构成 metric/value 的序列结构,Grafana 的时间序列面板才能正确画线。
安全:给 Grafana 一个只读账号
Grafana 只需要查询,绝不要用应用的写账号。以 PostgreSQL 为例:
CREATE ROLE grafana_ro LOGIN PASSWORD 'change-me';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO grafana_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO grafana_ro;
最后一行让未来新建的表自动对只读账号可见。敏感列若必须展示,优先在数据库侧建只暴露脱敏列的视图,再让 Grafana 读视图。
注意: 在 SQL 里拼接仪表盘变量有注入风险,务必使用 Grafana 提供的宏或变量格式化选项,别手写
'${var}'直连字符串。
常见坑
- 查询结果只出表格不出曲线:第一列不是时间类型,或面板没按时间序列格式组织——检查
GROUP BY分桶与列别名。 - 大表查询慢:先确认
WHERE里时间列有索引,再用$__interval放宽分桶粒度,最后才考虑加长超时。 - 连接失败但数据库命令行正常:多半是 Host 写成了
http://前缀(SQL 数据源不需要协议头)或 Grafana 所在网络到数据库的端口不通。
下一步
- 数据源的通用管理概念,见数据源概念与管理。
- 查询里用到的模板变量,见模板变量。
- 另一种时序选择,见InfluxDB 时序数据源。