ラズパイで作る自宅WEBサーバ:nginx編
第5回 MariaDB 設定
2026.10.29
ここではMySQLから派生したオープンソースのMariaDBを導入します。
Raspberry Pi 3 model A+などの512MB RAMのラズベリーパイでは、オリジナルのMySQLをインストールしようとするとメモリ不足でエラーになります。
そこで、個人利用では軽量のMariaDBを活用します。
●MariaDBインストール
$ apt-cache show mariadb-server
Package: mariadb-server
Source: mariadb
Version: 1:10.11.14-0ubuntu0.24.04.1
$ sudo apt install mariadb-server
mariadb-server (1:10.11.14-0ubuntu0.24.04.1) のトリガを処理しています ...
この処理には通常、数十秒〜数分で終わります。
途中で強制終了(Ctrl + C など)をしないでください。
パッケージの依存関係が壊れ、以降のアップデートでエラーが出る原因になります。
サービスの起動確認
$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.11.14 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-07-31 06:58:29 JST; 37min ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 15446 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 9 (limit: 57236)
Memory: 80.1M (peak: 83.3M)
CPU: 2.324s
CGroup: /system.slice/mariadb.service
mq15446 /usr/sbin/mariadbd
●MariaDBの初期設定
$ sudo mariadb-secure-installation
Enter current password for root (enter for none):[ENTER]
Switch to unix_socket authentication [Y/n] Y
Change the root password? [Y/n] Y
New password: ***********
Re-enter new password: ***********
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Thanks for using MariaDB!
●MariaDBの基本設定
コンソールからMariaDBサーバに接続します。
$ sudo mysql -u root -p mysql
Enter password: ***********
MariaDB [mysql]> status
状態を表示してみます。
mysql> status
--------------
mysql Ver 15.1 Distrib 10.11.14-MariaDB, for debian-linux-gnu (aarch64) using EditLine wrapper
Connection id: 42
Current database: mysql
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.11.14-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb3
Conn. characterset: utf8mb3
UNIX socket: /run/mysqld/mysqld.sock
Uptime: 33 min 35 sec
Threads: 1 Questions: 149 Slow queries: 0 Opens: 38 Open tables: 31 Queries per second avg: 0.073
--------------
$ sudo vi /etc/mysql/mariadb.cnf
[mysqld]セクションを作成して追記します。
default_password_lifetime = 0
全てのユーザーのパスワード期限を解除します
default-storage-engine = MyISAM
デフォルトのストレージエンジンをInnoDBからISAMに変更しています。
現在では特別な理由がない限りInnoDBを使用するのが一般的ですが、個人利用ではシンプルなISAMのほうが保守が容易です。
innodb_buffer_pool_size = 16M
innoDBのスプールサイズを変更しています。
デフォルトのInnoDBを使用される方はこの設定は必要ありません。
ISAMを使用する場合でも、MariaDBの一部のテーブルがInnoDBを使っている場合があるため、完全な無効化(skip-innodb)は推奨されません。
そこでメモリ節約するため、InnoDBのバッファスプールサイズを小さく設定します。
$ sudo service mysql restart
$ sudo mysql -u root -p mysql
MariaDB [mysql]> show global variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
●別サーバからのMySQLデータ移植
別サーバのMySQLデータベースからデータをCSV形式でファイルに落とします。
mysqldumpは、データベースの構造(スキーマ)やデータを復元可能なSQL文として出力するのですが、
MySQLからMariaDBに移行する際などにスキーマの定義エラーが発生してしまうことがあります。
移行先DBMSに予めデータベースを作成し、スキーマを定義しておき、データのみを移行するのであれば問題なくインポートすることができます。
テーブルデータのエクスポート
移行元サーバのデータベースからレコードをCSV形式でダウンロードします
$ vi export_table.sql
use example_database;
select * from example_table
into outfile '/example/data/example_table.csv'
fields terminated by ','
enclosed by '"'
lines terminated by '\r';
$ sudo mysql -u root -p mysql < export_table.sql
ERROR 1290 (HY000) at line 2: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
このエラーは、MySQLがファイルの読み書きを特定のフォルダのみに制限しているために発生します。不正なファイルの読み書きを防ぐためのセキュリティ機能です。
任意のフォルダにファイルを出力できるように、書込み制限を解除します。
$ sudo vi /etc/mysql/mariadb.cnf
[mysqld]
default_password_lifetime = 0
default-storage-engine=MyISAM
innodb_buffer_pool_size = 16M
secure-file-priv = /example
MariaDB11.8では、 = "" (無制限)は指定できないようです。
フォルダを指定すると、その配下のサブフォルダも書き込み可能になります。
$ sudo service mysql restart
$ sudo mysql -u root -p mysql
MariaDB [mysql]> select @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| /example/ |
+---------------------------+
親フォルダの所有者が root の場合、secure-file-priv の変更に失敗するかもしれません、
ルートにフォルダを作成して所有者を ubuntu などに設定してみてください。
$ sudo mysql -u root -p mysql < import_table.sql
テーブルデータのインポート
別サーバのMySQLからエクスポートしたCSV形式データをMariaDBに取込みます
$ vi import_table.sql
use example_database;
load data infile '/example/data/example_table.csv'
into table example_table
fields terminated by ','
enclosed by '"'
lines terminated by '\n';
$ sudo mysql -u root -p mysql < import_table.sql
●補足:AppArmorによる書き込みブロック
ERROR 1 (HY000) at line 2: Can't create/write to file '/7th-chord/suzukari/scripts/op31_acc.csv' (OS errno 13 - Permission denied)
MariaDBのデータをエクスポートしてファイルに保存する場合、AppArmor(アップアモール) または SELinux(エスイーリナックス/Security Enhanced Linux) というセキュリティ機能が書き込みをブロックしていることがあります。
$ dpkg --get-selections | grep selinux
libselinux1:arm64 install ← SELinux ランタイム共有ライブラリ
SELinuxはライブラリのみがインストールされています。
$ dpkg --get-selections | grep apparmor
apparmor install
libapparmor1:arm64 install
AppArmor (Application Armor/アプリケーションアーマー) は、アプリケーションのシステムアクセスを制限するセキュリティツールです。
ネットワークアクセス、ファイルへの読み書き実行などの機能を制限することができます。
sudo aa-status コマンドで mysqld が強制モードか確認し、設定ファイルを調整します。
$ sudo aa-status
2 processes are in enforce mode.
/usr/sbin/mysqld (328331)
/usr/sbin/named (41168) named
/usr/sbin/rsyslogd (758) rsyslogd
※Enforce mode:プロファイルが許可しない動作をブロック
※Complain mode:プロファイルが許可しない動作をブロックせずにログを残す
※通常、secure-file-priv を無効にすると、enforce mode の一覧から消えるようです
特定のプロファイルのみを無効化したい場合は、apparmor_parserコマンドでプロファイルをアンロードできます。
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
apparmorの書込み制限を元に戻す場合
$ sudo apparmor_parser /etc/apparmor.d/usr.sbin.mysqld
※apparmorを無効にする場合
$ sudo service apparmor stop
|