Ubuntu に MariaDB をセットアップ

PC-UNIX データベース

Ubuntu に MariaDB をセットアップする

Ununtu に MariaDB をセットアップする手順です。
MariaDB は MySQL の派生として開発されている、オープンソースのデータベース管理システムです。派生と言うか互換と認識しておくと実用には困りません。MySQL の非商用版から派生したという点で、原則オープンソース路線のデータベースシステムです。
MySQL は現在、オラクル社の商用ライセンス版と、GPLライセンス版などが存在し、多くはデュアルライセンス形態で提供されています。この場合、プログラムの複製、改変の可否などがややこしいので、商用利用する場合は、その問題の少ない MariaDB の方を採用するサーバー会社がここ数年以上、増えてきています。

設定環境

Linux 5.15.0-53-generic #59-Ubuntu SMP Mon Oct 17 18:53:30 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
mysql Ver 15.1 Distrib 10.6.11-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper

なお、MariaDB と MySQL は名前こそ違えど、設定ファイルなどほぼ共通で同じものとなっています。

MariaDBのインストールと設定

 bash
ubu@ntu:~$ sudo apt update
ubu@ntu:~$ sudo apt install mariadb-server mariadb-client

インストールしたら、とりあえずステータスの確認

 bash
ubu@ntu:~$ sudo systemctl status mariad

データベースが起動していない場合は

 bash
ubu@ntu:~$ sudo systemctl start mariadb

エラーログを取得するようにする

これから設定するにつき、データベースの中身以外の問題で、データベースサーバーが起動しないなどのトラブル解決の目安にするため、エラーログを取得するように設定します。

設定ファイル 50-server.cnf にエラーログに関する項目を書き込みます。

 bash
ubu@ntu:~$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

約 57 行目あたりのコメントをはずします。

 bash
# When running under systemd, error logging goes via stdout/stderr to journald
# and when running legacy init error logging goes to syslog due to
# /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf
# Enable this if you want to have error logging into a separate file
log_error = /var/log/mysql/error.log
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log

次に、ファイルサイズ0のからファイルを作成します。
その際に所有者権限とパーミッションをしっかり設定します。

 bash
ubu@ntu:~$ sudo touch /var/log/mysql/error.log
ubu@ntu:~$ sudo chown mysql:adm /var/log/mysql/error.log
ubu@ntu:~$ sudo chmod 640 /var/log/mysql/error.log

確認します。

 bash
ubu@ntu:~$ ls -la /var/log/mysql/
total 8
drwxr-s---  2 mysql adm    4096 Nov 25 19:12 .
drwxrwxr-x 12 root  syslog 4096 Nov 20 06:35 ..
-rw-r-----  1 mysql adm       0 Nov 25 19:12 error.log

データベースの設定

まず、データベースに書き込まれた文字をソートしたりする際の、比較ルール(照会順序:collation)を設定します。大文字と小文字を区別するかしないかなどのルールのことです。

MariaDB では、デフォルト値があまり良くなく、大文字と小文字を区別しないルール(照会順序)utf8mb4_general_ci が設定されています(しかしこちらのほうが処理は速いです)。
セキュリティ的に少しは強固な utf8mb4_bin を設定することで、大文字と小文字を区別して比較するようになります。

以上の設定は、設定ファイル 50-server.cnf に書き込みます。

 bash
ubu@ntu:~$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

デフォルトでは、90~91 行あたりに

 bash
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

という記載がありますので、

 bash
character-set-server  = utf8mb4
collation-server      = utf8mb4_bin

に変更します。
MariaDB を再起動すれば設定完了ですが、その他の設定も行ってから再起動することにします。

MySQL の utf8 の小話

なお、utf8mb4 は1~4バイトで文字を表すいわゆる俗に言う utf8 のことなのですが、MySQL の utf8 は1~3バイトまでしか対応しておらず、フルの utf8 ではありません。MySQL の utf8 というのは、utf8mb3 のことで、3バイトの utf8 文字セットのことです。Unicode で定義されている文字のうち限定的なセットしかサポートしないものです。

utf8mb3 では、データとして格納されるコード「U+4D0D」みたいな文字はデータベースには格納できますが、「U+19E1D」や「U+1F610」(絵文字)みたいなものはたとえ uft8 であっても格納できずエラーになります。つまり4バイトをフルに使った utf8 を使いたい場合は、文字コード utf8mb4 を指定する必要があります。こうすることで、いわゆる絵文字や追加の漢字(主に中国語)までサポートされることになります。

要するに、絵文字や中国語をしっかり格納したいなら、 utf8mb4 を指定してデータベースのテーブルのデータ型サイズを少し大きめにとってやる必要があります。
ただ、今後は utf8mb3 は削除される予定で、utf8 と指定すれば utf8mb4 を意味することになるはずです。現在は明示的に utf8mb4 するのが無難です。

「照会順序:Collation」の話

文字コードは utf8mb4 を使うとしたら、照会順序(Collation)は次の4通りが指定できます。

  • utf8mb4_general_ci
  • utf8mb4_unicode_ci
  • utf8mb4_unicode_520_ci
  • utf8mb4_bin

この中で、文字を検索・比較するときに最も厳密に区別するのが utf8mb4_binです。
それ以外のものは大文字、小文字、濁点付き文字(「は」と「ぱ」と「ば」など)を区別しなかったり、絵文字を区別しなかったりと行ったものになります。

区別するしないはwhere句やJoin、ソート順で影響がでます。
何をどう区別しないかは、本ページの最後に表にしてあります。興味がある方はご参照ください。実用的なのは utf8mb4_bin とあえて言えば utf8mb4_general_ci ぐらいです。utf8mb4_bin の方をおすすめします。

データベースの文字コードの設定

MariaDB の文字コードを設定しておきます。
日本語の文字化け対策として、utf8mb4(UTF-8)に統一しておきます。

 bash
ubu@ntu:~$ sudo vi /etc/mysql/my.cnf

として、ファイルの最後尾に

 bash
[mysqld]
character-set-server=utf8mb4
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

を追加します。

データベースの再起動を行います。

 bash
ubu@ntu:~$ sudo service mariadb restart

データベースの管理パスワードを設定

MariaDB のインストール直後では管理パスワードなどが設定されていないので、デフォルトのセキュリティスクリプトを実行して整えます。設定そのものは以下の記事名も詳しく書いています。

 bash
ubu@ntu:~$ sudo mysql_secure_installation
関連記事
FreeBSD MySQL インストール
FreeBSD に MySQL を設定する手順

前回、Cygwin に MySQL を設定するときは、あまり考えることなくスムーズに設定ができてしまいましたが、本格運用 ...

続きを見る

今回の例で設定したのは以下の通り。
使い勝手を最優先して、セキュリティ的に甘くしていますので、一般公開するようなサーバーに設定するのはおすすめしません。
赤太字で設定しているところは、デフォルトを拒んでセキュリティを緩めています。

 bash
ubu@ntu:~$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n]
Enabled successfully!
Reloading privilege tables..
 ... Success!
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
 ... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] n
 ... skipping.
Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
 ... skipping.
By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] n
 ... skipping.
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]
 ... Success!
Cleaning up...
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!

[読み飛ばしOK]root のパスワードを無くす

本サイト的には、MariaDB と WordPress、そして LiteSpeed をテストしたいので、MariaDB の root のパスワードを無くします。つまり誰でも root でデータベースにアクセスできますので、セキュリティ的には最悪ですが、テストということで無茶します。
普通はデータベースをテストするときもテスト用のパスワードを設定してください。

まず、乱暴ですがシステムユーザーとしての root でデータベースの root として接続します。

ネーテ
PC-UNIX/OS のシステムユーザーとしての root と、MariaDB のデータベースユーザーとしての root は意味が違います。システムの root ユーザーの方が権限が強いのは当たり前で、MariaDB の root のパスワードを知らなくてもアクセスできてしまうということを利用します。

 bash
ubu@ntu:~$ sudo mysql -u root

MariaDB root パスワード

なお、別の WEB サーバーなど(本データベースをインストールしたものとは別の IP のマシン)から MariaDB にアクセスしたい場合は、ファイアウォールの 3306 番ポートを開放しておく必要があります。

データベースを作成する。

MariaDB にログインしてデータベースを作成します。ここでは、今後 WordPress に使うデータベースを作成するという体で進めます。

まずログインを行います。

MariaDB の root のパスワードを設定していない場合は、

 bash
ubu@ntu:~$ mysql -u root

MariaDB の root のパスワードを設定している場合は、

 bash
ubu@ntu:~$ mysql -u root -p

パスワードを入力してログインします。

データベースの作成は CREATE DATABASE で行います。

CREATE DATABASE 作成するデータベース名 CHARACTER SET UTF8;

ここでは wordpress というデータベース名で作成してみます。

 bash
ubu@ntu:~$
MariaDB> CREATE DATABASE wordpress CHARACTER SET UTF8

データベースを抜けるときは「\q」とコマンドします。
一連の流れは以下の通り。

MariaDB CREATE DATABASE

データベースの文字コードは以下のようにして確認できます。

 bash
MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.002 sec)

[オマケ]「照会順序:Collation」の厳密な区別の有無

Collation大小文字絵文字濁点
utf8mb4_general_ci
utf8mb4_unicode_ci
utf8mb4_unicode_520_ci
utf8mb4_bin

RECOMMEND

-PC-UNIX, データベース
-, , ,