TECHNOLOGY

WSL上でのMySQLのインストールとWindowsからの接続 (Ubuntu 22.04.3)

本記事では、WSL上のUbuntuにMySQLをインストールしてサーバーを立ち上げる方法と、WindowsからMySQL WorkbenchによりWSL上のMySQLサーバーに接続する方法を示します。

目次

  1. 準備
  2. MySQLのインストール
  3. MySQLサーバーの起動・停止・再起動
    1. systemctlコマンド
    2. serviceコマンド
  4. rootのパスワードの設定
    1. rootのパスワードの設定
    2. rootのパスワードが設定されたことの確認
  5. セキュリティ強化のための設定
    1. mysql_secure_installationの実行
    2. パスワード認証のポリシーの変更
  6. MySQLサーバーのPortの変更
  7. パスワード認証プラグインの確認
  8. MySQL WorkbenchによるWSL上のMySQLへの接続
  9. まとめ

準備

WSL(Windows Subsystem for Linux)上にLinuxのディストリビューションであるUbuntuをインストールして、その上でMySQLサーバーを立ち上げます。

その準備となるWSLとUbuntuのインストールについては、以下の記事をご覧ください。

WindowsのマークとLinuxのペンギンが一緒にのった絵。WSLはWindowsからLinuxを扱うことのできるツールなので、それを表した。
WSL(Windows Subsystem for Linux)インストールからファイル操作、プログラムの実行まで

WSLを利用することで、Windowsコンピュータ上でLinuxを利用することが可能になります。本記事では、WSLのインストール方法からファイル操作までを解説し、異なるOS間でのプログラムの実行とファイルアクセスが非常に簡単できることを示します。

続きを見る

記事執筆段階において、

・ Windows 11 Home (22H2, Build 22621.2134)

・ Ubuntu 22.04.3 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

を使用しております。

MySQLのインストール

MySQLは、オープンソースのリレーショナルデータベース管理システムで、主にウェブアプリケーションやソフトウェアで使用され、データの保存、取得、管理を行います。MySQLは高速で信頼性が高く、多くのプラットフォームで利用できます。データベースのアクセスや操作にはSQL(Structured Query Language)を使用します。MySQLはクライアント/サーバー型を採用しており、多くのユーザーが同時にデータベースにアクセスできる特徴をもっています。

WSL上のUbuntuにMySQLサーバーをインストールする手順を示します。

1.パッケージ一覧を更新します。

$ sudo apt update

2. MySQLをインストールします。

$ sudo apt install mysql-server

3. MySQLのバージョン番号とインストールを確認します。

$ mysql --version
mysql  Ver 8.0.33-0ubuntu0.22.04.4 for Linux on x86_64 ((Ubuntu))

記事執筆時点でのMySQLのバージョンは8.0.33でした。

MySQLサーバーの起動・停止・再起動

常時稼働しているアプリケーションをサービスと呼びます。MySQLはサービスです。Ubuntuではサービスをsystemctlコマンド、または、serviceコマンドで操作します。

systemctlコマンド

systemctlコマンドでmysqlサーバーを操作する基本的な方法を示します。

説明コマンド
MySQLサーバーを起動するsudo systemctl start mysql
MySQLサーバーを停止するsudo systemctl stop mysql
MySQLサーバーを再起動するsudo systemctl restart mysql
MySQLの状態を確認する
active = 起動中
inactive = 停止中(エラーなし)
failed = 停止中(起動しようとして失敗)
systemctl status mysql
OS起動時にMySQLを自動起動させるsudo systemctl enable mysql
OS起動時にMySQLを自動起動しないsudo systemctl disable mysql

serviceコマンド

serviceコマンドでmysqlサーバーを操作する基本的な方法を示します。

説明コマンド
MySQLサーバーを起動するsudo service mysql start
MySQLサーバーを停止するsudo service mysql stop
MySQLサーバーを再起動するsudo service mysql restart
MySQLの状態を確認する
active = 起動中
inactive = 停止中(エラーなし)
failed = 停止中(起動しようとして失敗)
service mysql status

rootのパスワードの設定

rootのパスワードの設定

次のコマンドでrootユーザーとして、MySQLにログインします。

$ sudo mysql

次に、MySQLサーバーにrootユーザーのパスワードを設定します。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '〇〇〇〇';

〇〇〇〇の部分に設定するパスワードを記述します。そして、

FLUSH PRIVILEGES;

を実行して、rootユーザーのパスワード変更を反映します。反映した後は、

exit

として、MySQLの対話モードから抜けます。

rootのパスワードが設定されたことの確認

sudoコマンドでMySQLにログインしようとすると、エラーが発生することが確認できます。

$ sudo mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

これは先ほどMySQLのrootユーザーのパスワードを変更したためです。

rootユーザーでログインする場合には、

$ mysql -u root -p

とします。パスワードを訊かれますので、先ほど設定したパスワードを入力します。以上でrootユーザーのパスワードが設定されたことを確認できました。

セキュリティ強化のための設定

mysql_secure_installationの実行

MySQLサーバーを初めてインストールした後に、セキュリティを強化するためのスプリクトがあります。次のコマンドで実行します。

$ mysql_secure_installation 

パスワードを訊かれますので、設定したrootパスワードを入力します。

すると、いくつかの質問を受けますので、それについて1つ1つ回答していきます。

各質問の意味を以下に示します。

質問意味参考
VALIDATE PASSWORD COMPONENT can be used to
test passwords and improve security.
It checks the strength of password and allows
the users to set only those passwords which are secure enough.
Would you like to setup VALIDATE PASSWORD component?
パスワード認証のポリシーを設定します。ポリシーは次の3つから選択します。
LOW / MEDIUM / STRONG

選んだポリシーに基づいて、パスワードを変更した際に十分な強度をもつか確認が行われます。

また、現在のパスワードを変更するかどうかについても聞かれます(変更しないことも可能です)
設定することが推奨です(y)。

パスワードのポリシーは別途変更することが可能です。
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to h
ave a user account created for them.
This is intended only for testing, and to make
the installation go a bit smoother.
You should remove them before moving into
a production environment. Remove anonymous users?
匿名ユーザーを削除するかを質問しています。

匿名ユーザーMySQLをデフォルトでインストールすると、匿名ユーザーが作成されます。

匿名ユーザーは名前もパスワードも持たないアカウントを意味し、
この匿名ユーザーによって、ユーザーアカウントを作成せずに
誰でもMySQLにログインできるようになっています。
匿名ユーザーは削除することが推奨です(y)。

匿名ユーザーはセキュリティ上のリスクを持っているため、セキュリティが重要とされるどんな環境でも削除することが推奨されます。
Normally, root should only be allowed to
connect from 'localhost'.
This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely?
リモートからrootユーザーのログインを許可しないように設定するかを尋ねています。

通常、rootユーザーはlocalhostのみから接続が許可されるべきです。

これにより、ネットワークを介してrootoパスワードを推測しようとするものからの
アクセスを防ぐことができます。
リモートからのrootユーザーのログインを許可しないことが推奨です(y)。
By default, MySQL comes with a database named 'test'
that anyone can access.
This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it?
テスト用のデータベースを削除するかどうかを尋ねています。

MySQLのデフォルトの設定では、'test'という名前のデータベースが含まれており、
このデータベースは誰でもアクセスできるようになっています。

このデータベースはテスト目的のみを意図しており、本番環境に移行する前に削除すべきデータベースです。
セキュリティ上は'test'データベースとそのアクセス権を削除することが推奨されています(y)。
Reloading the privilege tables will ensure that
all changes made so far will take effect immediately.
Reload privilege tables now?
これまでに行われたすべての変更が直ちに反映されるように、
権限テーブルを再読み込みするかを尋ねています。
再読み込みすることが推奨されます(y)。

パスワード認証のポリシーの変更

MySQLのパスワード認証ポリシーの確認は、MySQLにログインした後に次のコマンドを用います。

show variables like 'validate_password%';

実行すると次のような表が表示されます。以下はパスワード認証ポリシーをSTRONGとした場合の例です。

mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | STRONG |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

これらの値を変更するには、Variable_nameの欄の変数〇〇〇に対して、

set global 〇〇〇 = 値 ;

とすれば変更できます。例えば、パスワード認証ポリシーをLOWに変更するには、

set global validate_password.policy = 'LOW';

とします。

MySQLサーバーのPortの変更

WSL上で起動しているMySQLサーバーが動作するデフォルトのポート(3306)を非デフォルトのポートに変更します。

この操作により、WSL上とホストマシーン上に2つの異なるMySQLサーバーを同時に実行することができます。

まず、Bash上で設定ファイルを開きます。

sudo vim /etc/mysql/my.cnf

エディタにvimを使用していますが、nanoでもemacsでも使い慣れたエディタを使用してください。次の文を追加します。

[mysqld]
port = 33061

デフォルトのMySQLのポートは3306です。これを33061に変更する例になります。ポートを変更したら、MySQLサーバーを再起動します。

sudo systemctl restart mysql

これでWSL上のMySQLサーバーのポート番号が33061になりました。ブラウザなどでURLにhttp://localhost:33061/と打ち込むと、WSL上のMySQLサーバーがポート33061で起動していることを確認できます。

パスワード認証プラグインの確認

MySQLには2種類のパスワードの認証プラグインがあります。1つは、caching_sha2_password、もう1つは、mysql_native_passwordになります。

認証プラグインアルゴリズム
caching_sha2_passwordSALT付きのSHA-256を使用します。
mysql_native_passwordSALTなしのSHA-1を使用します。
以前のバージョンのMySQLで主に使用されていました。
認証プロトコルとして、チャレンジ&レスポンス認証を使用します。
複数のユーザーが同じパスワードを利用していると authentication_stringが同じになるため、
NIST によりSHA-1を認証に使うことは非推奨となっています。

MySQLのデフォルトの認証方法を確認するには、MySQLにログインした後に、次のコマンドを実行します。

show variables like 'default_authentication_plugin';

以下は実行例です。

+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

MySQL8.0以降はデフォルトの認証プラグインはcaching_sha2_passwordになっています。caching_sha2_passwordはmysql_native_passwordよりもセキュリティが強化されています。ただし、新しい認証プラグインのため互換性に問題がある場合があります。

一部のアプリケーションやクライアントはcaching_sha2_passwordをサポートしていない場合があり、その場合には認証エラーが発生します。そのようなアプリケーションを使用するときには、mysql_native_passwordへの変更が必要です。

MySQLのデフォルトの変更は、MySQLの設定ファイルを修正します。

sudo vim /etc/mysql/my.cnf

により設定ファイルを開き、[mysqld]に以下の一文を追加します。

[mysqld]
default_authentication_plugin = mysql_native_password

設定ファイルを変更した後、MySQLサーバーを再起動するとデフォルトの認証プラグインがmysql_native_passwordに変更されます。

その他に、ユーザーごとの認証プラグインは次のように確認できます。例えば、rootの認証方法を確認するには次のコマンドを実行します。

select User, Plugin from mysql.user where User = 'root';

以下は実行例です。

+------+-----------------------+
| User | Plugin                |
+------+-----------------------+
| root | mysql_native_password |
+------+-----------------------+
1 row in set (0.00 sec)

rootのパスワードがmysql_native_passwordになっているのは、パスワード設定の際に「ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY...」という形で認証プラグインを指定したためです。

MySQL WorkbenchによるWSL上のMySQLへの接続

MySQLを操作できるツールとしてMySQL Workbenchを使って、WSL上のMySQLサーバーにアクセスします。MySQL WorkbenchはMySQLの公式統合開発環境(IDE)ツールで、データベースの管理から設計・開発までGUIで操作することができます。

WindowsやmacOS、Linuxの主要なプラットフォームで動作し、公式のMySQLウェブサイトから無料でダウンロードできます。

公式ページに飛び「ダウンロードはこちら」というボタンを押します。その後、Windows上にインストールするため、Select Operating Systemで「Microsoft Windows」を選択し、「Go to Download Page >」のボタンを押します。

すると次のページが表示されます。

mysql-installer-web-communitymysql-installer-communityの2種類がありますが、前者はオンライン状態でインストールを行うためのインストーラ、後者はオフライン状態でインストールするためのインストーラです。

ここでは前者を選択しました。ログインを求められますが、オラクルアカウントをもたない場合には「No thanks, just start my download.」からダウンロードできます。

ダウンロードしたインストーラを実行すると、Setup Typeを選択します。

本記事では、Customを選択し、「Applications」の「MySQL Workbench」のみをインストールしました。再度インストーラを実行することで、後から変更することが可能です。

インストール後にMySQL Workbenchを実行して、WSLへのテスト接続を行います。メニューの「Database」->「Manage Connections」を開きます。

この画面で以下の項目を設定します。

項目設定値参考
Connection NameWSL Ubuntu任意の名前を設定できます。
Connection MethodStandard (TCP/IP)
Hostnamelocalhost
Port 33061デフォルトは3306。
上述したようにPort番号を本記事では変更したため、
その設定値33061を用います。
Usernameroot
PasswordWSL上のMySQLで設定したrootのパスワード
Default Schemaデフォルトで表示するデータベース名後から変更できます。

画面右下にあるTest Connectionを実行して、「Successfully made the MySQL connection」というダイアログボックスが表示されたら、WindowsからWSL上のMySQLへの接続ができています。

まとめ

本記事では、WSL上のUbuntuにMySQLをインストールして、MySQL WorkbenchによりWSL上のMySQLへの接続し、以下について説明しました。

・ インストール方法

・ ルートパスワード変更

・ mysql_secure_installationによるセキュリティの簡易設定

・ MySQLサーバーのポート変更

・ MySQL WorkbenchによるWSL上のMySQLサーバーへの接続設定

同じように勉強している方の参考になりましたら幸いです。あたらしいことができるようになるのは楽しいですね!

-TECHNOLOGY
-, ,