Z.S.K.'s Records

Grafana学习(将数据存储从SQLite3迁移到mysql)

线上的Grafana一直都是直接将所有数据写本地的SQLite,就单独的一个db文件,随时dashboard加的越来越多,真怕随时都可能出现磁盘宕机的问题,拓展性也差, 因此将grafana的历史数据从sqlite3迁移到mysql中,也能够保证HA, 新测有效

mysql新建库及用户

1
2
3
4
create database grafana;
GRANT USAGE ON `grafana`.* to 'grafana'@'xxx' identified by 'xxx';
GRANT ALL PRIVILEGES ON `grafana`.* to 'grafana'@'xxx' with grant option;
flush privileges;

导出SQLite3历史数据

导出历史数据前需要先将grafana停止,以防新数据写入

1
systemctl stop grafana

使用以下脚本将数据导出

1
2
3
4
5
6
7
8
9
#!/bin/bash
DB=$1
TABLES=$(sqlite3 $DB .tables | sed -r 's/(\S+)\s+(\S)/\1\n\2/g' | grep -v migration_log)
for t in $TABLES; do
echo "TRUNCATE TABLE $t;"
done
for t in $TABLES; do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB

执行 ./export_sqlite.sh grafana.db > grafana.sql

**grafana.db为grafana本地存储的db文件, 执行完成之后即可在当前目录下生成mysql 文件

修改grafana配置文件使用mysql

因为我这里是将grafana部署在k8s中的,因此直接在容器中定义环境变量的形式

注意: 环境变量的规则是以GF_<SectionName>_<KeyName>

sectionName为grafana配置文件中的分区部分,比如database,就为GF_DATABASE_xxx

smtp就为GF_SMTF_xxx参考

1
2
3
4
5
6
7
8
9
10
11
12
- name: GF_DATABASE_TYPE
value: mysql
- name: GF_DATABASE_HOST
value: 127.0.0.1:3306
- name: GF_DATABASE_NAME
value: grafana
- name: GF_DATABASE_USER
value: grafana
- name: GF_DATABASE_PASSWORD
value: xxx
- name: GF_DATABASE_URL
value: mysql://xxx:[email protected]:3306/grafana

如果是实体机部署的是,则在配置文件中使用

1
2
3
4
5
6
7
8
9
10
[database]
# You can configure the database connection by specifying type, host, name, user and password
# as separate properties or as on string using the url properties.

type = mysql
host = 127.0.0.1:3306
name = grafana
user = xxx
password = xxx
url = mysql://xxx:[email protected]:3306/grafana

修改完成之后重启grafana, 这样grafana会连上mysql数据库, 自动生成所有的表

1
systemctl restart grafana

当看到日志显示数据库migration已经做完了之后,就可以再次停用grafana,然后把数据导进去

1
systemctl stop grafana

导入数据

1
mysql -u xxx -p xxx -P3306 -D grafana < grafana.sql

导完之后再次启动grafana

1
systemctl start grafana

验证

当grafana启动之后,登录grafana,所有的数据都在,迁移成功.

问题

  1. 导入数据时提示以下错误

    1
    2
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1136 (21S01) at line 277: Column count doesn't match value count at row 1

    原因: 插入的数据字段与表中的字段不一致,由于这个grafana使用期间升级过一次版本, 因此,当连接到mysql后会以新版本的sql进行建表操作,而导出的数据中有个表中的一个字段在新版本中已经没有了,因此字段个数对不上

    解决: 按照新的表结构直接将导出数据不存在的字段去除.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?