検証環境としての MySQL8 インストール・フリー構築法 ～ 超簡単 ～

## はじめに

前回紹介した Tomcat9 構築法 の続編です。今回は、MySQL8 について同様に取り扱っていきます。


https://qiita.com/ParakeetOnTheHead/private/317598fb34af24633867

## 環境の準備

:::note inro
前提として、MySQL 8.0 を利用する際には「 [Microsoft Visual C++ 2015、2017、2019、および 2022 再頒布可能パッケージ](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170) 」がインストールされている必要がありますので、事前にインストールお願いします。
:::

1. 「[公式サイト](https://downloads.mysql.com/archives/community/)」から 検証用のバージョンと OS を選択して ZIP をダウンロードします。
    ここでは、単純にサーバーのみダウンロードします。
    ![公式サイト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/00fc70d9-1d4b-8719-3b39-1c778daaee49.png)



1. ZIP を解凍し、任意の場所に配置します。（ `%userprofile%` 配下など）
    以降、解凍したフォルダ（`📁 mysql-8.0.22-winx64`）を「インストールフォルダ」と呼びます。

    ```sh:解凍したフォルダの構造（概要）
    📁 mysql-8.0.22-winx64
     ├─ 📁 bin        # 実行可能ファイルが格納されています。 
     ├─ 📁 docs       # ドキュメントが格納されています。
     ├─ 📁 include    # ソースコードやヘッダーファイルが格納されています。
     ├─ 📁 lib        # ライブラリやプラグインが格納されています。
     └─ 📁 share      # 言語ファイルやエラーメッセージなどが格納されています。
     └─ (📁 data)     # MySQLサーバーが管理する情報が格納されているデータディレクトリです。
     └─ (📄 my.ini)   # MySQLの設定ファイル
    ```

    `📁 data` と `📄 my.ini` については、後続のステップで作成します。

1. インストールフォルダに `📄 my.ini` という名前のファイルを新規作成し、以下の内容を書き込みます。

    ```ini:my.ini
    [mysql]
    default-character-set=utf8mb4
    
    [mysqld]
    basedir=.
    datadir=.\data
    port=3306
    character-set-server=utf8mb4
    collation_server=utf8mb4_bin
    #default_authentication_plugin=mysql_native_password # MySQL 5.7 用
    default_authentication_plugin=caching_sha2_password # MySQL 8 用
    ```

1.  インストールフォルダで PowerShell[^1] を開き以下のコマンドを実行。`📁 data` フォルダを生成します。

    ```powershell:dataフォルダ生成
    .\bin\mysqld --initialize-insecure
    ```

    `--initialize-insecure` は‘root’@'localhost’という管理者アカウントをパスワードなしで作成します。 これは、セキュリティ上よろしくないので、あくまで手軽に開発・検証環境を作りたい今回のような場合に限り有用です。代わりに、`--initialize` というオプションを使うと、‘root’@'localhost’のパスワードがランダムに生成されます。[^2]

[^1]: PowerShellでなくてもコマンドプロンプトでも構いません。

[^2]: ランダムに生成されたパスワードはサーバーエラーログに出力されるので、エラーログにてパスワードを確認したうえで、新たなパスワードに書き換える必要があります。具体的な手順については本稿の範囲外なので記述しません。インターネット上で必要に応じて調査ください。

    ```txt:エラーログの例 (data\hostname.err参照)
    2023-05-08T00:25:34.283322Z 0 [System] [MY-013169] [Server] C:\xxx\mysql-8.0.22-winx64\bin\mysqld.exe (mysqld 8.0.22) initializing of server in progress as process 24468
    2023-05-08T00:25:34.291521Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
    2023-05-08T00:25:34.832496Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
    2023-05-08T00:25:35.619163Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: kfud!?eoy9rL
    ```

1. 以上で準備完了。:open_mouth:

## 展開した MySQL8.0 の起動方法

### Case１：コンソールアプリとして実行

1.  インストールフォルダで PowerShell を開き以下のコマンドを実行します。

    ```powershell:dataフォルダ生成
    .\bin\mysqld --console 
    ```
    以下の様にコンソールで MySQL8.0 が起動します。

    ```mysql:mysqld --console
    2023-05-08T00:42:29.837409Z 0 [System] [MY-010116] [Server] C:\xxx\mysql-8.0.22-winx64\bin\mysqld.exe (mysqld 8.0.22) starting as process 26348
    2023-05-08T00:42:29.852224Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
    2023-05-08T00:42:30.194831Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
    2023-05-08T00:42:30.295927Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060
    2023-05-08T00:42:30.352874Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
    2023-05-08T00:42:30.353161Z 0 [System] [MY-013602] [Server] Channel mysql_main configured 
    to support TLS. Encrypted connections are now supported for this channel.
    2023-05-08T00:42:30.385601Z 0 [System] [MY-010931] [Server] C:\xxx\mysql-8.0.22-winx64\bin\mysqld.exe: ready for connections. Version: '8.0.22'  socket: ''  port: 3306  MySQL Community Server - GPL.
    ```

1. インストールフォルダで別 PowerShell を開き、以下のコマンドを実行します。
    ```powershell:mysql ログイン
    .\bin\mysql -u root -p
    ```
    パスワードを設定していないので、このままログイン可能です。パスワードの入力を求められますが、空白のまま `Enter` キーで進んでください。

1. コンソールを閉じるとサーバも停止します。


:::note info
ちなみに、個人的にお気に入りの MySQLクライアントは [HeidiSQL](https://forest.watch.impress.co.jp/library/software/heidisql/) です。MySQLだけでなく、複数の DB と接続できるし軽くて便利です。（ポータブル版使ってます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/721c4ed8-9778-e5ef-df9a-b26661b99f76.png)
:::



### Case２：Windows サービスとして実行

1. インストールフォルダで PowerShell を**管理者**として開き、以下のコマンドを実行します。[^3]

    ```powershell:"MySQL8.0.22" というサービス名で登録する場合
    .\bin\mysqld --install MySQL8.0.22
    ```
    サービスがインストールされると `Service successfully installed.` と表示されます。[^4]

    [^3]: 管理者権限で実行しない場合、`Install/Remove of the Service Denied!`というエラーで弾かれます。
    [^4]: インストールフォルダ以外の場所に配置した `my.ini` を読み込んで Windows サービス登録をする場合には `--defaults-file=C:\xxx\yyy\my.ini` とオプションを付与することで可能ですが、ファイルパスは絶対パスで指定する必要があります。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/c0ce1235-b8c2-9fd1-8acf-4b8f64546211.png)

    Tomcat の時と異なり最初から `管理者` としてサービス登録しているので、ログオンユーザーも `ローカル システムアカウント` として登録されています。

    「サービスの開始」をクリックし、MySQL サーバを起動。:open_mouth:

    ::: note info
    登録した Windows サービスを解除するには、同様に `remove` オプションを付与します。

    ```powershell:名前を指定してサービス登録解除
    PS C:\xxx\mysql-8.0.22-winx64>.\bin\mysqld --remove MySQL8.0.22
    Service successfully removed.
    ```

## インストール・フリー な MySQL を使った開発・検証

インストール版の MySQL と同じで `my.ini` ファイルを編集することでサーバの設定を変更できます。例えば、ポート番号を変更し、複数の MySQL サーバを同時に起動することも可能です。

手順書作ったり修正するときも、複数のバージョンをインストール・フリーで使えれば何かと捗りますね。焦って切替ミスらなければ

まぁ、その辺は一式スクリプト化して操作ミスが起こらないようにしましょう。


## まとめ

検証用に特定のシステム向けに専用の DB を作って保管しておきたい場合などは、同居している他のシステムの影響を受けずに環境を構築・保存できるので便利だと思います。

あと、`📁 インストールフォルダ` ごと環境のバックアップや共有もポータブルにできますし。
（試したことはない）