0
0

Linuxで複数のMySQLインスタンスを実行するまで

Last updated at Posted at 2024-08-27

概要

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
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
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
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オプションを使用したため、ルートユーザーのパスワードが空白のままです。
下記の記事などを参考に、パスワードを追加しましょう。

MySQL 8 (MariaDB 10)のrootパスワード変更方法 | ポケブロ

新しいインスタンスに接続完了し、ルートユーザーのパスワードを変更すれば完了です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0