MariaDBをインストール・設定する方法

yum list installed | grep mariadb
実行結果
MariaDB-client.x86_64                 10.3.28-1.el7.centos           @mariadb
MariaDB-common.x86_64                 10.3.28-1.el7.centos           @mariadb
MariaDB-compat.x86_64                 10.3.28-1.el7.centos           @mariadb
MariaDB-devel.x86_64                  10.3.28-1.el7.centos           @mariadb
MariaDB-server.x86_64                 10.3.28-1.el7.centos           @mariadb
galera.x86_64                         25.3.32-1.el7.centos           @mariadb

MariaDB-server.x86_64がMariaDBの本体

mariadb-libs.x86_64のようなものだけが表示されて、
MariaDB-server.x86_64が表示されない場合は、MariaDBがインストールされていない

mariadb.repo(mariadbのリポジトリ)がcentos上にあるかを確認する

ls -l /etc/yum.repos.d | egrep 'mariadb'

上記のコマンドで何も表示されなければリポジトリが存在しない

MariaDB公式・MariaDB Server Repositories

vi /etc/yum.repos.d/mariadb.repo

/etc/yum.repos.dディレクトリに
mariadb.repoというファイルを新規作成

mariadb.repo
# MariaDB 10.11 CentOS repository list - created 2023-05-19 02:46 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/10.11/centos/$releasever/$basearch
baseurl = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/10.11/centos/$releasever/$basearch
module_hotfixes = 1
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1

mariadb.repoの中に上記のようなものを書く

OSのバージョンや、インストールするMariaDBのバージョンによってリポジトリの書き方が違う

MariaDB公式・MariaDB Server Repositories

上記のサイトでは
Choose a distributionでOSを選択し
Choose a MariaDB Server versionでMariaDBのバージョンを選択すれば
mariadb.repoに書くべき内容を自動的に生成してくれる

MariaDBリポジトリを作成する方法(旧)

cat /etc/yum.repos.d/mariadb.repo

MariaDB用リポジトリの情報を確認する

yum list MariaDB*
yum install mariadb-server -y

上記のコマンドでMariaDBをインストールできる

yum install mariadb-server -y
実行結果抜粋
--> Finished Dependency Resolution
Error: Package: MariaDB-server-10.11.centos.x86_64 (mariadb-main)
           Requires: pv
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

上記のようなエラーになる場合、MariaDBの前提条件となるpvというパッケージがないのでエラーになっている

EPELをインストールする

yum install epel-release
yum update

上記のコマンドでepel-releaseをインストールし、さらにupdateをかけてやれば
依存関係が解決してMariaDBのインストールができるようになるはず

すでにインストール済みのMariaDBをアップデートする場合は下記のコマンド

systemctl stop mariadb
yum update mariadb-server

サービスを停止してからアップデートをする

systemctl enable mariadb
systemctl start mariadb

MariaDBサービスを自動起動に設定
MariaDBサービスを起動

mysql --version

上記コマンドで確認できるのはmysqlというMySQLクライアント(コマンドラインツール)のバージョン
MySQL(MariaDB)本体のバージョンとは別物なので注意

mysql

mysqlにログイン


mysqlにログイン後、下記のコマンドを実行

MariaDB [(none)]> status
実行結果
mysql  Ver 15.1 Distrib 10.11.3-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:          3
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.11.3-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8mb3
Conn.  characterset:    utf8mb3
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 1 hour 9 min 22 sec

MySQLサーバーのバージョン、使用中のユーザー名、データベース名、文字コードなどが表示される

mysql

mysqlにログイン

MariaDB [(none)]> SHOW DATABASES;
実行結果
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.000 sec)

データベース一覧を表示

mysqlはユーザーのIDやパスワードなどが格納されているデータベース

testというデーターベースは不要なので削除する

MariaDB [(none)]> DROP DATABASE test;
MariaDB [(none)]> SELECT user, host, password FROM mysql.user;
実行結果
+-------------+-----------------------+----------+
| User        | Host                  | Password |
+-------------+-----------------------+----------+
| mariadb.sys | localhost             |          |
| root        | localhost             | invalid  |
| mysql       | localhost             | invalid  |
|             | localhost             |          |
|             | localhost.localdomain |          |
+-------------+-----------------------+----------+
5 rows in set (0.001 sec)

デフォルトでは上記のようなユーザーが用意されている

rootPasswordinvalidとなっている
これは、rootのパスワードが設定されていないため

このままだと、誰でもmysqlにログインできてしまうので危険
パスワードの設定が必要

mysql

mysqlにログイン

ユーザーを指定せずにログインすると
現在OSにログイン中のユーザーとなる

MariaDB [(none)]> status
実行結果
mysql  Ver 15.1 Distrib 10.6.3-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:          6
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.6.3-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8mb3
Conn.  characterset:    utf8mb3
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 14 min 46 sec

Current userroot@localhostとなっている

MariaDB [(none)]> SET PASSWORD = PASSWORD('xxxxxxxx');

Current userのパスワードをxxxxxxxxに変更

PASSWORD('xxxxxxxx')のようにすることで、平文のxxxxxxxxではなく、暗号化したものが保存される

xxxxxxxxの部分は、実際には任意の文字列を入れる

MariaDB [(none)]> SELECT user, host, password FROM mysql.user;
+-------------+-----------------------+-------------------------------------------+
| User        | Host                  | Password                                  |
+-------------+-----------------------+-------------------------------------------+
| mariadb.sys | localhost             |                                           |
| root        | localhost             | *ZZZZZZZZZZZZZZZZZZZZZZZZZZ               |
| mysql       | localhost             | invalid                                   |
|             | localhost             |                                           |
|             | localhost.localdomain |                                           |
+-------------+-----------------------+-------------------------------------------+
5 rows in set (0.001 sec)

rootPasswordが、invalidから英数字の羅列に変わっていればOK

パスワードが設定されていない匿名ユーザーが存在すると
ユーザー名とパスワードがなくてもmysqlにログインできてしまう

セキュリティ的に好ましくないので、匿名ユーザーは削除する

MariaDB [(none)]> DROP USER ''@localhost;
MariaDB [(none)]> DROP USER ''@localhost.localdomain;

匿名ユーザーを削除

MariaDB [(none)]> SELECT user, host, password FROM mysql.user;
+-------------+-----------------------+-------------------------------------------+
| User        | Host                  | Password                                  |
+-------------+-----------------------+-------------------------------------------+
| mariadb.sys | localhost             |                                           |
| root        | localhost             | *ZZZZZZZZZZZZZZZZZZZZZZZZZZ               |
| mysql       | localhost             | invalid                                   |
+-------------+-----------------------+-------------------------------------------+
3 rows in set (0.001 sec)

Userが空欄の2つのユーザーが消えたことを確認

mysql -u root -p

-uオプションでユーザーrootを指定している

-pオプションを付けると、コマンド実行後に
Enter password:
と表示され、パスワード入力が必要になる

MariaDB10.4以降の機能で、unix_socketというものがある

デフォルトでは、root@localhostユーザーのauthentication_pluginunix_socketが設定されている

これが設定してあると、CentOSへログイン中のユーザー名とmysqlに作成済のユーザー名が一致すると、パスワード入力なしでmysqlにログインできてしまう

mysql

suでrootユーザになっているときなど、パスワード入力なしでmysqlにログインできてしまう

MariaDB [(none)]> SELECT user,host,password,plugin FROM mysql.user;
+-------------+-----------+-------------------------------------------+-----------------------+
| User        | Host      | Password                                  | plugin                |
+-------------+-----------+-------------------------------------------+-----------------------+
| mariadb.sys | localhost |                                           | mysql_native_password |
| root        | localhost | *xxxxxxxxxx                               | mysql_native_password |
| mysql       | localhost | invalid                                   | mysql_native_password |
+-------------+-----------+-------------------------------------------+-----------------------+

pluginmysql_native_passwordと表示されている

このpluginauthentication_pluginのこと
authentication_pluginには複数の値を設定できるが、ここでは1つしか表示されない

MariaDB [(none)]> SHOW GRANTS FOR root@localhost;

Grants for root@localhost
GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING '*xxxxxxxxxx' OR unix_socket WITH GRANT OPTION
GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION

SHOW GRANTSを確認すると
authentication_pluginとして、mysql_native_passwordだけでなくunix_socketも設定されている

unix_socketがあると
CentOSにrootでログイン済みの場合
mysqlのroot@localhostへは、パスワード入力なしでログインできる

ALTER USER user@host IDENTIFIED BY 'password'
の形式でパスワードを再設定するとauthentication_pluginからunix_socketが削除される

MariaDB [(none)]> ALTER USER root@localhost IDENTIFIED BY 'xxxx';

ALTER USERでユーザーの設定を変更するときに
IDENTIFIED BYでパスワードを設定することで
authentication_pluginmysql_native_passwordのみになる

つまり
mysql_native_password or unix_socket
という状態から
mysql_native_password
という状態になる
unix_socketが消える)

MariaDB [(none)]> SHOW GRANTS FOR root@localhost;
+--------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                              |
+--------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED BY PASSWORD '*xxxxxxxx' WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                          |
+--------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

OR unix_socketの表示が消えている

mysql_native_passwordの表示も消えているが
IDENTIFIED BY PASSWORDというのは、暗黙的にauthentication_pluginmysql_native_passwordであることを意味する

MariaDB [(none)]> ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD('xxxxxxxx') OR unix_socket;

ALTER USERのときにORを使うと複数のauthentication_pluginを指定できる

また、
IDENTIFIED BY xxxではなく、
IDENTIFIED VIA yyy USING xxxのような形式になっていることに注意

IDENTIFIED BY xxxでは、authentication_pluginが暗黙的にmysql_native_passwordとなる

IDENTIFIED VIA yyy USING xxxでは、yyyの部分がauthentication_pluginの種類(mysql_native_password )、xxxの部分がパスワード

MariaDB [(none)]> SHOW GRANTS FOR root@localhost;

Grants for root@localhost
GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING '*xxxxxxxxxx' OR unix_socket WITH GRANT OPTION
GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION

unix_socketの効果により
CentOSへログイン済みのユーザーは
mysqlへ同名のユーザーとしてパスワード入力なしでログインできる
(mysqlで同名のユーザーが作成済みの場合)

MariaDB公式・ALTER USER
MariaDB公式・Authentication Plugin - Unix Socket

SHOW VARIABLES LIKE "char%";
実行結果
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb3                    |
| character_set_connection | utf8mb3                    |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb3                    |
| character_set_server     | latin1                     |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.001 sec)

charで始まるシステム変数の値を表示

デフォルトでは

  • utf8mb3
  • latin1

などが混在している

これらをutf8mb4で統一する

MySQLのutf8系文字コードには以下の3つがある

  • utf8mb3(3バイト、疑似UTF-8)
  • utf8mb4(4バイト、本物のUTF-8)
  • utf8(utf8mb3の別名)

MySQLの文字コードが
utf8mb3utf8となっていた場合
それらは疑似UTF-8であり、本物のUTF-8ではない
utf8mb3だと絵文字や常用外漢字などが文字化けする)

utf8mb4というのが本物のUTF-8に相当する

昔はutf8しかなくて、中身は3バイトの疑似UTF-8だった
後からutf8mb4が登場し、真正UTF-8がMySQLで使えるようになった
utf8mb4の登場に伴い、旧来のutf8utf8mb3という別名が付けられた

vi /etc/my.cnf

my.cnf(mysqlの設定ファイル)を開く

my.cnf抜粋
[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

my.cnfというファイルに上記を追加

[mysqld]というのは、mysqlサーバーへの設定
[mysql]というのは、mysqlクライアントへの設定

my.cnf(変更前)
#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include *.cnf from the config directory
#
!includedir /etc/my.cnf.d
my.cnf(変更後)
#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]

[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

#
# include *.cnf from the config directory
#
!includedir /etc/my.cnf.d
systemctl restart mysql

my.cnfへの変更を反映させるために、mysqlを再起動

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/ |
+--------------------------+----------------------------+

character_set_filesystemは、binaryのままでOK
character_set_systemは、utf8またはutf8mb3のままでOK

それ以外のものがutf8mb4となっていることを確認する

cd /etc/my.cnf.d
vi server.cnf

server.cnf(MySQLの設定ファイル)を開く

server.cnf
[mariadb]
log_error = /var/log/mysql/mariadb_error.log

[mariadb]の部分はもともとあるはずなので、その下に
log_error = /var/log/mysql/mariadb_error.log
の1行を追加

mkdir -p /var/log/mysql
cd /var/log/mysql

touch mariadb_error.log

chown -R mysql:mysql .

/var/log/mysqlというディレクトリを新規作成
(もともと/var/logというディレクトリは存在するが、その中にmysqlというディレクトリはないので作成している)

mariadb_error.logというファイルを新規作成

mysqlディレクトリとmariadb_error.logファイルの所有者をmysql:mysqlに設定

systemctl restart mysql

mysqlを再起動後
/var/log/mysqlmariadb_error.logに起動ログが記録されることを確認する

tail -n 10 /var/log/mysqlmariadb_error.log
実行結果
2023-05-19 14:02:00 0 [Note] /usr/sbin/mariadbd: ready for connections.

のようなログが記録されていればOK

MySQLの使い方

MariaDBのインストールと初期設定完了後
運用で使うコマンドなどのまとめ

  • 最終更新: 2023/05/25 15:02