Chuyển dữ liệu nội bộ của Grafana từ SQLite3 sang MySQL

Trích xuất dữ liệu nội bộ của Grafana từ SQLite3 và chuyển vào MySQL để có thể sử dụng tiếp.

4 phút để đọc
Bởi Đức Trí
Chuyển dữ liệu nội bộ của Grafana từ SQLite3 sang MySQL

Khi bắt đầu làm quen với Grafana, chúng ta thường có thói quen để mặc định "theo nhà sản xuất". Và đối với Grafana thì mặc định là mọi thông tin nội tại của Grafana (như user, dashboard, v.v...) được lưu vào SQLite database tích hợp sẵn trong code.

Tuy nhiên sau một thời gian sử dụng, chúng ta nhận ra rằng cần phải quản lý dữ liệu nội tại của Grafana thì phát hiện rằng Grafana còn hỗ trợ thêm những database khác như MySQL, Postgres. Việc sử dụng hệ database bên ngoài sẽ giúp việc quản lý dễ dàng hơn rất nhiều, đồng thời cũng mở ra khả năng tự động hóa một số công việc quản trị khác. Vì vậy nhu cầu chuyển dữ liệu từ SQLite ra ngoài là cần thiết và bài này sẽ giúp chúng ta có thể hoàn thành công việc này.

Trong bài này, mình sử dụng Grafana chạy trên nền docker và MySQL làm hệ database cần chuyển dữ liệu sang. Các bước cần thực hiện như sau:

  • Chuẩn bị trên MySQL database
  • Trích xuất dữ liệu từ SQLite database
  • Cấu hình lại Grafana để sử dụng MySQL database
  • Chuyển dữ liệu vào MySQL để sử dụng

Những thứ cần chuẩn bị sẵn

  • Một bản Grafana chạy trên nền docker đang hoạt động
  • Một bản MySQL đang chạy và có thể kết nối được từ Grafana docker

Chuẩn bị trên MySQL database

Việc đầu tiên cần làm là tạo MySQL user để Grafana sử dụng:

CREATE USER grafana IDENTIFIED BY 'GrafanaStrongPwd';
GRANT ALL PRIVILEGES ON grafana.* TO grafana;

Sau đó tạo luôn database cho Grafana vì script của Grafana dường như không tự tạo được database.

CREATE DATABASE grafana;

Trích xuất dữ liệu Grafana từ SQLite3

Đội ngũ của Grafana dường như cũng đoán trước được nhu cầu chuyển dữ liệu này nên đã chuẩn bị sẵn một cái script cho chúng ta sử dụng. Script được đặt ở [GitHub repo] này. Bạn có thể dùng git clone về thư mục trên server, hoặc tạo bằng tay file sqlitedump.sh bằng đoạn code dưới đây:

#!/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 | sed -e 's/\\[rnut"]/\\&/g'

Và nhớ thêm quyền để chạy script:

chmod +x sqlitedump.sh

Tiếp theo chúng ta sao chép database của Grafana ra thư mục hiện tại để tiến hành trích xuất dữ liệu (nhớ thay grafana bằng tên container tương ứng của bạn):

docker cp grafana:/var/lib/grafana/grafana.db .

Sau đó dùng script để trích xuất dữ liệu:

./sqlitedump.sh grafana.db > grafana_data.sql

Cấu hình lại Grafana để sử dụng MySQL

Chúng ta cần dừng bản Grafana cần chuyển một khoảng thời gian kể từ lúc này, nên hãy đảm bảo việc này không ảnh hưởng đến người sử dụng Grafana của bạn.

docker container stop grafana

Trong file config của grafana (grafana.ini), chúng ta sửa lại phần khai báo [database] tương ứng như sau:

[database]
type = mysql
host = MySQL:3306
name = grafana
user = grafana
password = GrafanaStrongPwd

Nên nhớ thay MySQL bằng địa chỉ IP hoặc hostname của bản MySQL mà chúng ta sử dụng ở bước đầu tiên.

Ở bước khởi động tiếp theo này, vì Grafana đã chuyển sang sử dụng MySQL nhưng trong database mới vẫn chưa hề có dữ liệu. Nên Grafana sẽ mặc định khởi tạo lại toàn bộ hệ dữ liệu nội tại của mình. Chúng ta sẽ tận dụng việc này để khởi tạo các bảng mới cho database MySQL.

docker container start grafana

Đợi cho đến khi Grafana up hoàn toàn, có thể kiểm tra log xem đã xuất hiện dòng lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 hay chưa, chúng ta một lần nữa dừng Grafana để chuyển dữ liệu cũ vào database mới.

docker container stop grafana

Chuyển dữ liệu vào MySQL để sử dụng

Bây giờ toàn bộ các bảng dùng cho Grafana đã được tạo sẵn, chúng ta chỉ còn một việc duy nhất là sử dụng script dữ liệu đã được trích xuất ở trên để chuyển dữ liệu vào MySQL.

mysql -u grafana -p -h MySQL -D grafana < grafana_data.sql

Khởi động lại Grafana là mọi thứ đã hoàn thành.

docker container start grafana

Hy vọng các bước làm trên có thể các bạn thành công với công việc chuyển đổi này. Nếu có vấn đề gì thắc mắc, các bạn có thể liên hệ với mình thông qua kênh Facebook hoặc Twitter.

Chúc các bạn một ngày làm việc vui vẻ ./.