Grafana 数据SQLite迁移MySQL指南
背景
Grafana 是一个开源的监控和可视化工具,它支持多种数据源,包括 MySQL、PostgreSQL、InfluxDB 等。随着数据量的增加,以及考虑 grafana
容灾和拓展性,我们可能需要将 Grafana 数据从 SQLite 迁移到 MySQL。
1. 导出 SQLite 数据
1.1 导出表数据
利用 Grafana 官方提供的工具 database-migrator 转换成 MySQL 数据:
1
| ./sqlitedump.sh grafana.db > grafana.sql
|
注意:工具只适用于 Linux 系统,在 MacOS 下执行有问题,并且仅导出数据,不包含表结构。
1.2 导出表结构
启动 Grafana 初始化,然后从临时 MySQL 导出表结构。
Docker Compose 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: grafana
MYSQL_USER: grafana
MYSQL_PASSWORD: grafana
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d
command: --default-authentication-plugin=mysql_native_password --max_allowed_packet=256M --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-prootpassword"]
interval: 5s
timeout: 5s
retries: 10
grafana:
image: grafana/grafana:12.0.2
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./grafana/grafana.ini:/etc/grafana/grafana.ini
environment:
- GF_DATABASE_TYPE=mysql
- GF_DATABASE_HOST=mysql:3306
- GF_DATABASE_NAME=grafana
- GF_DATABASE_USER=grafana
- GF_DATABASE_PASSWORD=grafana
- GF_DATABASE_MAX_OPEN_CONN=300
- GF_DATABASE_MAX_IDLE_CONN=100
- GF_DATABASE_CONN_MAX_LIFETIME=14400
depends_on:
mysql:
condition: service_healthy
volumes:
mysql_data:
driver: local
|
注意:请确保正确配置 MySQL 字符集,避免中文乱码问题。
Grafana 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| [analytics]
check_for_updates = true
[grafana_net]
url = https://grafana.net
[dashboards]
min_refresh_interval = 30s
[log]
mode = console
[paths]
data = /var/lib/grafana/data
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
[server]
domain = localhost
http_port = 3000
root_url = %(protocol)s://%(domain)s/
serve_from_sub_path = true
[auth.proxy]
enabled = true
header_name = X-WEBAUTH-USER
header_property = username
auto_sign_up = true
sync_ttl = 60
whitelist = 172.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8
headers = Name:X-WEBAUTH-NAME
enable_login_token = false
[auth.anonymous]
enabled = true
org_name = 业务监控
org_role = Viewer
kiosk = tv
[plugins]
allow_loading_unsigned_plugins = aliyun-log-service-datasource
[security]
allow_embedding = true
[auth]
oauth_auto_login = true
[users]
allow_sign_up = false
auto_assign_org = true
auto_assign_org_role = Viewer
[database]
migration_locking = true
|
MySQL 字符集配置
1
2
3
4
5
| [mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
|
2. 数据库准备
2.1 修改表结构
修改 dashboard_snapshot 表中 dashboard_encrypted 字段类型,以适应大容量数据:
1
| ALTER TABLE grafana.dashboard_snapshot MODIFY dashboard_encrypted LONGBLOB;
|
2.2 导出表结构
1
| mysqldump -uroot -prootpassword --no-data grafana > grafana_schema_with_index.sql
|
2.3 创建数据库和用户
1
2
3
4
5
6
7
8
9
10
11
| -- 创建 grafana 数据库
CREATE DATABASE IF NOT EXISTS grafanatest;
-- 创建用户并授权
CREATE USER 'grafanatest123'@'%' IDENTIFIED BY 'grafanatest123';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX
ON grafana.* TO 'grafanatest123'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
|
3. 数据导入
- 导入表结构:使用
grafana_schema_with_index.sql
- 导入表数据:使用
grafana.sql
4. 启动 Grafana
完成数据导入后,启动 Grafana 服务即可使用。