Grafana: von SQLite zu MariaDB

Geschätzte Lesezeit: 2 Minuten

Ausfallsicherheit, Lastverteilung, Performance, eine ganz grundsätzliche Abneigung gegen SQLite – es sind viele Gründe denkbar, Grafana seine Daten aus einer (üblicherweise ohnehin schon vorhandenen) MariaDB beziehen zu lassen. Ich habe mir während der Umstellung ein paar Notizen gemacht und teile sie mal hier – auf dass sie auch anderen nützlich sein mögen 😘

Grafana stoppen

Sollte Grafana bereits laufen, so muss es zunächst einmal gestoppt werden.

Klassisch installiert

$ service grafana-server stop

Docker

$ docker stop grafana

Dump der SQLite-Daten erstellen

Es geht ja darum, die Bestandsdaten aus SQLite in die MariaDB zu übernehmen; also wird zunächst ein Dump dieser Daten benötigt. In den Grafana-Repositories gibt es hierzu den database-migrator:

$ cd /usr/src && git clone https://github.com/grafana/database-migrator.git
Cloning into 'database-migrator'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 25 (delta 7), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (25/25), done.

$ file /var/lib/grafana/grafana.db
/var/lib/grafana/grafana.db: SQLite 3.x database, last written using SQLite version 3029000
$ cd database-migrator/
$ bash -x sqlitedump.sh /var/lib/grafana/grafana.db > /tmp/grafana.sql

Datenbank vorbereiten

Nun geht es darum, eine MariaDB-Datenbank zu erstellen nebst eines Benutzers, der Vollzugriff darauf hat.

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 416342
Server version: 10.4.21-MariaDB-1:10.4.21+maria~buster-log mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database grafana CHARACTER SET 'utf8mb4';
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> create user 'grafana'@'localhost' identified by 'KU0hbCaJcknIzeu8shOixJGD';
Query OK, 0 rows affected (0.283 sec)

MariaDB [(none)]> grant all privileges on grafana.* to 'grafana'@'localhost';
Query OK, 0 rows affected (0.014 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.184 sec)

MariaDB [(none)]> quit
Bye

Anpassung der Grafana-Einstellungen

Im nächsten Schritt muss die Umstellung auf Seite von Grafana erfolgen; zur Verwendung von MariaDB ist als type mysql einzusetzen.

Klassisch installiert

Im Falle eines klassisch installierten Grafana musst du /etc/grafana/grafana.ini entsprechend anpassen.

[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 properties.
# Either "mysql", "postgres" or "sqlite3", it's your choice
type = mysql
host = 127.0.0.1:3306
name = grafana
user = grafana
password = KU0hbCaJcknIzeu8shOixJGD

Docker

In meinem Fall läuft Grafana als Docker-Container, ich musste daher in docker-compose.yml die entsprechenden Umgebungsvariablen setzen:

  ...  
  - GF_DATABASE_TYPE=mysql
  - GF_DATABASE_HOST=127.0.0.1:3306
  - GF_DATABASE_NAME=grafana
  - GF_DATABASE_USER=grafana
  - GF_DATABASE_PASSWORD=KU0hbCaJcknIzeu8shOixJGD

Grafana wieder starten

Die vorhin erstellte Datenbank grafana ist ja nach wie vor leer: wenn du jetzt Grafana startest, so wird die für den Betrieb benötigte Tabellenstruktur automatisch angelegt; erst wenn diese Struktur vorhanden ist, lässt sich der Dump einspielen!

Klassisch installiert

$ service grafana-server start

Docker

Wie du Grafana in deiner Umgebung startest, hängt stark von deinem Setup ab; ich feuere meinen Container unter Nutzung von docker-compose (die Auswertung der docker-compose.yml erfolgt hier implizit) hoch.

$ docker-compose up -d

Den Dump einspielen

Ganz gleich ob nun Container oder nicht – Grafana meldet im Logfile diverse Dinge und signalisiert mit dem folgenden Eintrag, dass es gestartet und betriebsbereit ist.

t=2021-11-07T16:40:28+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:8443 protocol=http subUrl=/stats socket=

Das ist der richtige Zeitpunkt, um Grafana auf die jeweils erforderliche Art (s.o.) wieder zu stoppen und im Anschluss daran dann den Dump einzuspielen.

$ mysql grafana < grafana.sql

Fazit

Und das war’s dann auch schon: nach einem neuerlichen Start des Dienstes bezieht Grafana seine Daten aus der MariaDB-Datenbank; das SQLite-File wird nicht mehr beschrieben. Das ist der richtige Zeitpunkt, um alle Dashboards und Graphen eingehend zu kontrollieren und im Filesystem aufzuräumen.

Mögliche Fehler

Beim Einspielen des Dumps kam es zu einer für mich zuerst überraschenden Fehlermeldung:

ERROR 1136 (21S01) at line 304: Column count doesn't match value count at row 1

Wie sich zeigte unterschieden sich die Grafana-Version, in welcher ich den Dump erzeugt hatte und jene, in welche ich ihn dann einzuspielen versuchte; es ist unbedingt darauf zu achten, dass sich die Grafana-Version im Laufe der Umstellung nicht ändert – das gilt auch und gerade bei Verwendung von Docker!