Grafana Sqlite3 Migrations to MySQL

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. 数据导入

  1. 导入表结构:使用 grafana_schema_with_index.sql
  2. 导入表数据:使用 grafana.sql

4. 启动 Grafana

完成数据导入后,启动 Grafana 服务即可使用。

0%