異なるバージョンのMySQLを一台のパソコンで同時に動かす方法

スポンサーリンク
IT
スポンサーリンク

異なるバージョンのMySQLを一台のパソコンで同時に動かす方法

どんなシチュエーション?

一時的に別のMySQLを使う必要がある

今、MySQL 8.0を使ったシステム開発をしているけど、急ぎで別のシステムの作業を手伝う時など、MySQLを入れ替えていては面倒ですし、時間がもったいないです。

稼動中システムのバージョンアップ

MySQLに限った話ではありませんが、ソフトウェアはバージョンによって、微妙に初期設定や挙動が違ったりします

MySQL自体は開発が継続されていますので、バージョンが上がっていきます。

システム新規導入時はその時点の最新版を利用すれば良いのですが、現在稼動中のシステムの場合は古いバージョンの物を使い続けていることになります。

MySQLバージョンアップする時の確認ポイント

この現在稼動中のシステムのMySQLのバージョンを上げる作業というのは、かなりの危険を伴いますので、この類の依頼案件があった場合は、どのバージョンからどのバージョンにアップデートするのか慎重に検討を重ねる必要があります。

そういった場合、次のようなアクションを取ります。

  1. 公式サイトのリリースノートを確認
  2. 実機検証

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です。
Windows版Dockerの場合

ボリュームの定義部分のホスト側パスをWindowsパソコンのドライブレターから指定します。C:\docker配下にする場合では次のようにCドライブの指定を追記するだけです。

volumes:
– “c:/docker/mysql57/data:/var/lib/mysql”

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

実行に失敗する場合は、定義ファイルのインデントがズレているかも知れません。プログラムと違ってインデントが正しくないと構文エラーになってしまいます。

ERROR: Couldn’t connect to Docker daemon が発生する

これはLinux版のDockerで権限が不足している場合に発生します。解決方法はいくつかありますが、ここでは一番簡単なroot権限で実行で回避します。docker-composeのコマンド実行時、sudoコマンドを使ってください。

$ sudo docker-compose up -d

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サーバを簡単に準備することが出来ますね。

ばったん
ばったん

ばったんのオススメ書籍紹介コーナー!

左の書籍から順番に一言コメントします。

  • 教科書というだけあって基本的なことも丁寧に記載されていてオススメ
  • 実際になにができるのかをすぐに知りたい、という方向け
  • GCPやAWSが絡むならKubernetesも一緒に
  • インフラ傾向にある場合はこちら
  • Dockerを深堀りしたい方は定番のオライリー本

コメント

タイトルとURLをコピーしました