[Grafana 7.x] データベースを Sqlite3 から MySQL へ移行 (マイグレーション) する

わたしは、後先なにも考えずに [Grafana](https://grafana.com/) をインストールしたことで、一つ後悔をしていることがあります。

もし、軽い気持ちで [Grafana](https://grafana.com/) を入れて試してみようと初期設定で済ませることを推奨しません。最低限、データベースだけはなににするか決めておいた方が良いです。なににするかと言っても選択肢は少ないです。`MySQL`か`PostgreSQL`かです。

## Sqlite3 ではいけないの？

ダメとは言いません。ホントに軽い気持ちでちょっと使おうという一時的なケースだけにした方が良いです。

[Grafana](https://grafana.com/) を本格運用し出すと、ダッシュボードを平気で 5s や 10s で更新するような大人になります。まちがいなく、なります。すると、残念なできごとが起きることでしょう。やたらめったらログアウトしやすくなります。それを回避するとなると、`MySQL`か`PostgreSQL`へ移行しなければなりません。移行は面倒で厄介です。

しかし、みなさま、安心してください。今回、[Grafana](https://grafana.com/) 7.x で `sqlite3`から`MySQL`へ移行する手順を紹介します。

もし、`sqlite3` で運用していて「やたらとログアウトするようになったなー」と感じた方、これから述べる方法で`MySQL`へ移行してください。明るい未来が待っています。

# Grafana 7.x における sqlite3 → MySQL への移行

一部、順番に気をつけないといけないとこありますが、データの欠損などは起こらない方法なので、安心して進めてください。次の 7手順になります。

1. MySQL をインストールして設定する
2. Grafana 用、database-migrator を準備する
3. grafana.db から MySQL 用 sql を抽出する
4. grafana.ini の設定を変更する
5. MySQL の各種テーブルを作成する
6. MySQL へデータを放り込む

## 1. MySQL をインストールして設定する

Ubuntu で MySQL をインストール紹介している方法で全然十分と考えます。たとえば、個人的にインストールの流れとしてわたしと似ているのは [MySQL 8.0 : Install](https://www.server-world.info/en/note?os=Ubuntu_20.04&p=mysql8&f=1) の手順です。

セキュリティレベルやパスワードなどは、運用する状況下においてイロイロと変わるでしょうから、各自の判断にお任せします。とはいえ `sudo mysql_secure_installation` あたりは実行しておくことが嗜みです。

忘れてはならないのは、`mysqld.conf` へ次の行が入っていることが必須です。最後の行に追加しておけば十分でしょう。

```config:/etc/mysql/mysql.conf.d/mysqld.conf
character-set-server  = utf8mb4
```

あと、データベースの作成と権限付与を忘れずに。`'<password>'` はお好みで。Grafana からアクセスする際の grafana ユーザのパスワードです。

```sql
$ sudo mysql
mysql> create database grafana;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER 'grafana'@'localhost' IDENTIFIED BY '<password>';
Query OK, 0 row affected (0.00 sec)

mysql> grant all privileges on grafana.* to 'grafana'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
```

## 2. Grafana 用、database-migrator を準備する

Grafana 向け `sqlite3` DBから `MySQL` 用のデータ移行スクリプト(SQL)をdumpするプログラムである[database-migrator](https://github.com/grafana/database-migrator)を準備します。`git` で提供されていますから、`git`も忘れずに。

適当なディレクトリで `git clone` して、Grafana のあるサーバへコードをダウンロードします。

```bash
$ git clone https://github.com/grafana/database-migrator.git
```

実行権限がついてなければ、付与しておきます

```bash
$ chmod 755 database-migrator/sqlitedump.sh
```

## 3. grafana.db から MySQL 用 sql を抽出する

DBの静止点をとるために、[Grafana](https://grafana.com/)を停止しておきます。

```bash
$ sudo systemctl stop grafana-server.service
```

[Grafana](https://grafana.com/) の `sqlite3` DB から、先ほどの `database-migrator` を使って、`MySQL` データ移行用の SQL ダンプを出力します。

```bash
$ sudo database-migrator/sqlitedump.sh /var/lib/grafana/grafana.db > grafana.sql
```

なお、`grafana.ini` で `sqlite3` データベースのディレクトリやパスを変えている場合は、`/var/lib/grafana/grafana.db` をそちらへ直してください。


## 4. grafana.ini の設定を変更する

`grafana.ini` を変更して、`MySQL`へアクセスするように設定を変更します。

先に `MySQL` を設定したとおりに進めている場合には、`name`も`user`も`grafana`です。`<PASSWORD>` は、先に指定したパスワードを指定してください。

```config
[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 # MySQL のユーザ名
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = <PASSWORD> # grafana ユーザで指定したパスワード
```

## 5. MySQL の各種テーブルを作成する

まだ、データベースにデータを入れていませんが、ここで一度[Grafana](https://grafana.com/)を起動します。

```bash
sudo systemctl start grafana-server.service
```

その後、こんな感じで`tail -f`しながら、`http.server`が起動するのを待ちます。

```bash
$ sudo tail -f /var/log/syslog
Feb 17 22:27:57 hostname grafana-server[231080]: t=2021-02-17T22:27:57+0900 lvl=info msg="Executing migration" logger=migrator id="add index user_auth_token.user_id"
Feb 17 22:27:57 hostname grafana-server[231080]: t=2021-02-17T22:27:57+0900 lvl=info msg="Executing migration" logger=migrator id="create cache_data table"
Feb 17 22:27:57 hostname grafana-server[231080]: t=2021-02-17T22:27:57+0900 lvl=info msg="Executing migration" logger=migrator id="add unique index cache_data.cache_key"
Feb 17 22:27:57 hostname grafana-server[231080]: t=2021-02-17T22:27:57+0900 lvl=info msg="Executing migration" logger=migrator id="create short_url table v1"
Feb 17 22:27:57 hostname grafana-server[231080]: t=2021-02-17T22:27:57+0900 lvl=info msg="Executing migration" logger=migrator id="add index short_url.org_id-uid"
Feb 17 22:27:58 hostname grafana-server[231080]: t=2021-02-17T22:27:58+0900 lvl=info msg="Created default admin" logger=sqlstore user=admin
Feb 17 22:27:58 hostname grafana-server[231080]: t=2021-02-17T22:27:58+0900 lvl=info msg="Created default organization" logger=sqlstore
Feb 17 22:27:58 hostname grafana-server[231080]: t=2021-02-17T22:27:58+0900 lvl=info msg="Starting plugin search" logger=plugins
Feb 17 22:27:58 hostname grafana-server[231080]: t=2021-02-17T22:27:58+0900 lvl=info msg="Registering plugin" logger=plugins id=input
Feb 17 22:27:58 hostname grafana-server[231080]: t=2021-02-17T22:27:58+0900 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=
```

そこまで達したら、また[Grafana](https://grafana.com/)を停止します。

```bash
$ sudo systemctl stop grafana-server.service
```

このように、[Grafana](https://grafana.com/) の起動時にデータベース内になにも入っていないと、必要なテーブルや初期設定を行ってくれます。

## 6. MySQL へデータを放り込む

あとは、できあがったテーブル構造内に、先ほどのSQLをぶん投げておしまいです。もし、失敗して変なデータを入れてしまったら、`mysql` で `DROP DATABASE grafana;`してから `CREATE DATABASE grafana;` してやり直しです。

その後は、`MySQL`にデータを放り投げ入れます。`<PASSWORD>`のとこは読み替えて直して入れてください。

```bash
mysql -u grafana -p<PASSWORD> -D grafana < ~/grafana.sql
```

特にエラーなく放り込めたら、[Grafana](https://grafana.com/) を起動します。

```bash
sudo systemctl start grafana-server.service
```

これでマイグレーションはうまくいっているはずです、アクセスして試してみましょう!

そして更新間隔を 1s 5s などで頻繁に更新して楽しみましょう!!!11(そうじゃない)