Windowsで複数のMySQL環境（データ込み）を管理する

# 概要

Windows環境にて、複数のMySQL環境（データ込み）を管理する個人的な手順をまとめました。

- 複数のZip版MySQLバイナリを使用
- それぞれを起動終了することで即座に環境を切り替え可能
- 異なるバージョンや異なるデータ（テーブルやレコード）を管理可能

## モチベーション

WindowsPC1台を貸与されており、複数の環境を保守運用しています。とあるシステムはMySQL 5.xを使用しており、また別のシステムでは8.xです。他にも、開発用・テスト用・検証用など複数の環境が存在しています。ローカルで検証しなければならない場面があり、単純にWindows用のMySQLインストーラーを実行してしまうと、環境の切り替えが面倒です。

切り替えのたびにダンプデータ等からデータを復元し切り替えるという手もありますが、それぞれのデータベースが重いため、時間がかかってしまいます。
環境切り替えはDockerを使えばよさそうですが、今回はWSL周りで別の問題がありました。
調査しいろいろ試したところ、比較的簡単に環境を切り替える方法を確立できたため、本記事にまとめました。

## 手順

### 任意バージョンのMySQLサーバ（Zip版）をダウンロード

zipファイルにてWindows用のスタンドアローンexe（Zip版）が配布されているため設定して起動します。

- [MySQL :: MySQL Downloads](https://www.mysql.com/jp/downloads/)へアクセス
- 「MySQL Community (GPL) Downloads >>」のリンク押下
- 「MySQL Community Server」のリンク押下
- 最新版であればこのページからバージョンを選択し「Download」ボタン押下
- もっと古いバージョンは「Archive」タブ押下でダウンロードページにて遷移
- 最新版をダウンロードした場合、「No thanks, just start my download.」のリンク押下でダウンロードを開始

これで、`mysql-8.4.3-winx64.zip`、`mysql-5.7.44-winx64.zip`などがダウンロードできます。Zipファイルを展開します。
以下のディレクトリ構成になります。

```txt
bin/
docs/
include/
lib/
LICENSE
README
share/
```

### 初期設定

ここで、展開したディレクトリ内に空のディレクトリ、ファイルを作成します。コマンドプロンプトにて、下記コマンドを実行します。

```bat
REM ↓適宜変更ください
cd path/to/mysql

mkdir data logs temp mydata

REM 空のファイルmy.iniを作成
copy nul my.ini
```

下記のようなディレクトリ構成になります。

```txt
bin/
data/
docs/
include/
lib/
LICENSE
logs/
my.ini
mydata/
README
share/
temp/
```

`my.ini`を下記のように編集します。

```ini:my.ini
[mysqld]
# set basedir to your installation path
basedir=./
# set datadir to the location of your data directory
datadir=./data

port=3306
socket=/temp/mysql.sock
key_buffer_size=16M

# この秒数以内（？）に完了しないクエリは処理停止する
wait_timeout=99999

# 起動するマシンスペックによって変更すること
max_allowed_packet=4G
innodb_buffer_pool_size=4G
```

下記コマンドでMySQLを初期化します。

```bat
bin\mysqld --initialize-insecure --user=mysql
```

下記のようにMySQLを開始するスクリプト`run.bat`を下記のように作成します。

```bat:run.bat
REM スクリプトのあるディレクトリへcdします
cd /d %~dp0

bin\mysqld --defaults-file="./my.ini" --console
if not %errorlevel% == 0 (pause)
```

`run.bat`をダブルクリックし起動します（ポート周りのエラーが出る場合は`run.bat`を右クリック > 管理者として実行）。これでデータベースクライアントからの接続を待ち受け続けてくれます。サーバを停止する場合は、`Ctrl + C`で終了させることができます。
同様の手順で別のディレクトリに新しいZip版MySQLを展開すれば、別環境を立てることができます。また、このディレクトリを丸ごとどこかに退避しておけば、バックアップが取れます。

- 参考
  - [Windows10にzipのMySQLをインストールして起動する方法 #MySQL - Qiita](https://qiita.com/KOJI-YAMAMOTO/items/02af20e7b5cd27932a27)

## 接続

Zip版MySQLサーバに付属している`mysql.exe`を使えば、先ほど立ち上げたMySQLサーバに接続できます。

```bat
bin\mysql.exe -uroot --skip-password
```

初期設定例です。

```bat
bin\mysql.exe -uroot --skip-password -e "CREATE DATABASE sample;"
```

クエリ実行例です。

```sql:query.sql
CREATE TABLE users (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
INSERT INTO users(name) VALUES ('日本語テスト');
SELECT * FROM users;
```

```bat
REM ※デフォルトではsqlファイルはShift-JISとして読み込まれます。
bin\mysql.exe -uroot --skip-password sample <query.sql

REM 下記のように直接クエリを書くこともできます。
bin\mysql.exe -uroot --skip-password sample -e "select * from users"
```

## その他

### SQLファイル投入のTips

Windowsでは、SQLファイルはShift-JISとして読み込まれます。UTF-8として読み込みたい場合は、`my.ini`の各種セクションに追記します。

```ini:my.ini
# 各セクションにそれぞれ追記

[mysqld]
character-set-server=utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
```

```bat
REM utf8のファイルOK
bin\mysql.exe -uroot --skip-password sample <utf8_query.sql
```

- 参考
  - [Win10版 MySQL の文字コードが反映されない - ゆるキャリエンジニア日誌](https://nukomabo.work/post-47/)

### ダンプ取り込みのTips

他環境から取得したダンプデータを取り込むとき、REDOログを無効にすることでdump取り込みを高速化できます（MySQL 8.0以降）。REDOログを無効にするには、下記のクエリを実行します。

```sql
ALTER INSTANCE DISABLE INNODB REDO_LOG;
```

ダンプの取り込みが終わったら、REDOログを有効化しておきます。

```sql
ALTER INSTANCE ENABLE INNODB REDO_LOG;
```