ApacheでMySQLの複数インスタンスを設定する方法を徹底解説

Apache上で複数のMySQLインスタンスを運用することは、複数のアプリケーションを同一サーバー上で効率的に管理するために有効な方法です。これにより、各アプリケーションが独自のMySQLインスタンスを持ち、データの分離が容易になります。例えば、開発環境やテスト環境、本番環境を同一のサーバーで動作させる場合、それぞれ異なるMySQLインスタンスを利用することで、環境間のデータが干渉しないようにすることが可能です。

本記事では、Apache上で複数のMySQLインスタンスを設定・管理する具体的な方法を、初心者でもわかりやすくステップバイステップで解説します。必要な環境の準備から、インスタンスの複製、設定ファイルの編集、サービスの起動、さらにはトラブルシューティングまでを網羅し、安定したシステム運用を実現するための知識を提供します。

目次

MySQLの複数インスタンスが必要な理由


MySQLの複数インスタンスを運用することは、複数のプロジェクトやアプリケーションが同一サーバーで動作する場合に大きな利点をもたらします。主な理由は以下の通りです。

リソースの分離と安全性の向上


各インスタンスが独立して動作するため、アプリケーション間でのデータ干渉が防げます。これにより、一方のアプリケーションがデータの破損や誤操作をしても、他のインスタンスには影響を与えません。

環境ごとのデータベース管理


開発、テスト、本番などの異なる環境を1台のサーバーで構築する際に、複数のMySQLインスタンスを利用することで、環境間のデータが混在することなく運用できます。これにより、環境ごとに異なる設定やパラメータを使用することが可能です。

異なる設定要件への対応


アプリケーションによっては、MySQLの設定要件が異なる場合があります。例えば、あるアプリケーションでは大容量データを扱い、大きなメモリバッファが必要ですが、別のアプリケーションでは軽量な構成が求められます。複数インスタンスを使うことで、それぞれの要件に最適な設定を施すことができます。

コスト削減と効率向上


複数の物理サーバーを用意する代わりに、1台のサーバー上で複数のインスタンスを動作させることで、ハードウェアコストや運用コストを削減できます。また、サーバーのリソースを効率的に活用できるため、運用全体のパフォーマンスが向上します。

これらの理由から、MySQLの複数インスタンス運用は、特に中規模から大規模のシステムにおいて重要な役割を果たします。

MySQLの複数インスタンスの基本構成


MySQLの複数インスタンスを運用するためには、各インスタンスが独立したデータディレクトリと設定ファイルを持つ必要があります。これにより、インスタンスごとに異なるポート番号やソケット、ログファイルを指定でき、互いに干渉することなく動作します。

複数インスタンスのアーキテクチャ


MySQLの複数インスタンスは以下のような構成を持ちます。

  • データディレクトリ:インスタンスごとに専用のデータディレクトリを作成し、データを完全に分離します。
  • 設定ファイル(my.cnf):インスタンスごとに異なる設定ファイルを用意し、ポート番号やバッファサイズなどのパラメータを指定します。
  • サービスプロセス:各インスタンスは独立したサービスとして登録され、システム起動時に自動的に起動するように設定されます。
  • ログ管理:エラーログやスロークエリログもインスタンスごとに出力先を分けることで、問題発生時の解析が容易になります。

基本構成の例


以下は、2つのMySQLインスタンス(3306番ポートと3307番ポート)を同一サーバーで動作させる際の構成例です。

/etc/mysql/  
  ├── my.cnf                  # メイン設定ファイル  
  ├── my3306.cnf              # 3306番ポート用の設定  
  ├── my3307.cnf              # 3307番ポート用の設定  
/var/lib/mysql/  
  ├── mysql3306               # 3306番ポートのデータディレクトリ  
  ├── mysql3307               # 3307番ポートのデータディレクトリ  
/var/log/mysql/  
  ├── mysql3306.log           # 3306番ポート用のログ  
  ├── mysql3307.log           # 3307番ポート用のログ  

各要素の役割

  • my.cnf:グローバル設定を記述するが、基本的には個別のインスタンス設定が優先される。
  • my3306.cnf / my3307.cnf:各インスタンスに固有のポート番号やディレクトリを記述し、それぞれ独立して動作。
  • mysql3306 / mysql3307:インスタンスごとのデータベースファイル群が格納される。

このように構成を整理することで、運用時の混乱を避け、効率的に複数インスタンスを管理できるようになります。

必要な環境と準備


MySQLの複数インスタンスをApache環境で運用するためには、事前に必要な環境を整え、準備を進めることが重要です。以下では、環境の確認から必要なファイルの準備までを詳しく解説します。

必要なソフトウェアとバージョン要件

  • Apache:バージョン2.4以上が推奨されます。
  • MySQL:バージョン5.7以上が望ましく、複数インスタンス運用において安定性が向上しています。
  • OS:Linux(Ubuntu, CentOSなど)が最も一般的ですが、Windows Server環境でも構築可能です。

環境の確認


以下のコマンドを使用して、ApacheとMySQLがすでにインストールされているかを確認します。

# Apacheのバージョン確認
apachectl -v

# MySQLのバージョン確認
mysql --version

もしインストールされていない場合は、以下のようにインストールします。

# ApacheとMySQLのインストール (Ubuntu)
sudo apt update
sudo apt install apache2 mysql-server

MySQLインスタンスの複製準備


デフォルトのMySQLインスタンスを複製するためのディレクトリ構成を準備します。以下の手順でデータディレクトリを作成し、複数インスタンス用のベースを整えます。

# データディレクトリの作成
sudo mkdir /var/lib/mysql3306
sudo mkdir /var/lib/mysql3307

# 権限の設定
sudo chown -R mysql:mysql /var/lib/mysql3306
sudo chown -R mysql:mysql /var/lib/mysql3307

設定ファイルの準備


MySQLの複数インスタンスを設定するために、デフォルトの設定ファイルを複製し、それぞれのインスタンス用に編集します。

# 設定ファイルのコピー
sudo cp /etc/mysql/my.cnf /etc/mysql/my3306.cnf
sudo cp /etc/mysql/my.cnf /etc/mysql/my3307.cnf

ネットワークとポートの確認


複数のMySQLインスタンスを同時に稼働させるためには、それぞれ異なるポート番号を使用する必要があります。デフォルトではポート3306が使用されますが、他のインスタンスには3307や3308などを割り当てます。

sudo netstat -tuln | grep 3306

このコマンドで使用中のポートを確認し、他のポートが空いているかチェックします。

これで、MySQLの複数インスタンスを構築するための準備が整いました。次は、実際にMySQLインスタンスを複製し、個別の設定を進めていきます。

MySQLの複製とデータディレクトリの作成


MySQLの複数インスタンスを運用するには、既存のMySQLインスタンスを複製し、新たなデータディレクトリを作成する必要があります。これにより、各インスタンスが独立した環境で動作し、データの分離が可能になります。

データディレクトリの複製


既存のMySQLデータディレクトリを複製し、新しいインスタンス用のディレクトリを作成します。以下の手順でデータディレクトリを準備します。

# MySQLを停止(安全のため)
sudo systemctl stop mysql

# 新しいデータディレクトリの作成
sudo mkdir /var/lib/mysql3306
sudo mkdir /var/lib/mysql3307

# デフォルトデータをコピー
sudo cp -R /var/lib/mysql/* /var/lib/mysql3306/
sudo cp -R /var/lib/mysql/* /var/lib/mysql3307/

# 権限の変更
sudo chown -R mysql:mysql /var/lib/mysql3306
sudo chown -R mysql:mysql /var/lib/mysql3307

データディレクトリの初期化


新しく作成したデータディレクトリが正しく初期化されているか確認し、不足しているファイルがないかを確認します。もし不完全な場合は、以下のコマンドで初期化を実行します。

# MySQLデータディレクトリの初期化
sudo mysqld --initialize --datadir=/var/lib/mysql3306
sudo mysqld --initialize --datadir=/var/lib/mysql3307

ソケットファイルとPIDファイルの作成


MySQLはデフォルトで /var/run/mysqld/ にソケットファイルとPIDファイルを作成します。複数インスタンスを運用する際には、それぞれ独自のソケットファイルとPIDファイルが必要です。

sudo mkdir /var/run/mysqld3306
sudo mkdir /var/run/mysqld3307

# 権限の設定
sudo chown mysql:mysql /var/run/mysqld3306
sudo chown mysql:mysql /var/run/mysqld3307

データディレクトリの確認


作成したデータディレクトリが正しく配置されているか、以下のコマンドで確認します。

ls -la /var/lib/mysql3306
ls -la /var/lib/mysql3307

ディレクトリ内に ibdata1mysql フォルダが存在することを確認してください。

複製の完了


これでMySQLインスタンス用のデータディレクトリが複製されました。次は、各インスタンスごとに個別の設定ファイルを編集し、ポート番号やソケットの指定を行います。

設定ファイル(my.cnf)の編集方法


MySQLの複数インスタンスを適切に管理するためには、それぞれのインスタンスが異なるポート、データディレクトリ、ソケットを使用するように設定ファイル(my.cnf)を編集する必要があります。これにより、インスタンス間の干渉を防ぎ、独立した動作が可能になります。

設定ファイルの複製と配置


まず、デフォルトのmy.cnfを複製してインスタンスごとに設定ファイルを作成します。

# 設定ファイルのコピー
sudo cp /etc/mysql/my.cnf /etc/mysql/my3306.cnf
sudo cp /etc/mysql/my.cnf /etc/mysql/my3307.cnf

複製した設定ファイルは、それぞれのインスタンス用に編集します。

my.cnfの編集例(ポート3306用)


/etc/mysql/my3306.cnfを以下のように編集します。

[mysqld]
port = 3306
socket = /var/run/mysqld3306/mysqld.sock
pid-file = /var/run/mysqld3306/mysqld.pid
datadir = /var/lib/mysql3306
log-error = /var/log/mysql/mysql3306.log

my.cnfの編集例(ポート3307用)


/etc/mysql/my3307.cnfは以下のように編集します。

[mysqld]
port = 3307
socket = /var/run/mysqld3307/mysqld.sock
pid-file = /var/run/mysqld3307/mysqld.pid
datadir = /var/lib/mysql3307
log-error = /var/log/mysql/mysql3307.log

編集ポイントの詳細解説

  • port:各インスタンスごとに異なるポートを指定します。一般的には3306がデフォルトですが、複数インスタンスを運用する場合は3307、3308と順番に指定します。
  • socket:ソケットファイルの場所をインスタンスごとに分けることで、接続が競合しないようにします。
  • pid-file:プロセスIDファイルをインスタンスごとに指定することで、サービス管理が容易になります。
  • datadir:インスタンスごとのデータディレクトリを指定し、データを分離します。
  • log-error:エラーログファイルを分けて指定し、インスタンスごとに個別のログを記録します。

設定の確認


設定が正しく記述されているか確認するために、以下のコマンドでファイルをチェックします。

sudo mysqld --defaults-file=/etc/mysql/my3306.cnf --verbose --help
sudo mysqld --defaults-file=/etc/mysql/my3307.cnf --verbose --help

エラーが表示されなければ、設定ファイルの編集は完了です。次は、これらの設定ファイルを元にMySQLインスタンスをサービスとして登録し、起動します。

サービスの登録と起動方法


複数のMySQLインスタンスを運用するためには、それぞれのインスタンスをシステムサービスとして登録し、自動的に起動・停止できるように設定します。これにより、サーバー再起動時にも各インスタンスが自動的に復旧します。

MySQLサービスの複製


デフォルトのMySQLサービスユニットファイルを複製し、それぞれのインスタンス用に編集します。

# systemdサービスファイルの複製
sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/mysql3306.service
sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/mysql3307.service

サービスファイルの編集


複製したmysql3306.servicemysql3307.serviceを編集して、各インスタンスが異なる設定ファイルを参照するようにします。

/etc/systemd/system/mysql3306.service

[Unit]
Description=MySQL 3306 Server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3306.cnf
LimitNOFILE = 5000

[Install]
WantedBy=multi-user.target

/etc/systemd/system/mysql3307.service

[Unit]
Description=MySQL 3307 Server
After=network.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3307.cnf
LimitNOFILE = 5000

[Install]
WantedBy=multi-user.target

サービスのリロードと登録


編集が完了したら、systemdに新しいサービスを認識させます。

# systemdの再読み込み
sudo systemctl daemon-reload

# サービスの登録
sudo systemctl enable mysql3306.service
sudo systemctl enable mysql3307.service

MySQLインスタンスの起動


各MySQLインスタンスを起動し、動作を確認します。

# MySQLインスタンスの起動
sudo systemctl start mysql3306.service
sudo systemctl start mysql3307.service

起動状況の確認


インスタンスが正常に起動しているか確認します。

sudo systemctl status mysql3306.service
sudo systemctl status mysql3307.service

もし「active (running)」と表示されていれば、正常に起動しています。

自動起動の確認


サーバー再起動時に自動的にMySQLインスタンスが起動するように設定されているか確認します。

sudo systemctl list-unit-files | grep mysql

mysql3306.servicemysql3307.serviceが「enabled」と表示されていれば、自動起動が有効になっています。

MySQLへの接続テスト


各インスタンスに接続して、動作を確認します。

mysql -u root -S /var/run/mysqld3306/mysqld.sock
mysql -u root -S /var/run/mysqld3307/mysqld.sock

これで複数のMySQLインスタンスがサービスとして登録され、正常に動作する環境が整いました。次は、ApacheとMySQLの連携設定を行います。

Apacheとの連携設定


MySQLの複数インスタンスをApacheで使用するためには、各インスタンスに適切に接続できるようApacheの設定を行います。これにより、複数のWebアプリケーションがそれぞれ独立したMySQLインスタンスに接続できるようになります。

PHPのインストールと設定確認


ApacheがMySQLに接続するためには、PHPとMySQL用の拡張モジュールが必要です。以下のコマンドで必要なパッケージをインストールします。

# PHPとMySQL拡張モジュールのインストール
sudo apt install php libapache2-mod-php php-mysql

インストール後、Apacheを再起動してモジュールを有効にします。

sudo systemctl restart apache2

PHPから複数のMySQLインスタンスに接続


PHPで複数のMySQLインスタンスに接続する際は、PDOやmysqliを使用して接続情報を指定します。以下は、複数インスタンスに接続するサンプルコードです。

接続用PHPスクリプト(mysql_connect_test.php)

<?php
// 3306インスタンスへの接続
$dsn1 = 'mysql:host=localhost;port=3306;dbname=testdb';
$user = 'root';
$password = 'your_password';
try {
    $dbh1 = new PDO($dsn1, $user, $password);
    echo "Connected to MySQL instance on port 3306.<br>";
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage() . "<br>";
}

// 3307インスタンスへの接続
$dsn2 = 'mysql:host=localhost;port=3307;dbname=testdb';
try {
    $dbh2 = new PDO($dsn2, $user, $password);
    echo "Connected to MySQL instance on port 3307.<br>";
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage() . "<br>";
}
?>

このスクリプトを/var/www/html/に配置し、ブラウザで確認します。

sudo cp mysql_connect_test.php /var/www/html/

ブラウザで以下のURLにアクセスします。

http://<サーバーIP>/mysql_connect_test.php

正しく接続できた場合は「Connected to MySQL instance on port 3306」「Connected to MySQL instance on port 3307」と表示されます。

Apacheのバーチャルホスト設定(複数アプリケーション用)


Apacheが複数のWebアプリケーションをそれぞれ異なるMySQLインスタンスに接続するためには、バーチャルホストの設定を行います。

バーチャルホスト設定例(/etc/apache2/sites-available/app1.conf)

<VirtualHost *:80>
    ServerAdmin admin@app1.com
    DocumentRoot /var/www/app1
    ServerName app1.local

    <Directory /var/www/app1>
        AllowOverride All
    </Directory>

    SetEnv DB_PORT 3306
    ErrorLog ${APACHE_LOG_DIR}/app1_error.log
    CustomLog ${APACHE_LOG_DIR}/app1_access.log combined
</VirtualHost>

/etc/apache2/sites-available/app2.conf

<VirtualHost *:80>
    ServerAdmin admin@app2.com
    DocumentRoot /var/www/app2
    ServerName app2.local

    <Directory /var/www/app2>
        AllowOverride All
    </Directory>

    SetEnv DB_PORT 3307
    ErrorLog ${APACHE_LOG_DIR}/app2_error.log
    CustomLog ${APACHE_LOG_DIR}/app2_access.log combined
</VirtualHost>

バーチャルホストを有効にします。

sudo a2ensite app1.conf
sudo a2ensite app2.conf
sudo systemctl reload apache2

PHPでポート情報を利用する


バーチャルホストごとに設定されたDB_PORT環境変数をPHPで利用して、動的にMySQLインスタンスを切り替えます。

<?php
$port = getenv('DB_PORT');
$dsn = "mysql:host=localhost;port=$port;dbname=testdb";
$user = 'root';
$password = 'your_password';
try {
    $dbh = new PDO($dsn, $user, $password);
    echo "Connected to MySQL on port $port.";
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>

これでApacheを通じて、複数のMySQLインスタンスに適切に接続できる環境が整いました。次は、トラブルシューティングとデバッグ方法を解説します。

トラブルシューティングとデバッグ方法


MySQLの複数インスタンスをApacheと連携して運用する際には、さまざまな問題が発生する可能性があります。ここでは、よくある問題とその解決方法を解説します。

MySQLインスタンスが起動しない場合


MySQLインスタンスが正常に起動しない場合は、設定ファイルの記述ミスやポートの競合が原因となっている可能性があります。

1. ログファイルを確認

エラーログを確認して、具体的なエラーメッセージを特定します。

sudo cat /var/log/mysql/mysql3306.log
sudo cat /var/log/mysql/mysql3307.log

2. ポートの競合を確認

他のサービスが指定したポートを使用していないか確認します。

sudo netstat -tuln | grep 3306

解決方法:

  • ポートがすでに使用されている場合は、my.cnfを編集して空いているポートに変更します。
  • 設定変更後、MySQLサービスを再起動します。
sudo systemctl restart mysql3306.service
sudo systemctl restart mysql3307.service

ApacheからMySQLに接続できない場合


PHPスクリプトやアプリケーションがMySQLに接続できない場合は、以下の点を確認します。

1. ソケットファイルの存在確認

指定したソケットファイルが存在しているか確認します。

ls /var/run/mysqld3306/mysqld.sock
ls /var/run/mysqld3307/mysqld.sock

ソケットが存在しない場合は、my.cnfsocket設定が正しいか確認し、再起動します。

sudo systemctl restart mysql3306.service

2. PHPスクリプトでの接続テスト

PHPスクリプトを直接実行して、接続テストを行います。

php /var/www/html/mysql_connect_test.php

エラーメッセージが出力された場合は、メッセージ内容に従って設定を見直します。

ポート接続エラーの対処法


以下のようなエラーが表示される場合があります。

Connection failed: SQLSTATE[HY000] [2002] No such file or directory

これは、ポートやソケットの指定が間違っている可能性があります。

解決策:

  • PHPスクリプトでポート番号やソケットのパスを正しく指定しているか確認します。
  • my.cnfportおよびsocket設定を見直し、間違いがあれば修正します。
$dsn = 'mysql:host=localhost;port=3307;dbname=testdb';

MySQLインスタンスの自動起動が機能しない場合


MySQLインスタンスがシステム起動時に自動で起動しない場合は、サービスが正しく登録されているか確認します。

sudo systemctl list-unit-files | grep mysql

mysql3306.servicemysql3307.serviceenabledになっていなければ、有効化します。

sudo systemctl enable mysql3306.service
sudo systemctl enable mysql3307.service

データの競合や破損が発生した場合


複数インスタンスが同じデータディレクトリを共有している場合、データが破損する可能性があります。

解決策:

  • 各インスタンスが異なるdatadirを使用しているか確認します。
  • データディレクトリが重複している場合は、新たにディレクトリを作成し、設定を修正します。
sudo mkdir /var/lib/mysql3308
sudo chown -R mysql:mysql /var/lib/mysql3308

まとめ


トラブルシューティングでは、ログの確認が重要です。問題が発生した場合は、エラーログをもとに原因を特定し、設定を見直します。ApacheとMySQLの連携は多くの要素が絡むため、一つずつ順番に確認することが効果的です。

まとめ


本記事では、Apache上でMySQLの複数インスタンスを運用する方法について解説しました。MySQLの複数インスタンスを利用することで、プロジェクトやアプリケーションごとに独立したデータベース環境を構築し、リソースの分離やデータの安全性を高めることが可能です。

具体的には、MySQLのデータディレクトリの複製や設定ファイル(my.cnf)の編集、複数のサービス登録とApacheとの連携設定を行いました。また、トラブルシューティング方法を通じて、実運用での問題解決スキルも習得できたかと思います。

これらの知識を活用することで、複数の環境やアプリケーションを同一サーバー上で効率的に運用し、コスト削減やパフォーマンス向上を実現できるでしょう。

コメント

コメントする

目次