見出し画像

AmazonLinux2でMySQL8.0とMariaDB10.5を共存させてみた

AWSのEC2で開発用環境を構築中なのですが、MySQL8.0をインストールした後に、MySQL8.0ではTIMESTAMP型が廃止されていると知りました(2038年問題のため)。保守中のシステムにTIMESTAMP型を使用しているものがあり、そもそもそのシステムの本番環境はMariaDBなので、MariaDBを共存させてみようと思い立ちました。調べたところ、MySQLとMariaDBは共存できないとしている記事が多く、共存させる場合も仮想環境を作ったりする例しかありませんでした。Linux上で仮想などを使わずに実際に共存させたというブログ記事は見つかりませんでした。でも、MariaDB公式(7年以上前の古い記事…)でやり方が出ていたのでチャレンジしてみました。

この記事は公式サイトの Installing MariaDB Alongside MySQL を参照しています。

前提事項

・OS : AmazonLinux2
・MySQL : 8.0.25(yumリポジトリ版)
・MariaDB : 10.5.10(バイナリパッケージ版)

1.まずはMySQL8.0のインストール

公式サイトのyumリポジトリを追加。mysql80のリポジトリを指定してmysqlインストール 。

$ yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ yum install --enablerepo=mysql80-community mysql-community-server mysql-community-devel

・mysql起動 & 自動起動

$ systemctl start mysqld.service
$ systemctl enable mysqld.service

・初期パスワードを探す

$ grep password /var/log/mysqld.log
2021-06-04T00:31:49.537502Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [original password]

・パスワード変更(初期パスワードでログイン)

$ mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '[new password]';

2.MariaDB10.5.10のインストール

/opt にMariaDBのバイナリをインストールします。
公式サイトより10.5.10のバイナリ版を/optにダウンロードして解凍します。解凍済みのディレクトリにシンボリックリンクを作成します(こうするとバージョン違いをインストールしたときすぐ切り替えできるということらしいです)。データディレクトリを作成します。

$ cd /opt
$ wget --trust-server-names https://downloads.mariadb.org/interstitial/mariadb-10.5.10/bintar-linux-x86_64/mariadb-10.5.10-linux-x86_64.tar.gz/from/https%3A//mariadb.mirror.digitalpacific.com.au/
$ tar xvzf mariadb-10.5.10-linux-x86_64.tar.gz
$ ln -s mariadb-10.5.10-linux-x86_64 mariadb
$ mkdir mariadb-data

MariaDB用ユーザ、グループの作成と、所有者の変更を行います。

$ groupadd --system mariadb
$ useradd -c "MariaDB Server" -d /opt/mariadb -g mariadb --system mariadb
$ chown -R mariadb:mariadb mariadb-10.5.10-linux-x86_64/
$ chown -R mariadb:mariadb mariadb-data/

my.cnfを作成します。このバージョンのMariaDBにはmy.cnfのサンプル(/support-files/my-medium.cnfなど)は無いので、必要な設定を書いたmy.cnfを用意します。

$ vi /opt/mariadb-data/my.cnf
$ chown mariadb:mariadb mariadb-data/my.cnf

my.cnf内容

[client]
port		= 3307
socket		= /opt/mariadb-data/mariadb.sock
[mysqld]
datadir     = /opt/mariadb-data
basedir     = /opt/mariadb
port		= 3307
socket		= /opt/mariadb-data/mariadb.sock
user        = mariadb

起動ファイルを作成して、内容を編集します。

$ cp mariadb/support-files/mysql.server /etc/init.d/mariadb
$ chmod +x /etc/init.d/mariadb
$ vi /etc/init.d/mariadb

/etc/init.d/mariadbのmysqlの記述をmariadbに変更していきます。

- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/opt/mariadb
- datadir=
+ datadir=/opt/mariadb-data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"

/etc/init.d/mariadbのmysqld_safe起動部分にMariaDBのmy.cnfを指定します。
※公式サイトの指示では、pidファイルの指定を何故か$mysql_pid_file_pathと変更していますが、恐らくミスで、元と同じく$mariadb_pid_file_pathとしておきます。

# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
‐ $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mariadbd_pid_file_path" "$@" &
+ $bindir/mysqld_safe --defaults-file=/opt/mariadb-data/my.cnf --datadir="$datadir" --pid-file="$mariadb_pid_file_path" $other_args >/dev/null 2>&1 &

さらに以下の部分にもmy.cnfのパスを指定しておきます。

- if $bindir/mysqladmin ping >/dev/null 2>&1; then
+ if $bindir/mysqladmin --defaults-file=/opt/mariadb-data/my.cnf ping >/dev/null 2>&1; then

この状態でMariaDBのインストールと起動 & 自動起動設定をおこないます。

$ cd /opt/mariadb
$ scripts/mysql_install_db --defaults-file=/opt/mariadb-data/my.cnf
$ systemctl start mariadb
$ systemctl enable mariadb​

これで共存完了!

3.共存の確認とphp設定

なのですがホントに共存しているか確かめます。socket指定したらMariaDBが起動します。

$ mysql ‐p -uroot
>mysql "SELECT VERSION();"
+-----------+
| VERSION() |
+-----------+
| 8.0.25    |
+-----------+

$ mysql -e "SELECT VERSION();" --socket=/opt/mariadb-data/mariadb.sock
+-----------------+
| VERSION()       |
+-----------------+
| 10.5.10-MariaDB |
+-----------------+

MariaDBはrootの初期パスワードがないのでパスワードを設定します。

$ mysql -uroot  --socket=/opt/mariadb-data/mariadb.sock
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '[new password]';

ウェブサイトからphpでアクセスするときは、httpd.confか、.htaccessにmysqlのportとsocketを指定しておきます。

php_value pdo_mysql.default_socket /opt/mariadb-data/mariadb.sock
php_value mysqli.default_socket /opt/mariadb-data/mariadb.sock
php_value mysqli.default_port 3307

【追記】どうしてもhttpd.conf、.htaccessで「pdo_mysql.default_socket」の値がOverrideされなかったので、phpプログラム内でPDO接続時にhostの代わりにunix_socketを指定しました。

以上です。

この記事が気に入ったらサポートをしてみませんか?