概要
1つのLinuxサーバーで複数のMySQLインスタンスを実行する際に、既存の記事通りではうまくいかなかったため記事化。
原因はMySQL 8.0からデフォルトで有効になったX protocolのポート指定をしていないため、他インスタンスのものと競合が起こっていたこと。
参考:
CentOS 7 + MySQL 5.7で複数のMySQLインスタンスを起動する #centos7 - Qiita
mysql 8.0 複数インスタンス @ CentOS7 + systemctl #centos7 - Qiita
【MySQL】【Linux】 MySQL を複数インスタンスで起動させる ~ Linux編 ~ - プログラム の超個人的なメモ
手順
前提
- MySQLのバージョンは5.7系と8.0系がありますが、今回はver8.0.38を使用します。
- MySQLの5.7系を使用する際は、後述のX protocolがデフォルトで無効なので既存記事の通りで特に問題にならないはずです。
- LinuxのディストリビューションはUbuntu-20.04を使用します。
手順
1. MySQLのインストール
ここは既に他に詳しい記事がたくさんあるので省略します。
参考:WSL2でMySQL serverを立ち上げてローカルネットワーク上の他のデバイスから接続するまで #初心者 - Qiita
2. データディレクトリと設定ファイルの準備
ここがこの記事のミソなのですが、X protocolと呼ばれるクライアントプロトコルがポート33060を使用するので、新しい環境では以下のどちらかの手段を取らないと、ポートの競合が起きてソケットエラーにつながってしまいます。
- X protocolを使わない(方法1)
- 明示的にX protocolのポートを指定する(方法2)
参考:
X protocolについて MySQL X Protocol を解析してみる - tmtms のメモ
ソケットエラー sockets - UbuntuでMySQLに接続できない問題: "Can't find mysqld.sock" エラーの解決策
以下に2つの方法の手順を示します。
方法 1: mysqlx
プラグインを無効化する場合
データディレクトリの作成
sudo mkdir /var/lib/mysql-sbx
sudo chown -R mysql:mysql /var/lib/mysql-sbx
設定ファイルの作成
mysqlx
プラグインを無効にするための設定を含めたインスタンス用の設定ファイルを /etc/mysql/
に作成し、以下の内容を記入します。
sudo nano /etc/mysql/my_sbx.cnf
[mysqld]
datadir=/var/lib/mysql-sbx
socket=/var/run/mysqld/mysqld-sbx.sock
port=3307
mysqlx=OFF
今回はポート3307を使用しますが、使用していないポートであれば何を使っても構いません。
ポートの確認は以下のコマンドで行えます。
sudo lsof -i:ポート番号
方法 2: mysqlx
プラグインのポートとソケットを変更する場合
データディレクトリの作成
sudo mkdir /var/lib/mysql-sbx
sudo chown -R mysql:mysql /var/lib/mysql-sbx
設定ファイルの作成
mysqlx
プラグインのポートとソケットを明示的に設定するための設定ファイルを /etc/mysql/
に作成し、以下の内容を記入します。
sudo nano /etc/mysql/my_sbx.cnf
[mysqld]
datadir=/var/lib/mysql-sbx
socket=/var/run/mysqld/mysqld-sbx.sock
port=3307
[mysqlx]
mysqlx_port=33061
mysqlx_socket=/var/run/mysqld/mysqlx-sbx.sock
方法1と同様、空いているポートであれば33061以外でも構いません。
3. MySQLデータディレクトリの初期化
データディレクトリを初期化します。
sudo mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql-sbx
4. systemdのサービスユニットファイルの作成
インスタンス用のサービスファイルを /etc/systemd/system/
に作成します。
sudo nano /etc/systemd/system/mysql-sbx.service
[Unit]
Description=MySQL Sandbox Instance
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my_sbx.cnf
PIDFile=/var/run/mysqld/mysqld-sbx.pid
Restart=always
[Install]
WantedBy=multi-user.target
5. サービスの有効化と起動
インスタンスを有効化し、起動します。
sudo systemctl enable mysql-sbx
sudo systemctl start mysql-sbx
以下のコマンドで、サーバーがactiveになっており、エラーが出ていないことを確認します。
sudo systemctl status mysql-sbx
6. サーバーへの接続確認
インスタンスに接続し、動作確認を行います。
パスワードは空白で問題ありません。
mysql -u root -p --socket=/var/run/mysqld/mysqld-sbx.sock
--initialize-insecureオプションを使用したため、ルートユーザーのパスワードが空白のままです。
下記の記事などを参考に、パスワードを追加しましょう。
新しいインスタンスに接続完了し、ルートユーザーのパスワードを変更すれば完了です。