MySQL8をzipファイルからインストール
最近ではMariaDBを使っていて、しばらくMySQLに触れていませんでしたが、気づけばメジャーバージョンが8になっていたのでWindows環境にインストールしてみたいと思います。
バージョン5の時にメモしておいたzipファイルからのインストールの方法も通用しなくなっているようだったので、 MySQL:「2.3.4 noinstall ZIP アーカイブを使用した Microsoft Windows への MySQL のインストール」を参考に進めていきたいと思います。
ダウンロード
バイナリのダウンロードは、トップページから「ダウンロード」、「MySQL Community (GPL) Downloads」、「MySQL Community Server」とページを進めていきます。
インストーラーが必要な場合は「MySQL Community Server」ではなく「MySQL Installer for Windows」の方を選択してください。
ダウンロード時のユーザーログイン/登録が下段のNo Thanksからスキップできるのは以前と変わらずでした。
ダウンロードしたら、展開して配置します。ここでは、mysql-8とリネームしてd:¥に配置しました(d:¥mysql-8)。
Program Files等管理権限が必要な場所に持っていくと、設定ファイル編集時に手間がかかります。設定が安定するまでは一時ファイルを利用するのもいいかもしれません。
my.ini(オプションファイル)の作成
次に設定ファイルを作成します。Windows環境ではmy.iniという名前になります。
d:¥mysql-8にmy.iniファイルを作成して次のように記述します。下線部は自身が設定した場所に合わせて変更してください。
フォルダを指定する際の区切りは¥をエスケープした¥¥という形を使うか/を利用します。
my.ini
[mysqld] # ルートフォルダ basedir=D:/mysql-8 # データフォルダ datadir=D:/mysql-8/data # エラーログファイル名 log-error="mysql-error.log"
データフォルダの作成と初期化
先ほどmy.iniにデータフォルダの場所を記述しましたが、このフォルダはデフォルトでは存在しませんので作成します。ちなみに、データフォルダの場所はmysqlが書き込める場所ならどこでもいいです。
フォルダを作成したら初期化します。
ターミナル(コマンドプロンプトやPower Shell)で次のように操作します。ここではPower Shellを使っています。
PS >cd D:¥mysql-8 (コマンドプロンプトの場合は cd /d とする必要があります) PS >bin¥mysqld --initialize --user=mysql
するとdataフォルダの中にエラーログファイル名として指定したファイルが出力されるので、テキストエディタで開きます。するとそこに初期パスワードが出力されていますのでメモします。
data¥mysql-error.log
2022-06-12T01:56:46.032459Z 0 [System] [MY-013169] [Server] D:¥mysql-8¥bin¥mysqld.exe (mysqld 8.0.29) initializing of server in progress as process 2340 2022-06-12T01:56:46.125578Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2022-06-12T01:56:58.800353Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2022-06-12T01:57:07.723893Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: b6hxCrlTZ2.u
初回起動とrootパスワードの設定
MySQLサーバーを起動します。初回起動時はWindowsのファイアウォールが反応すると思いますが、許可します。
コマンドを実行するとプロンプトは戻ってきませんが、それで正常です。逆に、終了してしまうようなら何かしらのエラーが発生していると考えられます。
ここでは--consoleオプションをつけています。通常下のようなメッセージはすべてエラーログに出力されます。設定が安定していない段階では、ファイルを開かずに状態を判定できるので便利です。
PS >cd D:¥mysql-8 PS >bin¥mysqld --console 2022-06-12T02:12:02.682000Z 0 [System] [MY-010116] [Server] D:¥mysql-8¥bin¥mysqld.exe (mysqld 8.0.29) starting as process 7856 2022-06-12T02:12:02.752270Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2022-06-12T02:12:04.613757Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2022-06-12T02:12:05.714250Z 0 [System] [MY-010229] [Server] Starting XA crash recovery... 2022-06-12T02:12:05.812422Z 0 [System] [MY-010232] [Server] XA crash recovery finished. 2022-06-12T02:12:08.200750Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2022-06-12T02:12:08.201331Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2022-06-12T02:12:13.150110Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060 2022-06-12T02:12:13.150515Z 0 [System] [MY-010931] [Server] D:¥mysql-8¥bin¥mysqld.exe: ready for connections. Version: '8.0.29' socket: '' port: 3306 MySQL Community Server - GPL.
これでサーバーが起動しました。ここへクライアントから接続したいのですが、サーバーはプロンプトが戻ってきませんので、もうひとつターミナルを起動します。
クライアント用のコマンドはサーバー側と一文字違いの「mysql」です。ログイン時に、さきほどメモしておいたパスワードを使います。
パスワードが受けいらられ、プロンプトがmysql>となればログインは成功です。
PS >cd D:¥mysql-8 PS >bin¥mysql -u root -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or ¥g. Your MySQL connection id is 8 Server version: 8.0.29 Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '¥h' for help. Type '¥c' to clear the current input statement. mysql>
rootのパスワードを仮のパスワードから変更します。rootは管理者用のユーザーになりますので、パスワードは厳重に管理しておきましょう。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
ちなみに@localhostの部分ですが、これはlocalhostからのアクセスを指定しています。rootユーザーのログインはローカルホスト(MySQLが起動しているサーバー)からしか許可しないケースが多いと思いますが、別のIPからのアクセスを許可したい場合は次のようにします。
mysql> CREATE USER 'root'@'192.168.1.1' IDENTIFIED BY 'root-password'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.1';
新しいユーザーを作成して、GRANT文で権限を与えています。
rootというユーザー名はすでにいるのにCREATEするのに若干の違和感を覚えますが、MySQLではユーザー名と接続元がセットで識別されていると考えるとわかりやすいかもしれません。
GRANTで与えた権限を外すにはGRANTの部分をREVOKE、TOの部分をFROMにします。
また、接続元のIPは「192.168.1.0/24」等ネットワークにしたり、「%」のワイルドカードを使うこともできます。
my.iniサンプル
筆者の場合他で稼働中のMariaDBの設定を参考に次のようにmy.iniを構成しました。
設定ファイル内のキー名称では-と_の間は互換性があり、どちらを使っても問題ありません。ただし、値ではそのルールは適用されないので utf8mb4_general_ciはアンダーバーにしておく必要があります。
またskip-name-resolveのエントリーを入れると、クライアントでの接続時にlocalhostとしてアクセスしていたものが127.0.0.1またはIPv6におけるローカルホストである::1としてアクセスするようになります。root@localhostとroot@127.0.0.1は管理上別のユーザーとみなされるようで、127.0.0.1に対するパスワードを設定していない場合アクセスできなくなってしまうので注意してください。その場合は、一度skip-name-resolveをコメントアウトしてサーバーを再起動させれば元通り接続できますので、127.0.0.1に対しての設定をします。
my.ini
[mysqld] # ルートフォルダ basedir=D:/mysql-8 # データフォルダ datadir=D:/mysql-8/data # エラーログファイル名 log-error="mysql-error.log" # (Other) Basic Settings # IPv4だけにしたい場合はbind-addressを0.0.0.0にします。 # IPv6を含んだすべてを受け入れる場合はコメントアウトするか*とします。 # bind-addressは,で区切って複数の指定も可能です bind-address=0.0.0.0 port = 3306 #skip-name-resolve # Fine Tuning key-buffer-size = 16M max-allowed-packet = 16M thread-stack = 192K thread-cache-size = 8 # Log slow-query-log-file = D:/mysql-8/data/slow-query.log long-query-time = 10 # InnoDB default-storage-engine=InnoDB innodb-data-home-dir = D:/mysql-8/data/ innodb-data-file-path = ibdata1:10M:autoextend innodb-log-group-home-dir = D:/mysql-8/data/ innodb-buffer-pool-size = 512M innodb-log-file-size =128M innodb-log-buffer-size=256M innodb-flush-log-at-trx-commit = 1 innodb-lock-wait-timeout = 50 innodb-file-per-table = 1 # Character set character-set-server = utf8mb4 collation-server = utf8mb4_general_ci
現在の設定や設定可能なオプションを表示するには「mysqld --verbose --help」とすると表示されます。
サービス化
MSIインストーラーを利用した場合、MySQLはサービスとしてWindows開始時に起動されるようになると思います。それと同様にサービスとしたい場合は、「mysqld --install」とします。この時のターミナルは管理者権限で起動しておく必要があります。デフォルトだと「MySQL」という名前でサービスに登録されます。任意に名前を付けたい場合は--installの後に名前を設定します。
サービスを取り消したい場合は --removeとします。この時サービスは停止した状態でないといけません、また名前を付けてインストールした場合はremoveでもつけた名前を指定しなければいけません。
PS >cd D:¥mysql-8 (管理者権限が必要です) PS >bin¥mysqld --install ... PS >bin¥mysqld --remove ...
rootのパスワードを忘れた場合
rootのパスワードを忘れてしまった場合は、バージョン8ではB.3.3.2 root のパスワードをリセットする方法に従って次のようにします。
まず、MySQLサーバーを停止します。その後、任意の場所にパスワード変更のSQLコマンドを記述したファイルを作成します。ここではD:¥mysql-8¥resetpass.txtとして作成しました。
resetpass.txt
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password';次に、mysqldに--init-fileオプションをつけその値にファイルのパスを指定して起動します。
PS >cd D:¥mysql-8 PS >bin¥mysqld --init-file=D:¥mysql-8¥resetpass.txt --console
これでパスワードがリセットされます。