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存在報錯,建議去看一下日誌,根據日誌提示排查問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章