インストーラー版を使わない理由
必要に応じてバージョンの切り替えが必要になるものは、インストーラーを使うと、別のバージョンを使いたい時にどうしたらいいのかが分からなくなることや、使わない時も自動起動されてしまいます。
自分が使う時に目的とするバージョンを立ち上げればいいので、ZIPファイルを展開してMySQL8.0 を使える状態にします。
やること
- ZIPアーカイブ版のダウンロードと展開
- my.cnf を作成
- MySQLの初期化
- rootパスワードの変更
- タイムゾーンの設定
- databaseと専用ユーザを作成
TL;DR
-
mysqld --initialize
で生成されるrootパスワードは mysqld.err にある。 - タイムゾーンは
+9:00
でもok。 -
grant all privileges
は使えないから、create user
とgrant
を使う。
設定手順
1. ZIPアーカイブ版のダウンロードと展開
MySQLのダウンロードページ の Other Downloads にある Windows (x86, 64-bit), ZIP Archive をダウンロードします。
今回は、mysql-8.0.15-winx64.zip をダウンロードしました。ダウンロードした mysql-8.0.15-winx64.zip を任意のディレクトリへ展開します。今回は d:\my-work\mysql-8.0.15-winx64
に展開しました。
2. my.cnf を作成
展開したディレクトリ直下に my.cnf を作成します。フルパスで表記すると d:\my-work\mysql-8.0.15-winx64\my.cnf
になります。
多くの設定項目があるのですが、必要なだけを設定します。
[mysqld]
default-time-zone='+9:00'
default_authentication_plugin=mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_ja_0900_as_cs
init-connect = SET NAMES utf8mb4
# dirs
basedir=d:/my-work/mysql-8.0.15-winx64
datadir=d:/my-work/mysql-8.0.15-winx64/data
tmpdir =d:/my-work/mysql-8.0.15-winx64/temp
pid-file=d:/my-work/mysql-8.0.15-winx64/mysqld.pid
3. MySQLの初期化
my.cnf
の datadir
と tempdir
で指定したディレクトリを作成した後に bin\mysqld --initialize
を実行します。
cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> mkdir data
cmd> mkdir temp
cmd> bin\mysqld --initialize
バージョンが5.7の頃よりは時間が長く感じ(個人差があります)、dataディレクトリ配下にモリモリとファイルが作成されていきます。
プロンプトが返ってきたら、MySQLのサーバを起動します。
cmd> bin\mysqld --standalone --console
4. rootパスワードの変更
bin\mysqld --initialize で生成されたパスワードを確認
DBの初期化時に --initialize-insecure
オプションを使わずに、--initialize
オプションを使ったので、rootユーザにはランダムなパスワードが設定されています。そのままでは使い難いので、別のパスワードを設定します。
ランダムなパスワードは data\mysqld.err に出力されています。
2019-02-11T00:16:51.201908Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [ここがパスワード]
rootのパスワードを変更
新しいコマンドプロンプトを立ち上げて alter user
でパスワードを変更します。
cmd> cd /d d:\my-work\mysql-8.0.15-winx64
cmd> bin\mysql -u root -p -h localhost
Enter password: [data/mysqld.errに記録されているパスワードを入力]
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> alter user root@'localhost' identified by '[新しパスワード]';
5. タイムゾーンの設定
my.cnfにタイムゾーンを指定するときに default-time-zone='Asia/Tokyo'
と記載する記事を見かけます。Windows版のZIP版では mysql.time_XXXX
テーブルが空です。
公式ドキュメントのMySQL Server Time Zone Supportに従ってタイムゾーンのデータを投入します。
https://dev.mysql.com/downloads/timezones.html から timezone_2018i_posix_sql.zip をダウンロードして、任意のディレクトリに展開します。展開すると、timezone_posix.sql
があります。
rootユーザでMySQLに接続して、 mysql
データベースを選択して、 timezone_posix.sql
に記載されたスクリプトを実行します。
cmd> bin\mysql -u root -p -h localhost
mysql> use mysql
mysql> \. path/to/timezone_posix.sql
スクリプトの実行が終了したら、 my.cnfのtimezoneを Asia/Tokyo
に変更します。その後、MySQLを再起動してください。
default-time-zone='Asia/Tokyo'
タイムゾーンは日本だけで使っているのであれば+9:00
でもいいと思うけど、一時期にサマータイムが騒がれた時に +9:00
に固定すると夏時間に対応できないのと、unix系のプラットフォームとそろえるために、Asia/Tokyo
にしました。
6.databaseと専用ユーザを作成
create database
は今まで通りです。 MySQL5.xまでは grant
で権限付与とパスワード設定を行えましたが、MySQL8からロールができたことで、ユーザ作成と権限付与を別々に行います。
詳しくは mysql8 grant all privileges でググってください。
cmd> bin\mysql -u root -p -h localhost
mysql> create database my_db;
mysql> create user 'my_db_user'@'localhost' identified by 'secret';
mysql> grant all privileges on my_db.* to 'my_db_user'@'localhost';
バッチファイル
インストーラーを使わないのでバッチファイルを作っておきます。
MySQLを起動する
d:\my-work\mysql-8.0.15-winx64\bin\mysqld --standalone --console
エクスプローラーか mysql_start.bat
をダブルクリックして、MySQLを起動します。起動した後はコマンドのウィンドウが残り続けます。終了するときは、コマンドのウィンドウで ctrl+c
を入力してください。
MySQLにパスを通して、コマンドプロンプトからMyQLのコマンドを利用できる
set PATH=d:\my-work\mysql-8.0.15-winx64\bin;%PATH%
start
MySQLにパスが通った状態でコマンドプロンプトが起動するので、MySQLの任意のコマンドを実行できます。
メモ: --initialize-insecure を使わなかった理由
--initialize-insecure
を使わなかったのは、rootユーザのパスワードを空にすると、そのまま使い続けてしまうので、それはよくないなか~と思ったのと、パスワードを設定するためには、--skip-grant-tables
を指定して再起動する必要があります。
それなら、--initialize
を使うのがよいかなと思いました。