线上的Grafana一直都是直接将所有数据写本地的SQLite,就单独的一个db文件,随时dashboard加的越来越多,真怕随时都可能出现磁盘宕机的问题,拓展性也差, 因此将grafana的历史数据从sqlite3迁移到mysql中,也能够保证HA, 新测有效
mysql新建库及用户
1 | create database grafana; |
导出SQLite3历史数据
导出历史数据前需要先将grafana停止,以防新数据写入
1 | systemctl stop grafana |
使用以下脚本将数据导出
1 |
|
执行 ./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 | - name: GF_DATABASE_TYPE |
如果是实体机部署的是,则在配置文件中使用
1 | [database] |
修改完成之后重启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
2mysql: [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进行建表操作,而导出的数据中有个表中的一个字段在新版本中已经没有了,因此字段个数对不上
解决: 按照新的表结构直接将导出数据不存在的字段去除.