MariaDBとMySQLのマルチインスタンス運用:最適な共存戦略

2025-05-27

MariaDB と MySQL を共存させる際の基本的な考え方

  • サービス名の区別
    システムサービスとして起動する場合、それぞれのデータベースに異なるサービス名(例:mysqldmariadb)を割り当てることで、個別に起動・停止できるようになります。
  • ソケットファイルの分離
    UNIXソケットを使用する場合も、ソケットファイルの名前とパスをそれぞれ異なるものにする必要があります。
  • 設定ファイルの分離
    各データベースインスタンスは、それぞれ独立した設定ファイル(my.cnf など)を持つべきです。
  • データディレクトリの分離
    データベースのデータが保存されるディレクトリも、それぞれ個別に設定する必要があります。これにより、データの競合や破損を防ぎます。
  • ポート番号の変更
    デフォルトでは、MySQL と MariaDB はどちらもポート番号 3306 を使用します。共存させるには、どちらか一方(通常は後からインストールする方)のポート番号を変更する必要があります。例えば、MariaDB を 3307 に設定するなどです。

共存のメリット

  • 特定の機能の利用
    MariaDB または MySQL のどちらか一方にしかない特定の機能を利用したい場合に便利です。
  • テスト環境
    新しいデータベースのバージョンや異なるデータベースをテストする際に、既存の環境を壊さずに検証できます。
  • 段階的な移行
    MySQL から MariaDB へ、またはその逆へ、アプリケーションやデータを一度に移行するのではなく、段階的に移行することができます。

具体的なインストール手順(一般的なLinux環境を想定)

具体的な手順はOSやインストール方法(パッケージマネージャを使うか、ソースからビルドするか)によって異なりますが、基本的な流れは以下のようになります。

    • すでにMySQLがインストールされている場合、そのバージョン、データディレクトリ、設定ファイルなどを確認します。
    • 重要
      既存のMySQLデータベースのバックアップを必ず取得してください。mysqldump コマンドが一般的です。
  1. MariaDBのダウンロードとインストール

    • MariaDB公式サイトから、使用しているOSに合ったバイナリパッケージまたはソースコードをダウンロードします。
    • パッケージマネージャ(apt, yum, dnfなど)を使用する場合、通常はMariaDBがMySQLと競合しないように設定が用意されていますが、注意が必要です。
  2. MariaDBの設定ファイルの編集

    • MariaDB の設定ファイル (my.cnf または mariadb.cnf など) を編集します。
    • 以下の点を特に注意して設定します。
      • port: MySQLと異なるポート番号を指定します。(例: port = 3307
      • datadir: MySQLのデータディレクトリと異なるパスを指定します。(例: datadir = /opt/mariadb/data
      • socket: MySQLのソケットファイルと異なるパスを指定します。(例: socket = /opt/mariadb/mariadb.sock
      • basedir: MariaDBのインストールディレクトリのパスを指定します。(例: basedir = /opt/mariadb
      • pid-file: プロセスIDファイルのパスも、競合しないように設定します。
  3. MariaDBの初期化と権限設定

    • MariaDB のデータディレクトリを初期化します。mariadb-install-db コマンドを使用します。この際、上記で設定した defaults-file オプションを使って、MariaDB専用の設定ファイルを指定することが重要です。
    • データディレクトリの所有権を MariaDB を実行するユーザー(通常は mysql または mariadb)に設定します。
  4. MariaDBのサービス登録と起動

    • MariaDB をシステムサービスとして登録し、起動します。
    • /etc/init.d/ ディレクトリに、MariaDB 用の起動スクリプトをコピーまたは作成し、編集します。スクリプト内で、MariaDB の basedirdatadirmy.cnf のパスを正しく指定することが肝要です。
    • systemctlservice コマンドで MariaDB サービスを起動し、正常に動作することを確認します。
  5. クライアントからの接続

    • MariaDB に接続する際は、設定したポート番号やソケットファイルを明示的に指定する必要があります。
      • mysql -P 3307 -h 127.0.0.1 -u root -p (ポート指定)
      • mysql --socket=/opt/mariadb/mariadb.sock -u root -p (ソケット指定)

注意点

  • 管理の複雑さ
    複数のデータベースインスタンスを管理することになるため、運用が複雑になる可能性があります。
  • リソース
    2つのデータベースサーバーが同時に稼働するため、システムのリソース(メモリ、CPU、ディスクI/O)消費が増加します。サーバーのスペックを考慮する必要があります。
  • 互換性
    MariaDB は MySQL のドロップインリプレースメントとして設計されていますが、バージョンによっては細かな非互換性がある場合があります。特に、新しい機能やストレージエンジンを使用する場合は注意が必要です。


MariaDBとMySQLは、互換性があるとはいえ、共存させるためには細心の注意が必要です。特に設定ミスが原因で問題が発生することが多いため、エラーメッセージを正確に読み取り、適切な対応をすることが重要です。

ポート番号の競合 (Port Conflict)

  • トラブルシューティング

    1. 現在使用中のポートを確認する
      sudo lsof -i :3306
      sudo netstat -tuln | grep 3306
      
      もし、どちらかのデータベースが起動している場合、そのプロセスID (PID) とコマンドが表示されます。
    2. MariaDBのポート番号を変更する
      MariaDBの設定ファイル(通常は /etc/my.cnf/etc/mysql/my.cnf、またはMariaDB専用のパス /opt/mariadb/my.cnf など)を開き、[mysqld] セクションに以下のように異なるポート番号を指定します。
      [mysqld]
      port = 3307  # MySQLとは異なるポート番号を設定
      
    3. MariaDBを再起動する
      設定変更後、MariaDBサービスを再起動します。
      sudo systemctl restart mariadb  # または service mariadb restart
      
    4. 接続時にポートを指定する
      MariaDBに接続する際は、新しいポート番号を明示的に指定します。
      mysql -P 3307 -u root -p
      
  • 原因
    MySQLとMariaDBが同じポート番号(デフォルトでは3306)を使用しようとしているため、どちらか一方しか起動できません。

    • Can't start server: Bind on TCP/IP port: Address already in use
    • mysqld_safe A mysqld process already exists
    • ERROR 2002 (HY000): Can't connect to local MySQL server through socket (ポート指定なしの場合)

データディレクトリの競合 (Data Directory Conflict)

  • トラブルシューティング

    1. MariaDBのデータディレクトリを変更する
      MariaDBの設定ファイルで、datadir パラメータをMySQLのデータディレクトリ(通常/var/lib/mysql)とは異なるパスに設定します。
      [mysqld]
      datadir = /opt/mariadb/data  # MySQLとは異なるパスを設定
      
    2. データディレクトリの作成と権限設定
      新しいデータディレクトリを作成し、MariaDBがアクセスできるように適切な権限を設定します。
      sudo mkdir -p /opt/mariadb/data
      sudo chown -R mysql:mysql /opt/mariadb/data  # または mariadb:mariadb
      sudo chmod 750 /opt/mariadb/data
      
    3. MariaDBのデータディレクトリを初期化する
      新しいデータディレクトリを設定した場合、データベースを初期化する必要があります。
      sudo mariadb-install-db --user=mysql --datadir=/opt/mariadb/data --defaults-file=/path/to/mariadb/my.cnf
      # --defaults-file はMariaDB専用の設定ファイルパスを指定
      
      注意: 既存のMySQLデータとは別に、MariaDB用の初期データベースが作成されます。
  • 原因
    MySQLとMariaDBが同じデータディレクトリを使用しようとしている、またはMariaDBがデータディレクトリを見つけられない。

  • エラー例

    • [ERROR] mysqld: File '/var/lib/mysql/mysql.sock' not found (Errcode: 2) (ソケットファイルが見つからない)
    • データベースが正常に起動しない、データが読み込めない。

ソケットファイルの競合 (Socket File Conflict)

  • トラブルシューティング

    1. MariaDBのソケットファイルを変更する
      MariaDBの設定ファイルで、socket パラメータをMySQLのソケットファイルとは異なるパスに設定します。
      [mysqld]
      socket = /opt/mariadb/mariadb.sock # MySQLとは異なるパスを設定
      
    2. ソケットディレクトリの作成と権限設定
      必要であればソケットファイルを置くディレクトリを作成し、権限を設定します。
    3. 接続時にソケットを指定する
      MariaDBに接続する際は、新しいソケットファイルを明示的に指定します。
      mysql --socket=/opt/mariadb/mariadb.sock -u root -p
      
  • 原因
    MySQLとMariaDBが同じUNIXソケットファイル(通常/var/run/mysqld/mysqld.sock)を使用しようとしている。

  • エラー例

    • ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
    • [ERROR] Can't start server: Bind on UNIX socket: Address already in use

設定ファイルの読み込み順序・競合 (Configuration File Loading Order/Conflict)

  • トラブルシューティング

    1. 設定ファイルの読み込み順序を理解する
      MySQLとMariaDBは、複数の場所にある設定ファイルを読み込みます。一般的な読み込み順序は、 /etc/my.cnf -> /etc/mysql/my.cnf -> /etc/mysql/conf.d/*.cnf -> $HOME/.my.cnf などです。MariaDBの場合、/etc/my.cnf.d/*.cnf/etc/mariadb/conf.d/*.cnf なども含まれることがあります。
    2. 専用の設定ファイルを作成する
      MariaDB専用のインスタンスとして設定する場合は、MySQLの設定ファイルに影響されないように、MariaDBの--defaults-fileオプションで読み込む専用のmy.cnfを作成し、そこに全てのMariaDB固有の設定を記述するのが最も安全です。 例: sudo mariadbd --defaults-file=/opt/mariadb/my.cnf
    3. 重複する設定を排除する
      特に port, datadir, socket, pid-file などの基本的なパラメータは、各データベースインスタンスで一意になるように確認します。
  • 原因
    複数の設定ファイルが同じパラメータを定義しており、読み込み順序によって意図しない値が適用されたり、構文エラーが発生している。

  • エラー例
    意図しない設定が適用されたり、データベースが起動しない。

サービス名の競合と起動スクリプトの問題 (Service Name Conflict & Init Script Issues)

  • トラブルシューティング

    1. MariaDBのサービス名を区別する
      もし同じサービス名を使用している場合、MariaDBのサービス名を mariadb または mariadbd など、MySQLとは異なる名前に変更します。
    2. 起動スクリプトの修正
      MariaDBのインストール時に提供される起動スクリプト(例: /etc/init.d/mysql.server または /etc/init.d/mariadb)をコピーして、MariaDB用にカスタマイズします。
      • スクリプト内で指定されている basedirdatadirsocketpid-file などのパスがMariaDBの正しいパスを指していることを確認します。
      • 特に、mysqld_safe コマンドに --defaults-file オプションを追加し、MariaDB専用の設定ファイルを読み込ませるように変更します。
        # 例: /etc/init.d/mariadb の一部
        # ...
        # Give extra arguments to mysqld with the my.cnf file.
        # This script may be overwritten at next upgrade.
        $bindir/mysqld_safe --defaults-file=/opt/mariadb/my.cnf --datadir=$datadir --pid-file=$pid_file \
        --socket=$socket \
        # ...
        
    3. systemd設定のリロード
      systemdを使用している場合、サービス定義ファイルを変更したら必ずリロードします。
      sudo systemctl daemon-reload
      sudo systemctl start mariadb
      sudo systemctl status mariadb
      
  • 原因
    システムサービス(systemd または SysVinit)の定義が不適切で、MariaDBとMySQLが同じサービス名を使っていたり、MariaDBの起動スクリプトが正しく設定されていない。

  • エラー例

    • systemctl start mysql を実行してもMariaDBが起動してしまう。
    • MariaDBサービスが起動しない。
    • Job for mariadb.service failed because the control process exited with error code.

ユーザー権限の問題 (Permission Issues)

  • トラブルシューティング

    1. ディレクトリの所有者と権限を確認・修正する
      MariaDBが実行されるユーザー(通常 mysql または mariadb)が、設定ファイルで指定した datadirlog_error のパス、socket のパス、pid-file のパスに書き込み権限を持っていることを確認します。
      sudo chown -R mysql:mysql /opt/mariadb/data # MariaDBのデータディレクトリ
      sudo chown mysql:mysql /var/log/mariadb/mariadb.log # MariaDBのログファイル
      sudo chmod 750 /opt/mariadb/data
      
  • 原因
    MariaDBプロセスがデータディレクトリ、ログディレクトリ、ソケットファイルディレクトリなどへの書き込み権限を持っていない。

  • エラー例

    • Can't change dir to '/var/lib/mysql/...' (Errcode: 13 "Permission denied")
    • MariaDBがデータディレクトリやログファイルに書き込めない。

パッケージマネージャの競合 (Package Manager Conflicts)

  • トラブルシューティング

    1. 両方をパッケージマネージャでインストールしない
      もしMySQLがパッケージマネージャでインストールされている場合、MariaDBはバイナリから手動でインストールするなど、パッケージマネージャの管理外でセットアップすることを検討します。
    2. 依存関係の確認と対処
      yumapt などでエラーが出る場合、依存関係を無視して強制的にインストールするオプションもありますが、これは推奨されません。最悪の場合、システムのパッケージ管理を壊す可能性があります。
    3. コンテナ化を検討する
      DockerやLXCなどのコンテナ技術を利用すると、MySQLとMariaDBを完全に分離された環境で実行できるため、パッケージマネージャの競合やシステムレベルでの設定の複雑さを回避できます。これは最も推奨される共存方法の一つです。
  • 原因
    Red Hat系(CentOS, RHEL)や一部のDebian系(Ubuntu)では、デフォルトのリポジトリでMySQLとMariaDBが競合するパッケージとして扱われることがあります。

  • エラー例

    • package mysql-server conflicts with mariadb-server
    • unmet dependencies

エラーログの確認 (Check Error Logs)

  • 内容
    エラーログには、データベースが起動できなかったり、クラッシュしたりした原因の詳細な情報が記録されています。この情報がトラブルシューティングの鍵となります。
  • 場所
    設定ファイルで log_error パラメータに指定されているパスを確認します。指定がない場合、デフォルトはデータディレクトリ内(例:/var/lib/mysql/hostname.err)や/var/log/mysql/error.log/var/log/mariadb/mariadb.logなどです。
  • 非常に重要
    上記のどのトラブルシューティングを試すにしても、まず最初に行うべきことは、データベースのエラーログを確認することです。


重要な注意点

  • バックアップ
    作業を行う前に、必ず既存のデータベースのバックアップを取ってください。
  • パス
    各ディレクトリやファイルのパスは、お使いの環境やインストール方法によって異なる場合があります。適宜読み替えてください。
  • 権限
    以下の操作の多くは root ユーザーまたは sudo 権限が必要です。
  • 環境
    ここでの例は、Linux 環境(CentOS, Ubuntu など)を想定しています。

MariaDB の設定ファイル (my.cnf) の例

MariaDB を MySQL とは別のインスタンスとして起動するために、専用の設定ファイルを作成します。ここでは /etc/my.cnf.d/mariadb.cnf というファイル名で設定します。

# /etc/my.cnf.d/mariadb.cnf (MariaDB専用の設定ファイル)

[client]
port = 3307
socket = /var/run/mysqld/mariadb.sock # MariaDB専用のソケットファイル

[mysqld]
# 基本設定
user = mysql                 # MariaDBを実行するユーザー (mysqlユーザーまたはmariadbユーザー)
port = 3307                  # MySQLとは異なるポート番号
datadir = /var/lib/mariadb   # MariaDB専用のデータディレクトリ
socket = /var/run/mysqld/mariadb.sock # MariaDB専用のソケットファイル
pid-file = /var/run/mysqld/mariadb.pid # MariaDB専用のPIDファイル
basedir = /usr               # MariaDBのインストールベースディレクトリ (環境により異なる)
tmpdir = /tmp

# その他の推奨設定 (必要に応じて調整)
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 64M
thread_stack = 256K
thread_cache_size = 8
myisam_recover_options = BACKUP
max_connections = 100
query_cache_limit = 1M
query_cache_size = 16M

# InnoDBの設定
innodb_buffer_pool_size = 128M
innodb_log_file_size = 48M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

# エラーログのパス (MariaDB専用)
log_error = /var/log/mariadb/mariadb_error.log

# バイナリログ (レプリケーションなどが必要な場合)
# log_bin = /var/log/mariadb/mariadb-bin
# server_id = 2 # MySQLとは異なるID

ポイント

  • log_error は、MariaDB専用のエラーログのパスを指定します。
  • basedir は、MariaDB のインストールルートディレクトリです。パッケージインストールの場合、/usr が一般的です。
  • user は、MariaDB プロセスを実行するシステムユーザーを指定します。通常、MySQL と同じ mysql ユーザーで問題ないことが多いですが、mariadb というユーザーが作成されている場合もあります。
  • portdatadirsocketpid-file は、MySQL の設定と明確に異なる値にしてください。

MariaDB のデータディレクトリ作成と初期化

MariaDB のデータディレクトリを作成し、適切な権限を設定し、データベースを初期化します。

# MariaDB専用のデータディレクトリを作成
sudo mkdir -p /var/lib/mariadb

# データディレクトリの所有権をmysqlユーザー(またはmariadbユーザー)に設定
sudo chown -R mysql:mysql /var/lib/mariadb

# 権限を設定
sudo chmod 750 /var/lib/mariadb

# MariaDBのエラーログディレクトリを作成し、権限を設定
sudo mkdir -p /var/log/mariadb
sudo chown mysql:mysql /var/log/mariadb
sudo chmod 750 /var/log/mariadb

# MariaDBの初期化
# --defaults-file オプションで、先ほど作成したMariaDB専用の設定ファイルを指定するのが重要です。
# 初期化スクリプトのパスはMariaDBのバージョンやインストール方法によって異なります。
# 例1: mariadb-install-db (一般的なパッケージインストールの場合)
sudo mariadb-install-db --user=mysql --datadir=/var/lib/mariadb --defaults-file=/etc/my.cnf.d/mariadb.cnf

# 例2: mysql_install_db (古いバージョンや一部のディストリビューションの場合)
# sudo /usr/bin/mysql_install_db --user=mysql --datadir=/var/lib/mariadb --defaults-file=/etc/my.cnf.d/mariadb.cnf

MariaDB サービスの起動スクリプト (Systemd)

Systemd を使用しているシステムの場合、MariaDB のサービス定義ファイルを作成または編集します。これにより、OS 起動時にMariaDBが自動的に起動し、systemctl コマンドで管理できるようになります。

/etc/systemd/system/mariadb.service (または既存のものを編集)

[Unit]
Description=MariaDB 10.x database server
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
# MariaDB専用のmysqld_safe (またはmariadbd) を呼び出し、専用の設定ファイルを指定
ExecStart=/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf.d/mariadb.cnf --pid-file=/var/run/mysqld/mariadb.pid
ExecStop=/usr/bin/mysqladmin --defaults-file=/etc/my.cnf.d/mariadb.cnf --socket=/var/run/mysqld/mariadb.sock shutdown
TimeoutSec=0

# ファイルディスクリプタの上限を増やす (推奨)
LimitNOFILE = 10000

# 再起動ポリシー
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

[Install]
WantedBy=multi-user.target

編集後の操作

# systemd の設定をリロード
sudo systemctl daemon-reload

# MariaDB サービスを起動
sudo systemctl start mariadb

# MariaDB サービスのステータスを確認
sudo systemctl status mariadb

# システム起動時にMariaDBを自動起動する設定
sudo systemctl enable mariadb

クライアントからの接続例

MySQLとMariaDB、それぞれのインスタンスに接続するコマンド例です。

MySQL (デフォルトポート 3306) への接続

mysql -u root -p
# または
mysql -P 3306 -u root -p

MariaDB (ポート 3307) への接続

  • ソケットファイルを指定して接続 (ローカル接続の場合)
    mysql --socket=/var/run/mysqld/mariadb.sock -u root -p
    
  • ポート番号を指定して接続
    mysql -P 3307 -u root -p
    

アプリケーション(例: PHP)からそれぞれのデータベースに接続する場合、接続文字列でポート番号やソケットファイルを指定します。

<?php

// MySQL (デフォルトポート 3306) への接続
$mysql_conn = new mysqli('127.0.0.1', 'your_mysql_user', 'your_mysql_password', 'your_mysql_database', 3306);

if ($mysql_conn->connect_error) {
    die("MySQL 接続失敗: " . $mysql_conn->connect_error);
}
echo "MySQL に正常に接続しました。<br>";
$mysql_conn->close();

// MariaDB (ポート 3307) への接続
// 接続文字列にポート番号を指定
$mariadb_conn_port = new mysqli('127.0.0.1', 'your_mariadb_user', 'your_mariadb_password', 'your_mariadb_database', 3307);

if ($mariadb_conn_port->connect_error) {
    die("MariaDB (ポート指定) 接続失敗: " . $mariadb_conn_port->connect_error);
}
echo "MariaDB (ポート指定) に正常に接続しました。<br>";
$mariadb_conn_port->close();

// MariaDB (ソケットファイル指定 - ローカルホストでのみ利用可能) への接続
// 通常のホスト指定の代わりに、ソケットファイルのパスを指定
// PDOの場合の例:
try {
    $dsn = "mysql:unix_socket=/var/run/mysqld/mariadb.sock;dbname=your_mariadb_database";
    $mariadb_conn_socket = new PDO($dsn, 'your_mariadb_user', 'your_mariadb_password');
    $mariadb_conn_socket->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "MariaDB (ソケット指定) に正常に接続しました。<br>";
} catch (PDOException $e) {
    die("MariaDB (ソケット指定) 接続失敗: " . $e->getMessage());
}

?>
  • ローカル接続の場合、PDO などでは unix_socket オプションを使用してソケットファイルを指定することもできます。
  • MariaDB への接続では、ホスト名の後にポート番号を明示的に指定します。
  • mysqliPDO などのデータベース拡張機能を使用します。


MariaDBとMySQLを共存させる代替方法

コンテナ技術の利用 (Docker, Podman, LXCなど)

これは、MariaDBとMySQLを共存させる最も現代的で推奨される方法の一つです。

  • アプリケーションからの接続
    アプリケーションは、MySQLには localhost:3306、MariaDBには localhost:3307 で接続します。

  • コード例 (Docker Compose)
    docker-compose.yml ファイルを使って、MariaDBとMySQLを同時に起動する例です。

    version: '3.8'
    
    services:
      mysql_db:
        image: mysql:8.0 # MySQLのイメージとバージョン
        container_name: my_mysql_instance
        ports:
          - "3306:3306" # ホストの3306ポートをMySQLコンテナの3306ポートにマッピング
        environment:
          MYSQL_ROOT_PASSWORD: my_mysql_root_password
          MYSQL_DATABASE: my_app_db_mysql
        volumes:
          - mysql_data:/var/lib/mysql # 永続化のためのボリュームマウント
        networks:
          - my_db_network
    
      mariadb_db:
        image: mariadb:10.6 # MariaDBのイメージとバージョン
        container_name: my_mariadb_instance
        ports:
          - "3307:3306" # ホストの3307ポートをMariaDBコンテナの3306ポートにマッピング
        environment:
          MARIADB_ROOT_PASSWORD: my_mariadb_root_password
          MARIADB_DATABASE: my_app_db_mariadb
        volumes:
          - mariadb_data:/var/lib/mysql # 永続化のためのボリュームマウント
        networks:
          - my_db_network
    
    volumes:
      mysql_data:
      mariadb_data:
    
    networks:
      my_db_network:
        driver: bridge
    

    このファイルを保存し、docker compose up -d コマンドを実行するだけで、両方のデータベースが起動します。

    • 環境分離
      MariaDBとMySQLが互いに影響を与えることなく独立して動作します。設定の競合や依存関係の問題が大幅に軽減されます。
    • ポータビリティ
      コンテナイメージは、異なる環境(開発、テスト、本番)間で簡単に移植できます。
    • バージョン管理
      特定のバージョンのMariaDBやMySQLを簡単にデプロイ・管理できます。
    • リソース管理
      コンテナごとにCPUやメモリなどのリソース制限を設定できます。
    • スケーラビリティ
      必要に応じて、各データベースインスタンスを簡単にスケールアップまたはスケールアウトできます。
    • クリーンな削除
      不要になったデータベースは、コンテナを削除するだけで環境をクリーンに保てます。

仮想環境の利用 (VirtualBox, VMware, KVMなど)

それぞれのデータベースを異なる仮想マシン上で実行する方法です。

  • コード例
    これには特定のコード例はありません。各仮想マシン上で、前回の説明にあるようなMariaDBまたはMySQLの標準インストール手順を実行することになります。

  • デメリット

    • リソース消費
      コンテナよりもリソース(CPU、メモリ、ディスク)の消費が大きくなります。
    • オーバーヘッド
      各仮想マシンにOSが起動するため、オーバーヘッドが大きくなります。
    • 管理の複雑さ
      複数のOSインスタンスを管理する必要があるため、運用が複雑になります。
  • プログラミング・運用上のメリット

    • 完全な分離
      OSレベルで完全に分離されるため、コンテナよりもさらに厳密な隔離が実現できます。
    • 異なるOS環境
      片方をUbuntu、もう片方をCentOSなど、異なるOS上で実行できます。
    • テスト環境
      複数のデータベース環境を同時にテストするのに適しています。

異なるシステムユーザーと専用設定での起動 (高度な手動設定)

これは、前回の説明をさらに深く掘り下げた、より手動で厳密な管理を行う方法です。

  • コード例 (概念)

    • ユーザーの作成
      sudo useradd -r mariadb_user -s /sbin/nologin
      sudo groupadd mariadb_group
      sudo usermod -g mariadb_group mariadb_user
      
    • MariaDB専用設定ファイル (/home/mariadb_user/my.cnf) の作成
      [mysqld] セクションで user = mariadb_user を指定し、datadirsocketpid-file/home/mariadb_user/data/home/mariadb_user/mariadb.sock/home/mariadb_user/mariadb.pid など、専用のパスに設定します。
    • データディレクトリなどの作成と権限設定
      sudo mkdir -p /home/mariadb_user/data
      sudo chown -R mariadb_user:mariadb_group /home/mariadb_user/data
      # ... 他のディレクトリも同様
      
    • サービススクリプトのカスタマイズ
      Systemdのサービスファイル(例: /etc/systemd/system/mariadb_custom.service)を作成し、User=mariadb_user を指定し、ExecStart コマンドで先ほど作成した専用の my.cnf--defaults-file で読み込ませます。
  • デメリット

    • 設定の複雑さ
      各インスタンスのパスや権限、起動スクリプトを細かく設定する必要があり、非常に手間がかかります。
    • トラブルシューティングの難しさ
      設定ミスがあった場合のデバッグが困難になることがあります。
    • パッケージマネージャとの相性
      パッケージマネージャによる更新が、手動設定したインスタンスに影響を与える可能性があります。
  • プログラミング・運用上のメリット

    • より厳密な分離
      サービスとファイルの所有権が異なるため、意図しないファイルアクセスや設定の混同を防げます。
    • 単一OS上での共存
      仮想化やコンテナ化のオーバーヘッドなしに、単一のOS上で共存を実現できます。
  • 手動での設定は、コンテナや仮想化が使えない、または極めて限定的なリソース環境でのみ検討されるべきで、高い専門知識と運用コストを伴います。
  • 仮想環境の利用は、完全に異なるOS環境が必要な場合や、厳密なリソース分離が必要な場合に適しています。
  • 最も推奨されるのは「コンテナ技術の利用」です。 開発・テスト環境はもちろん、本番環境でもそのメリットは大きく、管理の複雑さを大幅に軽減し、現代的なデプロイメントのベストプラクティスとされています。

どの方法を選択するかは、プロジェクトの要件、チームのスキルセット、利用可能なリソース、および将来的なスケーラビリティの計画によって異なります。