生産現場IoTへの挑戦 #05　~データベースのインストールと設定~

# １．はじめに

※2021.6.9 mariaDBに対して別のPCからのリモートアクセスを行うためには、外部アクセス用のユーザー作成、権限付与、クアイアントPCのIPアドレス許可が必要でしたが、その部分が抜けていましたので2-2項に追記しています。

I2C接続のセンサーを使用してデータが取れる様になり、全体システムのおぼろげながら構想もできましたので、データの蓄積方法を決めます。
ネットの記事などを見渡すと、IoTのデータはクラウドを活用して収集や集計を行うのが流行りだし格好いいと思うのですが、「クラウドって何となく怖い」とか「クラウド使うお金がない」とか「社外にデータを持ち出すなんてまかりならん」とか「そもそも外部サーバを使っていいものかどうか判断できる人がいない」とかいろいろな理由で社内でコンパクトにシステムを組みたいという場合は、センサー制御用のラズパイにデータベースを構築してしまうという手があります。
（状況が許すなら[こんなの](https://soracom.jp/)や[こんなの](https://aws.amazon.com/jp/iot-core/)を使って、流行りのかっこいいクラウドIoTをやってみたいものです）

プロの方が見たら信頼性の低いラズパイにデータを蓄積するなんて！！！　とお怒りの言葉をいただきそうな気もしますが、まずは手軽にIoTを体験するための方便だということでお許し願いたいと思います。
同様のシステムにトライしようという奇特な方がいらっしゃっても、あくまでもIoTの味見をするための簡易システムであり、不測の事故によりデータが無くなる危険があることをご理解ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/78e2d654-8a3e-4965-5742-b2d58ec9678f.png)

また、データベースの初期設定等について説明しますが、データベースについては今回の案件で触り始めた超初心者でのすの間違いや不適切な使用方法もあるかもしれません。
データベースの使用方法については他の解説サイトや書籍にてより詳しく勉強し、当記事の間違いなどをやさしく指摘していただけると幸いです。

# ２．MariaDBをインストールする。
前回も軽く触れましたが、使用するデータベースソフトはMariaDBというMySQL互換のフリーソフトです。
これをインストールして、必要なデータベースの設定を行います。

## ２－１．インストール方法

MariaDBのインストールはターミナル上から行います。

Raspberry Pi OS のバージョンアップに伴いMariaDBインストール時の設定方法が変わりました。
[こちらの記事](https://qiita.com/airpocket/items/f1dd8e0d32be6075b7de)で紹介しています。

~~次のコマンドでインストールしてください。~~

```sh
$ sudo apt-get install mariadb-server
```

## ~~２－２．リモートでのログインを許可する~~ 
~~MariaDBの設定は次項で説明する通り、リモート環境で実施しますのでネットワーク越しにアクセスできる様に設定しなければなりません。
設定については[こちらのページ](https://www.raspberrypirulo.net/entry/mariadb-install)で丁寧に説明されていますのでこの通りに実施して下さい。~~~

~~メモとして必要なコマンドのみ記載します。
※セキュリティは考慮せず、フリーアクセス状態となりますので、運用方法はよく注意してください。~~


```sh
$ sudo mysql -u root
MariaDB [(none)]> USE mysql;
MariaDB [mysql]> UPDATE user SET plugin='' WHERE User='root';
MariaDB [mysql]> exit
$ sudo systemctl restart mysql

$ mysql -u root
MariaDB [(none)]> update mysql.user set password=password('パスワード') where user = 'root';
MariaDB [(none)]> exit
```
再度入りなおす。パスワード不要
```
$ mysql -u root -p
Enter password:
```
```
MariaDB [(none)]> CREATE USER 'root'@'%' IDENTIFIED BY 'パスワード';   //外部からのアクセス用ユーザー作成（追記)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';          //ユーザーにすべての権限を付与（追記）

MariaDB [(none)]> exit

$ sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf    //テキストエディタで設定ファイル編集
#bind-address=127.0.0.0  //この行をコメントアウト       //クライアントPCをIPアドレスで規制しない場合はコメントアウト

$ sudo systemctl restart mysql
```

~~※ユーザー名はrootにしてますが、別のユーザーでもOK。
※パスワードは、任意のパスワードに書き換えてください。~~

[ユーザーの作り方参考](https://ssabcire.hatenablog.com/entry/2019/02/11/135557)
[権限付与方法参考](http://nort-wmli.blogspot.com/2019/06/raspberry-pi-mysqlmariadb.html)


# ３．データベースの開発環境について
ラズパイ上で使用するデータベースにはMariaDBを使用しますが、データベースを構築する際にラズパイ上で行うと結構厄介です。そこでデータベースの構築中はラズパイをLANに接続してWindows10マシンからリモートで構築します。

## ３－１．HeidiSQLについて
HeidiSQLはWin10上で動くデータベース管理用のGUIソフトです。
MariaDBは、リモートログインを許可した際に用いたSQLと呼ばれる言語で制御できますが、毎回SQLを使うのはなかなかの苦行です。
HeidiSQLを使うと、GUIでデータベースの構築や設定、蓄積したデータの閲覧、出力ができるため非常に便利です。というか、私はGUIツールが無いとデータベースを扱える気がしません。
ラズパイ上で使用できるGUIツールもなくは無いのですが、いくつか試した中ではHeidiSQLが最も使いやすかったので今後の説明はHeidiSQLをメインに使用して説明します。
HeidiSQLの弱点は、ラズパイ上で動かせないことですが、同じLANに接続していればリモートアクセスも容易です。
※Win10アプリをlinux上で動かすツールを使えばHeidiSQLも使えそうではありますが、まだ試していません。うまく動いたら報告します。

## ３－２．HeidiSQLをインストールする
HeidiSQLはこちらの[公式サイト](https://www.heidisql.com/download.php)からダウンロードできます。
インストールも特に問題ないと思いますが、[こちらのサイト](https://masafumi-blog.com/%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91heidisql%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)で丁寧に説明されているため判らない場合は参考にしてください。

# ４．データベースを作成する
HeidiSQLがインストールできたら、ラズパイに接続してデータベースを作成します。
##４－１．ラズパイのIPアドレスを確認する
ラズパイの画面上部にあるネットワーク接続のアイコンをマウスオーバーするとIPアドレスが表示されます。
もしくはラズパイのターミナルを立ち上げてifconfigコマンドで接続状況を確認します。
inetに続く表示がIPアドレスです。

## ４－２．MariaDBに接続する
HeidiSQLを立ち上げるとセッションマネージャーが開きますので接続設定を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/75e37ee4-69ce-4179-e7d6-b9552aa5ed7c.png)

## ４－２．データベースを作る
MariaDBに接続したデータベースが表示されるため、右クリックして「新規作成」⇒「データベース」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b71977fa-b3f8-6871-b6e0-46430ffe1e75.png)

ウィンドウが開いたら、名前を入力して「OK」をクリックすると新しいデータベースが作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/fc52b375-8c60-ac8d-85cc-bf2dbd30f2da.png)

## ４－１．テーブルとカラムを作る
データベースの中に、データを格納するテーブルを作成します。
先ほど選択したデータベースを右クリックし、「新規作成」⇒「テーブル」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/fdf787db-b838-a20c-fee5-55b8b674dd0e.png)

画面右にテーブルが表示されるため、テーブルの名前を入力し、カラムを追加します。
今回はBMP280の温度、気圧、湿度を記録するため、IDと時間を加えて5つのカラムを作成します。
※温度を記録するカラムが「temperture」になっていますが、スペル間違いです。「temperature」にして進めてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/88f90ad2-c937-89af-1bcc-c44bee49e7b6.png)
　

## ４－２．カラムの設定を変更する
カラムには様々なデータが記録できますが、記録するデータに合わせて入力規則を定義します。
今回は「名前」「データ型」「NULLを許可」「デフォルト」を下の通り設定します。変更したいセルをクリックすると変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b330e9cc-4ad7-d7e8-a643-4c8886d10cfa.png)
※今回はトラブル防止のため、測定時間を記録するカラムにDATETIME型、測定データを記録するカラムにDOUBLE型を使用していますがデータサイズを削減したい場合はTIMESTAMP型とFLOAT型でも対応可能です。
また、timeのカラムだけでもユニークになる予定ですが、役に立つかもしれないのでIDを用いてキーにします。

## ４－３．キーを設定する
データベースを管理するために、キーとなるカラムを設定します。
「INDEX」タブを選択して、「追加」するとキーができますので、「タイプ/長さ」の「KEY」をダブルクリックして「PRIMARY」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/f987f0c5-bed1-4a5e-e642-d75afb7ded7f.png)

キーの表示が「PRIMARY」に変わるため、IDカラムを「PRIMARY」にドラッグするとIDが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/572c7d9f-ad9a-e635-5813-6020e0969d26.png)

最後に「保存」をクリックするとテーブルができました。

# ５．まとめ
駆け足でしたが、ラズパイにデータベースを作成しました。
測定項目が増えても同様の手順でカラムやテーブルを増やしていけば記録できます。
最初は戸惑うことも多いかと思いますが、どんどん触って慣れましょう。

# ６．おまけ・・・ラズパイデータベースの破損について
冒頭にも書いた通り、ラズパイにデータベースを構成することにはデータ破損の危険性が伴います。ラズパイを用いたIoTシステムには常に付きまとう問題ですが、メインストレージにmicroSDのデータ破損に伴う事故が多いようです。
個人的な見解としては、このタイプの事故の最大の原因はmicroSDへの書き込み途中の電源遮断です。配線抜け、電源ブチ切り、工場の停電・瞬停などにより書き込み中に電源が落ちてmicroSDのデータが破損するようなケースです。
この対策としては次のいずれかの方法が有効です。
　①microSDカードをROMモードで使用する。
　②UPSを使用して、電源遮断時に安全にシャットダウンする。
今回は、データベースとして使用するため、microSDをROMモードで使用することはできず、②の対策が必要です。また別の機会にご紹介したいと思いますが、ラズパイ向けのUPS装置が市販されていますので、データ破損対策として導入されることをお勧めします。
※ちなみに当記事を執筆している現在、ノーガードで運用中ですがなんとか耐えています。。。
　UPS自作基板をいただいたのですがまだ手をつけられていません。。。