Grafana内部配置库sqlite3迁移至MySQL(同时将数据从sqlite3平移至MySQL)

前言

由于Grafana默认使用了sqlite3作为内部配置的存储数据库,而数据实际存放在了本地。如果服务器宕机,数据丢失等,会造成Grafana的所有前端配置丢失。笔者在这批文章中尝试将现有的Grafana配置库从sqlite3迁移至外部MySQL中。

环境及工具

  • Grafana 6.7.2(官方Docker部署)
  • MySQL 5.6
  • SqliteToMysql 2.3

开工

找到当前的sqlite3数据文件

如果没有更改Grafana的default.ini文件,那么grafana.db通常存储在data/目录中,具体在哪个位置看实际的环境配置
grafana.db

MySQL建库

这一步不多说,数据迁移前当然要给数据找个新家啦

迁移sqlite3数据到MySQL

前言

说实话,实施这一步真不容易。最开始尝试使用转换脚本转换.db文件到.sql文件,然后用source xxx.sql的命令再写入。结果尝试使用过Python脚本\在线转换等都不行。主要问题是转换出的SQL语句都存在问题。最后尝试出使用第三方软件迁移数据,终获成功。

第一步:在MySQL中建表

在这一步,不建议自己去建表,建议让Grafana自己建。因为MySQL的表结构和sqlite3的有所不同
由于我在测试环境,所以我直接修改了配置文件,让Grafana自己在启动时候去建表,保证表结构符合Grafana的要求
这种做法相当于Grafana的服务需要停机维护。实际使用中看各自的需求。如果生产环境的不能停机维护,那么建议可以起一个单独的Grafana服务,连接MySQL完成建表后进行接下来的步骤。最后修改生产环境的配置文件,让生产环境最终链接MySQL

编辑配置文件

[root@tv1-build-prometheus-01 grafana-docker]# vim conf/defaults.ini

修改[database]这一小节的配置

#################################### Database ############################
[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 property.

# 第一个关键配置:type
type = mysql
host = 10.0.1.12:3500
name = 库名
user = 用户名
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = 密码
# Use either URL or the previous fields to configure the database
# Example: mysql://user:secret@host:port/database
# 这里没有使用url链接
url = 

接下来,重启Grafana
已建表
这时候,已经建好表了。

第二步:将数据导入MySQL

正如我先前所说,这一步相当不容易。最后可行的做法是使用第三方软件SqliteToMysql
注意点:

  • 在选择模式时,需要选择append(增加),因为全部表已经建好了
  • 没有成为人民币用户,则每次只能同步20个表。所以35张表需要分2次同步数据

选择源数据和目标数据库
填入目标数据库
选择Import All Tables
选择Import All Tables
接下来一路next
Target
Map
开始同步数据,结束时能看到,实际只同步了20张表。
第一批结束
点击Back按钮回到第一张图,选择最下面的15张表
第二批结束
迁移完成后,在各个表中都能查到原来在sqlite3中的数据了
能查到数据了

第三步:重启Grafana

查看启动日志中的sqlstore日志:
成功启动
重启后,系统各功能使用正常,则成功迁移
正常启动

小贴士

如果在建表\迁移数据时遇到异常,可以用下面的脚本删表\删数据
注意:确保你的库中没有有用数据

删表脚本

DROP TABLE alert;
DROP TABLE alert_notification;
DROP TABLE alert_notification_state;
DROP TABLE alert_rule_tag;
DROP TABLE annotation;
DROP TABLE annotation_tag;
DROP TABLE api_key;
DROP TABLE cache_data;
DROP TABLE dashboard;
DROP TABLE dashboard_acl;
DROP TABLE dashboard_provisioning;
DROP TABLE dashboard_snapshot;
DROP TABLE dashboard_tag;
DROP TABLE dashboard_version;
DROP TABLE data_source;
DROP TABLE login_attempt;
DROP TABLE migration_log;
DROP TABLE org;
DROP TABLE org_user;
DROP TABLE playlist;
DROP TABLE playlist_item;
DROP TABLE plugin_setting;
DROP TABLE preferences;
DROP TABLE quota;
DROP TABLE server_lock;
DROP TABLE session;
DROP TABLE star;
DROP TABLE tag;
DROP TABLE team;
DROP TABLE team_member;
DROP TABLE temp_user;
DROP TABLE test_data;
DROP TABLE user;
DROP TABLE user_auth;
DROP TABLE user_auth_token;

清空表

DELETE FROM alert;
DELETE FROM alert_notification;
DELETE FROM alert_notification_state;
DELETE FROM alert_rule_tag;
DELETE FROM annotation;
DELETE FROM annotation_tag;
DELETE FROM api_key;
DELETE FROM cache_data;
DELETE FROM dashboard;
DELETE FROM dashboard_acl;
DELETE FROM dashboard_provisioning;
DELETE FROM dashboard_snapshot;
DELETE FROM dashboard_tag;
DELETE FROM dashboard_version;
DELETE FROM data_source;
DELETE FROM login_attempt;
DELETE FROM migration_log;
DELETE FROM org;
DELETE FROM org_user;
DELETE FROM playlist;
DELETE FROM playlist_item;
DELETE FROM plugin_setting;
DELETE FROM preferences;
DELETE FROM quota;
DELETE FROM server_lock;
DELETE FROM session;
DELETE FROM star;
DELETE FROM tag;
DELETE FROM team;
DELETE FROM team_member;
DELETE FROM temp_user;
DELETE FROM test_data;
DELETE FROM user;
DELETE FROM user_auth;
DELETE FROM user_auth_token;

总结

  • 不要使用网上的各种sqlite3转换MySQL的工具去尝试直接迁移表结构,因为Grafana中有自带的建表逻辑。原则上让Grafana自己建
  • 已尝试过Python脚本转换、在线转换成.sql文件,都最终失败。建议使用软件迁移。如果大家有好的脚本,欢迎推荐!
  • 如果Grafana存在报错,建议去看一下日志,根据日志提示排查问题
发布了7 篇原创文章 · 获赞 12 · 访问量 2257

猜你喜欢

转载自blog.csdn.net/weixin_42182797/article/details/105657595
今日推荐