異なるバージョンのMySQLを一台のパソコンで同時に動かす方法
どんなシチュエーション?
一時的に別のMySQLを使う必要がある
今、MySQL 8.0を使ったシステム開発をしているけど、急ぎで別のシステムの作業を手伝う時など、MySQLを入れ替えていては面倒ですし、時間がもったいないです。
稼動中システムのバージョンアップ
MySQLに限った話ではありませんが、ソフトウェアはバージョンによって、微妙に初期設定や挙動が違ったりします。
MySQL自体は開発が継続されていますので、バージョンが上がっていきます。
システム新規導入時はその時点の最新版を利用すれば良いのですが、現在稼動中のシステムの場合は古いバージョンの物を使い続けていることになります。
MySQLバージョンアップする時の確認ポイント
この現在稼動中のシステムのMySQLのバージョンを上げる作業というのは、かなりの危険を伴いますので、この類の依頼案件があった場合は、どのバージョンからどのバージョンにアップデートするのか慎重に検討を重ねる必要があります。
そういった場合、次のようなアクションを取ります。
- 公式サイトのリリースノートを確認
- 実機検証
1のリリースノートの確認は基本ですね。どこがどう変わったかまとめられているのでこれを確認するのがまず最初の一歩です。ただ、リリースノートだけではわからない場合もあります。実際のデータが入っている状態でバージョンアップしたら、どうなるのか、最終的には実機で確認するのが確実です。
実機検証のため、別のバージョンのMySQLを準備
すでにMySQLが動かしてて、別のバージョンを動かしたいけど、今使っているMySQLはアンインストールしたくないな
コンピュータをもう一台調達するのは難しいよ
はい! DockerコンテナのMySQLなら一台のコンピュータ上でいろんなバージョンを同時に起動できるよ
やり方
docker-composeでMySQLコンテナを1つ起動
docker-composeを使ってMySQLを複数バージョン動かしてみます。既に1つ動いている前提で説明します。まだ動かしていない方は、一つ前の記事を先にご覧ください。
別バージョンのMySQLのコンテナを追加して起動
前回、MySQLの最新版を動かすdocker-compose.yamlを作成しましたので、それにコンテナの定義を追記します。mysql-v5.7:のブロックです。
version: '3'
services:
mysql-latest:
image: mysql:latest
container_name: mysql80
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: scott
MYSQL_PASSWORD: tiger
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
volumes:
- "/docker/mysql80/data:/var/lib/mysql"
- "/docker/mysql80/conf:/etc/mysql/conf.d"
- "/docker/mysql80/initdb:/docker-entrypoint-initdb.d"
ports:
- 3306:3306
mysql-v5.7:
image: mysql:5.7
container_name: mysql57
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: scott
MYSQL_PASSWORD: tiger
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
volumes:
- "/docker/mysql57/data:/var/lib/mysql"
- "/docker/mysql57/conf:/etc/mysql/conf.d"
- "/docker/mysql57/initdb:/docker-entrypoint-initdb.d"
ports:
- 13306:3306
- サービス名、コンテナ名は重複しなければ何でもOKです。
- volumesの先は、他のコンテナのDBをマッピングしないように注意してください。多分壊れます。
- portsは3306は既にMySQL最新版で使われているので、別のポート番号にしてください。1024~65535で他のサービスが使っていないところならどこでもOKです。
docker-compose.yamlへの追加定義が完了したら、保存してdocker-composeコマンドで起動してください。うまく起動すると、次のように両方ともStateがUPになります。これで、ポート番号3306で接続するとMySQLの最新版、13306で接続するとMySQL 5.7に接続できます。
docker-composeコマンドでファイルを指定して実行する場合は、docker-compose -f <ファイル名> up -d です。
$ docker-compose up -d
Name Command State Ports
--------------------------------------------------------------------------------
mysql80 docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp,
33060/tcp
mysql57 docker-entrypoint.sh mysql ... Up 0.0.0.0:13306->3306/tcp,
33060/tcp
MySQLに接続してバージョンを確認する
MySQL 8.0をポート番号3306
MySQL 5.7をポート番号13306 でそれぞれ動作するようにしました。
mysqlコマンドの準備
docker-compose.yamlで指定した通りにMySQLのコンテナが構築されているか、実際にMySQLに接続して確認してみます。
mysqlコマンドが使えるか確認します。次のように表示された場合は、apt installでインストールします。
$ mysql
Command 'mysql' not found, but can be installed with:
sudo apt install mysql-client-core-5.7
sudo apt install mariadb-client-core-10.1
MySQLクライアントをインストールします。バージョンは5.7でOKです。
$ sudo apt install mysql-client-core-5.7
インストールが完了したら、きちんとインストールされたか、mysql –versionで確認します。バージョン番号が表示されれば大丈夫です。特にバージョン番号はなんでもよいです。
$ mysql --version
mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper
hiro@vm-ubuntu-18-04-01:~/work$
接続確認 MySQL 8.0(ポート番号:3306)
ちゃんとMySQL 8.0が動いていますね。
$ mysql -u root -proot --host=127.0.0.1
Your MySQL connection id is 8
Server version: 8.0.21 MySQL Community Server - GPL
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.21 |
+-----------+
1 row in set (0.00 sec)
接続確認 MySQL 5.7(ポート番号:13306)
ポート番号を標準から変更して立ち上げているので、ポート指定で接続します。こちらはMySQL 5.7が動いています。
$ mysql -u root -proot --host=127.0.0.1 -P 13306
Server version: 5.7.31 MySQL Community Server (GPL)
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.31 |
+-----------+
1 row in set (0.01 sec)
おお、MySQL 5.7と8.0の共存環境の出来上がりです。Docker素晴らしいですね!
まとめ
Docker便利ですねー。バージョンごとにdocker-compose.yamlを分けておけば、使いたいバージョンだけを起動することも可能です。
今回はわかりやすく別のバージョンにしましたが、もちろん同じバージョンでも構築可能です。開発チームにメンバーが10人いたら、この要領でサーバ上のDockerに10人分のMySQLサーバを簡単に準備することが出来ますね。
コメント