grafana迁移mysql

grafana版本:9.5.14
迁移 sqlite3 到 mysql
网上很多版本,没有可以直接用的,自己实践记录一下

0x01 前言

网上有挺多版本的,没有可以直接用的,还遇到一些坑,实践下来主要是如下步骤,默认大家熟悉基础运维,提前准备一个数据库

0x02 创建数据库

1
2
3
4
CREATE DATABASE IF NOT EXISTS grafana DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'grafana'@'%' IDENTIFIED BY '123456';
GRANT All privileges ON grafana.* TO 'grafana'@'%';
flush privileges;

0x03 启动新grafana

因为我们不能直接动生产,所以采用了一样的配置文件做修改,然后在本地启动(或者相似的环境启动)

1
2
3
4
5
6
type = mysql
#host = 127.0.0.1:3306
#name = grafana
#user = root
#password =
url = mysql://grafana:123456@127.0.0.1:3306/grafana

这是最简单的的配置,自行修改地址和用户,你也可以直接用root

启动后等grafana正常打开了,直接停止即可

我这次实践用的是基于k8s,所以就直接 scale 0 了

0x04 转移数据

网上有一种用 sqlite3-to-mysql 的工具,但是实际上这个工具会把表完全的倒过去,grafana自带一个迁移记录表,记录了sql,如果覆盖了估计会有兼容问题,所以我没有使用,而是用了另一种脚本的方式

脚本导出数据

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

创建一个这样的脚本 con.sh ,执行命令

1
2
chmod +x con.sh
./con.sh /var/lib/grafana/grafana.db > grafana.sql

导入mysql数据库

比较简单就是 mysql 命令行导入

1
mysql -h 127.0.0.1 -u root -p grafana < grafana.sql

但是这样其实看不太清楚报错和结果,我个人比较喜欢用 antares 这个数据库,可以清晰的导入,并处理数据

0x05 问题处理

不知道是大家场景的问题还是什么,我的生产实践表明,这样结果会有几十行的数据无法导入

时间格式

第一种就是 时间格式的问题,比如前面导出的sql中会带有这种数据

1
2021-12-01 09:49:08.321867897+08:00

这样的数据 mysql 的date 是没办法直接导入的,需要用vim将类似的格式全部替换

1
:%s/2021-12-01 09:49:08.321867897+08:00/2021-12-01 09:49:08/g

至于详细的时间是否准确 ,emmmm我觉得导入正常更重要,而且这个时间显示了+8 代表需要-8 才对,如果你有空就可以一个个手动改时间

dashboard 导入后无法正确打开

打开某个dashboard提示错误或者是not found

Error while loading dashboard, dashboard data is invalid

打开dashboard后右上角出现如此消息,代表dashbaord的数据有问题,这里其实就是mysql导入数据的时候会去考虑转义的问题,但是grafana的json存入的时候也已经考虑的转义的问题,比如存的是

1
2
3
4
5
6
7
8
9
10
11
12
13
[
{
"datasource": {
"type": "prometheus",
"uid": "000000003"
},
"editorMode": "code",
"expr": "sum(irate(ifHCOutOctets{instance=~\"10.0.0.0\",ifName=~\"1\"}[30])*8)",
"legendFormat": "下载",
"range": true,
"refId": "A"
}
]

观察导出的sql文件,发现文件中存储的也是这样的,所以我们需要对 \符号做转义保证它能正确插入,而不是被mysql识别为特殊字符,vim下替换也很简单

1
:%s/\\/\\\\/g

处理完数据文件后,就可以直接导入mysql启动grafana正确玩耍了(这里反复导入是没有问题的)

0x06 切换生产

前面是将线上的数据库传到本地,在本地搭了一个简单的grafana,并且调试后发现正常,最后一个步骤就是将生产的配置也切换到 mysql 的配置然后重启即可