MariaDB(MySQL)を一般ユーザーでインストールする

UNIX系のオペレーティングシステムは、マルチユーザーで使用されるのが前提で作られたOSであり、ソフトウェアはrootでインストール・実行され、一般ユーザーがそれを使わせていただく、というのが基本的な考え方になっています。

一方で、開発用途でソフトを使いたい、あるいはちょっと動作確認をしたい、といった場合に、いちいち管理ユーザーの権限がないとインストールできないのは不便ですよね。

というか、ちょっとソフトを試したいだけなのにルート権限でシステムをいじるって、ちょっと怖いです。「やっぱ使わないからソフトをアンインストールするわ」って言って本当に元通りに戻せるかとかいろいろ心配ですよね。

そこで、横浜ベイキットではいくつかのソフトウェアについて、一般ユーザーでインストールする方法を紹介していきます。

今回はMariaDB(MySQL)です。

# MariaDBを一般ユーザーでインストールするメリット
挙げたらキリがないですが、

- 管理ユーザー権限がなくても自由に起動・終了ができる

管理者や他のOSユーザーとの調整の必要もなく、自分一人の中で完結するので面倒がないです。

- データベースを他人と共有する必要がない

複数のOSユーザーでMariaDBを使う場合は、他人のDBを壊しちゃったりとかしそうで怖いですｗ

- 壊したり作り直したりが自由にできる

つまりいろいろ好きなように試せるってことですね。DB最初から作り直したいときとか、rootユーザーにならなくても、DBのフォルダをrmするだけなので楽ちんです。rootユーザーで`rm -r`コマンドとか実行したくないですよねw

- 設定やログなど、どこにあるか完全にコントロールできる

パッケージインストールだと、MySQLを起動した後、ログの場所がどこか分からなくて、やっと分かったとしてもrootユーザー権限じゃないと見られなくていちいち`sudo`するのとか地味に面倒だったりしません？

- アンインストールが簡単

それな！アンインストールはディレクトリごと消すだけでＯＫ。
Mac使ったことある人は分かると思いますが、アプリケーションフォルダの中のアプリケーションをごみ箱に入れる感覚で消せますｗ

管理者でインストールした場合、設定ファイルやDB、ログなどがシステムのディレクトリに残る可能性があり、完全にクリーンな状態に戻せるかよく分からないんですよね。

- スキルアップになる

何といっても、一般ユーザーインストールを経験しておくと`確実に経験値が上がります`。
そういうところが地味におススメではあるのですがｗ

もちろん、管理ユーザーでインストールするメリットもありますよ

- yumやrpm、aptなどのツール一発で瞬間インストールできる
- システムに組み込まれるので自動起動の設定などが簡単

というのはありますね。

なので、開発環境なのか、テスト環境なのか、本番環境なのか、と言ったところでも選択は変わりそうです。


と言うのを念頭に、「それでも一般ユーザーでインストーしたい！」という方のために、MariaDB(MySQL)を一般ユーザーでインストールする方法を解説します。

※ここではCentOS8で解説します。また、MySQLも作業はほとんど同じなので都度読み替えてください。

# 準備

ここでは、ホームディレクトリの下の`app/mariadb`配下にインストールすることにします。
つまり、このディレクトリを消すだけで、全てをなかったことにできるわけｗ

```
$ mkdir -p ~/app/mariadb
```

必要なパッケージのインストール
MariaDBのコンパイルに必要なツールやパッケージをインストールします。
環境によって違うのでアレですが、とりあえず弊環境ではこのあたりが必要でした

- make
- cmake
- gcc
- gcc-c++
- ncurses-devel
- gnutls

てことでインストール

```
$ sudo yum install -y cmake make gcc gcc-c++ ncurses-devel gnutls-devel
```

ライブラリやツールが足りないとcmakeやmakeに失敗するので、その時出たエラーメッセージからアタリをつけていきます。

例えばcmakeで以下のようなエラーが出ます

```
CMake Error at cmake/readline.cmake:65 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
```

このときはcursesライブラリがないんだということでyum searchします

```
$ yum search curses
```

出て来た一覧からそれっぽいのを見つけ、「-devel」のついたものをインストールする、という算段です。

（間違ったらyum removeでなかったことにｗ）



# MariaDBソースのダウンロード


MariaDBのソースを取ってきます。MariaDBのサイト（https://downloads.mariadb.org )からダウンロードしてきます。

今回は10.5.10をDLしました。

```
$ ls
mariadb-10.5.10.tar.gz
```

解凍して中に入ります。

```
$ tar zxf mariadb-10.5.10.tar.gz
$ ls
mariadb-10.5.10  mariadb-10.5.10.tar.gz
$ cd mariadb-10.5.10
```

# コンパイルとインストール

## Makefile作成

Makefileはcmakeで作成します。configureじゃないところとか、ちょっとイケてないっすねｗ

```
$ cmake . -DCMAKE_INSTALL_PREFIX=$HOME/app/mariadb \
          -DMYSQL_DATADIR=$HOME/app/mariadb/mariadata \
          -DMYSQL_UNIX_ADDR=$HOME/app/mariadb/var/mariadb.sock \
          -DSYSTEMD_PID_DIR=$HOME/app/mariadb/var \
          -DDEFAULT_CHARSET=utf8 \
          -DDEFAULT_COLLATION=utf8_general_ci 
```

cmakeにこれらのオプションを指定することで、もろもろ以下のように設定されます

|指定するもの|値|
|:-----------|:------------|
| インストール先                | $HOME/app/mariadb       | 
| データベースファイルのデフォルトの置き場所  | $HOME/app/mariadb/mariadata        |
| デフォルトのローカル接続用ソケットファイル  | $HOME/app/mariadb/var/mariadb.sock |
| PIDファイルのデフォルトの置き場所          | $HOME/app/mariadb/var              |
| デフォルトのキャラクタセット               | UTF-8 |
| デフォルトの照合順序                      | utf8_general_ci |

本当は設定ファイルのデフォルトの置き場所も変えられるといいのだけど、これは`/etc/my.cnf`固定になっており、変えられないみたい。
というわけで、設定ファイルの場所は起動時に指定することになりますね。

cmakeで指定できるオプションは以下を参考に

https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

ちなみに、cmakeをやり直すときはCMakeCache.txtを削除してから行った方がいいらしい。知らんけど。


## Make

cmakeでエラーが出なければmakeします。結構時間かかるｗ
メモリやコアがたくさんあるなら、-j オプションで並列度を指定してビルドすると速い。

```
$ make -j 8
```

（こっちの環境ではメモリ不足で落ちたけどｗ）

makeが終了したらインストールします。

```
$ make install
```

これで、$HOME/app/mariadb 以下にインストールされました。

移動して確認してみましょう

```
$ cd ~/app/mariadb/
$ ls
bin      include         man         README-wsrep  sql-bench
COPYING  INSTALL-BINARY  mysql-test  scripts       support-files
CREDITS  lib             README.md   share         THIRDPARTY
```

デフォルトの設定がどうなっているか一応確認します。

```
$ bin/mariadb-config
Copyright 2011-2020 MariaDB Corporation AB
Get compiler flags for using the MariaDB Connector/C.
Usage: mariadb-config [OPTIONS]
Compiler: GNU 8.3.1
  --cflags        [-I/home/baykit/app/mariadb/include/mysql -I/home/baykit/app/mariadb/include/mysql/mysql]
  --include       [-I/home/baykit/app/mariadb/include/mysql -I/home/baykit/app/mariadb/include/mysql/mysql]
  --libs          [-L/home/baykit/app/mariadb/lib/ -lmariadb]
  --libs_r        [-L/home/baykit/app/mariadb/lib/ -lmariadb]
  --libs_sys      [-ldl -lm -lpthread -lgnutls]
  --version       [10.5.10]
  --cc_version    [3.1.13]
  --socket        [/home/baykit/app/mariadb/var/mariadb.sock]
  --port          [3306]
  --plugindir     [/home/baykit/app/mariadb/lib/plugin]
  --tlsinfo       [GnuTLS 3.6.14]
  --variable=VAR  VAR is one of:
      pkgincludedir  [/home/baykit/app/mariadb/include/mysql]
      pkglibdir      [/home/baykit/app/mariadb/lib]
      pkgplugindir   [/home/baykit/app/mariadb/lib/plugin]
```


## DB作成

### 前準備
DB作成の準備として、データベースを格納するディレクトリと、ランタイム情報を格納するディレクトリを作っておきます

```
$ cd ~/app/mariadb/
$ mkdir data var
```

あと、mariadbのコマンド群が実行できるようにPATHを通します

```
export PATH=$HOME/app/mariadb/bin:$PATH
```

これは$HOME/.bash_profileにも書いておきましょう。

### 初期化

次のコマンドを実行して、MariaDBが管理できるような形にdataディレクトリ内を初期化します（多分ｗ）

```
$ scripts/mariadb-install-db 
```


### 起動

MariaDBのデーモンプログラムは`mariadbd`(MySQLだと`mysqld`）なのですが、通常はこのデーモンプログラムを起動するための別のコマンド`mariadbd-safe`(MySQLだと`mysqld-safe`）を実行します。（理由はよくわからんｗ）

```
mariadbd-safe
210603 06:34:28 mysqld_safe Logging to '/home/baykit/app/mariadb/data/kurage.err'.
210603 06:34:28 mysqld_safe Starting mariadbd daemon with databases from /home/baykit/app/mariadb/data
```

ちなみに、MariaDBの設定ファイルはデフォルトで`/etc/my.cnf`です。なければ読み込みません。

ただ、`/etc`はシステムディレクトリなのでここには置きたくないですよね。

というわけで `~/app/mariadb` に置くことにしましょう。例によってアンインストールも簡単ですしｗ

設定ファイルを読ませたい場合以下のようにオプションを指定して起動します。
（ちょっと面倒ですね。だからビルド時に指定できるようにしてくれればいいのにｗ）

```
$ cd ~/app/mariadb
$ touch my.cnf
$ mariadbd-safe --defaults-file=~/app/mariadb/my.cnf
```




### 接続

`mariadb`コマンドを実行して、先ほど起動したデーモンに接続しましょう

```
$ mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.5.10-MariaDB Source 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)]>
```

※この「none」ってなーんだ！ｗ　と思ったら使用中のDBの名前っぽい。

### ユーザー作成

MariaDBには最初から管理者権限である`root`ユーザーがいますが、まあ別のDBユーザー作っときましょうｗ

ローカル接続ができる`kurage`というユーザー（パスワードは`inada`）を作成し、ありとあらゆる権限を与え、一回抜けます。

```
MariaDB [(none)]> create user 'kurage'@'localhost' identified by 'inada';
Query OK, 0 rows affected (0.007 sec)
MariaDB [(none)]> grant all on *.* to 'kurage'@'localhost';
Query OK, 0 rows affected (0.006 sec)
MariaDB [(none)]> \q
```

ユーザー`kurage`で接続できることを確認します

```
$ mariadb -u kurage -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 16
Server version: 10.5.10-MariaDB Source 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)]>
```

接続できました！


### データベース作成

ではお待ちかね、データベースを作成してみます。`kurage`ユーザーで接続した状態で以下のSQLを実行します。

```
MariaDB [(none)]> create database salmon;
Query OK, 1 row affected (0.000 sec)
```

DB作っただけじゃ使えなくて、次のように`use`文を使って特定のDBを使うことを宣言します。

```
MariaDB [(none)]> use salmon;
Database changed
MariaDB [salmon]> 
```

そうすると現在使用中のDBの名前が`(none)`から`salmon`に変わったことが確認できるかと思います。

### 表の作成・挿入・選択

貝の名前を管理する`shell`という表を作ってみます

```
MariaDB [salmon]> create table shell (id integer primary key, name varchar(128));
Query OK, 0 rows affected (0.047 sec)
```

牡蠣とアワビを登録します

```
MariaDB [salmon]> insert into shell values (1, 'Oyster');
Query OK, 1 row affected (0.007 sec)
MariaDB [salmon]> insert into shell values (2, 'Abalone');
Query OK, 1 row affected (0.013 sec)
```

選択してみましょう

```
MariaDB [salmon]> select * from shell;
+----+---------+
| id | name    |
+----+---------+
|  1 | Oyster  |
|  2 | Abalone |
+----+---------+
2 rows in set (0.000 sec)
```

以上で、SQLが使えるところまで確認しました。


## その他

MySQLを別のマシンからアクセス可能にするためには、ポート3306番を外に向けてアクセス可能にしておく必要があります。

この辺りの設定は別ドキュメントにまとめたので参考にしてください

https://qiita.com/baykit/items/fa81303a844ffa11b2c7



## 結言

いかがだったでしょうか。

MariaDBの一般ユーザーインストール、何となくやればできそうな感じがしませんかｗ

最初がちょっと面倒ですが、インストールまで行ってしまえばあとは同じですし、しかも使いやすいと思うので、是非チャレンジしてみてください！

Enjoy!