# 使用 PostgreSQL 作为 Grafana 后端数据库

> 使用 Pigsty v2.7 管理的 PostgreSQL 数据库替代 Grafana 默认的 SQLite 元数据存储。
---

Grafana 默认使用 SQLite 存储元数据。Pigsty v2.7 可以为 Grafana 置备
PostgreSQL 用户与数据库，随后再手工将 Grafana 指向该数据库。

**v2.7 范围**


`grafana_database` 与 `grafana_pgurl` 参数在 v2.7.0 中已经废弃。该版本的
[`grafana.ini.j2`](https://github.com/Vonng/pigsty/blob/v2.7.0/roles/infra/templates/grafana/grafana.ini.j2)
不会管理 PostgreSQL 后端连接串，因此重新执行 `grafana_config` 任务可能
覆盖手工修改；请将此变更纳入您自己的配置管理。


## 置备数据库

在 PGSQL 集群定义中加入用户与数据库：

```yaml
pg_users:
  - { name: dbuser_grafana, password: DBUser.Grafana, pgbouncer: true, roles: [dbrole_admin] }
pg_databases:
  - { name: grafana, owner: dbuser_grafana, revokeconn: true }
```

对于现有 `pg-meta` 集群，使用 v2.7 自带脚本创建：

```bash
bin/pgsql-user pg-meta dbuser_grafana
bin/pgsql-db   pg-meta grafana
psql postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana -c \
  'CREATE TABLE t(); DROP TABLE t;'
```

如果要新建专用集群，请在清单中定义同样的对象，然后执行：

```bash
bin/pgsql-add pg-grafana
```

这些命令分别对应
[`pgsql-user.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/pgsql-user.yml)、
[`pgsql-db.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/pgsql-db.yml) 与
[`pgsql.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/pgsql.yml)。

## 配置 Grafana

切换后端前应先备份原有 Grafana 元数据。随后修改
`/etc/grafana/grafana.ini` 的 `[database]` 段：

```ini
[database]
type = postgres
url = postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana
ssl_mode = disable
```

确认连接可用后重启 Grafana：

```bash
systemctl restart grafana-server
```

Grafana 启动时会自行执行元数据迁移。指向一个新的空数据库并不会自动
复制原 SQLite 数据库中的面板与数据源。

## 恢复面板与数据源

Pigsty v2.7 将面板定义与加载脚本放在
[`files/grafana`](https://github.com/Vonng/pigsty/tree/v2.7.0/files/grafana)：

```bash
cd ~/pigsty/files/grafana
./grafana.py init
```

如果没有使用默认 Grafana 凭据，可通过 `GRAFANA_ENDPOINT`、
`GRAFANA_USERNAME` 与 `GRAFANA_PASSWORD` 环境变量传入。

使用 v2.7 任务，将 `pg_databases` 中声明的数据库注册为 Grafana
PostgreSQL 数据源：

```bash
./pgsql.yml -t register_grafana
```

该命令调用
[`roles/pgsql/tasks/register_grafana.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/roles/pgsql/tasks/register_grafana.yml)，
默认使用监控用户；只有数据库将 `register_datasource` 显式设为 `false`
时才会跳过注册。
