このチュートリアルの以前のバージョンは、Hazel Virdóによって作成されました。
MySQLは、人気のあるLAMP(Linux、Apache、MySQL、PHP/Python/Perl)スタックの一部として一般的にインストールされているオープンソースデータベース管理システムです。リレーショナルモデルを実装し、データを管理するためにStructured Query Language(SQLの名で知られる)を使用します。
このチュートリアルでは、Ubuntu 20.04サーバーにMySQLバージョン8.0
をインストールする方法について学習します。チュートリアルを完了すると、ウェブサイトやアプリケーションの構築に使えるリレーショナルデータベースができます。
このチュートリアルを実行するには、次のものが必要です。
Ubuntu 20.04では、APTパッケージリポジトリを使用してMySQLをインストールできます。本記事執筆時点で、デフォルトのUbuntuリポジトリで使用可能なMySQLバージョンは、バージョン8.0.19です。
インストールに当たり、サーバーのパッケージインデックスをしばらく更新していなければ、更新しておきます。
- sudo apt update
次に、mysql-server
パッケージをインストールします。
- sudo apt install mysql-server
これにより、MySQLがインストールされますが、パスワードを設定したり、その他の構成を変更するように求められることはありません。このままでは MySQLのインストールが安全ではないため、次に対処します。
新規インストールの場合は、付属のセキュリティスクリプトを実行する必要があります。 これにより、リモートrootログインやサンプルユーザーなどの安全性の低いデフォルトオプションの一部が変更されます。
セキュリティスクリプトを sudo
で実行します。
- sudo mysql_secure_installation
これにより、一連のプロンプトが表示され、MySQLインストールのセキュリティオプションを変更できます。 最初のプロンプトでは、MySQLパスワードの強度をテストするために使用できるValidate Password Pluginをセットアップするかどうかを尋ねられます。
Validate Password Pluginを設定する場合、パスワードで認証するMySQLユーザーにはすべて、選択したポリシーを満たすパスワードを設定する必要があります。最強のポリシーレベルは2
を入力して選択できますが、大文字、小文字、数字、特殊文字を含む8文字以上のパスワードが必要です。
OutputSecuring the MySQL server deployment.
Connecting to MySQL using a blank password.
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?
Press y|Y for Yes, any other key for No: Y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2
Validate Password Pluginを設定するかどうかにかかわらず、次のプロンプトではMySQLrootユーザーのパスワードを設定します。選択した安全なパスワードを入力して確認します。
OutputPlease set the password for root here.
New password:
Re-enter new password:
root MySQLユーザーのパスワードを設定していても、このユーザーはMySQLシェルに接続するときにパスワード認証するように設定されていないことに注意してください。
Validate Password Pluginを使用した場合、新しいパスワードの強さの評価を受け取ります。次に、入力したパスワードを保持するか、新しいパスワードを入力するかを尋ねられます。入力したパスワードの強さが十分であると判断したら、Y
を入力してスクリプトを継続します。
OutputEstimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
そこから、Y
を入力してからENTER
を押して、後続のすべての質問のデフォルトを受け入れることができます。 これにより、匿名 MySQLユーザーとテストデータベースの削除、リモート root ログインの禁止、 これらの新しいルールの読み込みが行われ、行ったばかりのMySQLの変更がすぐに反映されます。
スクリプトが完了すると、MySQLインストールが保護されます。MySQLクライアントを使用して専用のデータベースユーザーを作成することができます。
MySQLは、インストール時に、データベースを管理するrootユーザーアカウントを作成します。このユーザーはMySQLサーバーに完全な権限を有しており、すべてのデータベース、テーブル、ユーザーに対して100%制御が可能です。このため、このアカウントを管理機能以外で使用しないのがよいでしょう。このステップでは、MySQL root 権限を使って新しいユーザーアカウントを作成し、特権を付与する方法をまとめています。
MySQL 5.7
(またそれ以降のバージョン)を実行しているUbuntuシステムでは、rootMySQLユーザーはデフォルトによりパスワードではなくauth_socket
プラグインを使用して認証するように設定されています。ただしこのプラグインを使うには、MySQLクライアントを呼び出すオペレーティングシステムユーザー名と、コマンドで指定したMySQLユーザー名を一致させる必要があるため、root MySQLユーザーにアクセスできるようにするには sudo
権限でmysql
を呼び出す必要があります。
- sudo mysql
注: 他のチュートリアルに従いMySQLをインストールし、rootのパスワード認証を有効にした場合、MySQLシェルにアクセスするには別のコマンドを使用する必要があります。以下は、MySQL クライアントを通常のユーザー権限で実行し、認証によってデータベース内の管理者権限のみを取得するものです。
- mysql -u root -p
MySQLプロンプトにアクセスすると、CREATE USER
ステートメントで新しいユーザーを作成できます。これらは、次の一般的な構文に従います。
- CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
CREATE USER
の後、ユーザー名を指定します。続いて@
、このユーザーが接続するホスト名、となります。Ubuntuサーバーからローカルでこのユーザーにアクセスするだけなら、localhost
を指定できます。必ずしもユーザー名とホスト名をシングルクォーテションで囲む必要はありませんが、エラーを防ぐのに役立ちます。
ユーザーの認証プラグインを選択する際には、いくつかのオプションがあります。前述のauth_socket
プラグインは便利なもので、正規ユーザーがデータベースにアクセスするのにパスワードの入力を必要とせず、強力なセキュリティを実現します。しかし、リモート接続を止めてしまうため、外部プログラムがMySQLとやりとりする必要がある場合は事態が複雑になります。
代案として、MySQLのデフォルト認証プラグインであるcaching_sha2_password
でユーザー認証させる際、構文のWITHauthentication plugin
部分を完全に省くことができます。MySQLドキュメントでは、強力なセキュリティ機能を理由にパスワードログインを希望するユーザーにこのプラグインを推奨しています。
caching_sha2_password
で認証するユーザーを作成するには、次のコマンドを実行します。 sammy >
を好きなユーザー名に変更し、password
を強力なパスワードに変更してください。
- CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
注: PHPのバージョンによってはcaching_sha2_password
がエラーになるに問題が発生することが知られています。たとえばphpMyAdmin など、PHPアプリケーションでこのデータベースを使用しようとしているなら、 古くてもより確実なmysql_native_password
プラグインで認証するユーザーを作成した方がよいでしょう。
- CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
バージョンが分からなければ、caching_sha2_plugin
で認証するユーザーを作成しておき、後から次のコマンドで変更
することもできます。
- ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
新しいユーザーを作成した後、適切な権限を付与できます。ユーザー権限を付与する一般的な構文は次のとおりです。
- GRANT PRIVILEGE ON database.table TO 'username'@'host';
この例の構文の PRIVILEGE
値は、指定された database
と table
でユーザーが実行できるアクションを定義します。各コマンドをカンマ区切りでつなげ、同じユーザーに複数の権限を付与できます。また、データベースとテーブル名の代わりにアスタリスク (*
) を入力して、グローバル権限を付与することもできます。SQLにおいてアスタリスクは「すべて」のデータベースまたはテーブルを表す特殊文字です。
例に挙げると、次のコマンドは、データベース、テーブル、ユーザーをCREATE
、ALTER
、DROP
したり、サーバー上の任意のテーブルからデータをINSERT
、UPDATE
、DELETE
したりできるユーザーグローバル権限を付与します。同様に、データをクエリするSELECT
権限、キーワードを使用して外部キーを作成するREFERENCES
権限、FLUSH
操作を実行するRELOAD
権限も付与します。ただし、必要以上の権限をユーザーに付与するべきではないので、必要に応じてユーザー権限を調整してください。
使用可能な権限の完全なリストは公式MySQLドキュメントで確認できます。
sammy
を自分のMySQLユーザーの名前に置き換えてこのGRANT
ステートメントを実行し、ユーザーにこれらの権限を付与してください。
- GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
このステートメントにはWITH GRANT OPTION
も含まれています。これにより、MySQLユーザーからシステム上の他のユーザーに必要な権限を付与できます。
警告: MySQLユーザーにALL PRIVILEGES
権限を付与すると、多くのユーザーにrootユーザーと同様の広範なスーパーユーザー権限を与えることになります。
- GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
このMySQLユーザーにアクセスできるユーザーは誰でもサーバー上のすべてのデータベースを100%制御できることになるので、このような広範な権限は軽率に付与すべきではありません。
権限付与に続けてFLUSH PRIVILEGES
コマンドを実行すると良いでしょう。このコマンドは前述のCREATE USER
とGRANT
ステートメントの結果としてサーバーがキャッシュしたメモリを解放します。
- FLUSH PRIVILEGES;
これでMySQLクライアントを終了できます。
- exit
将来、新しいMySQLユーザーとしてログインするには、次のコマンドを使用します。
- mysql -u sammy -p
-p
フラグにより、MySQLクライアントからMySQLユーザーの認証パスワードを求められます。
最後に、MySQLインストールをテストしましょう。
インストール方法に関係なく、MySQLは自動的に起動するはずです。これをテストするには、ステータスを確認してください。
- systemctl status mysql.service
次のような出力が表示されます。
Output● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /usr/sbin/mysqld
MySQLが実行されていなければ、sudo systemctl start mysql
で起動できます。
追加のチェックとして、管理コマンドを実行できるクライアントである mysqladmin
ツールを使用してデータベースへの接続を試すことができます。 たとえば、このコマンドは、sammy (-u sammy
) としてMySQLに接続し、パスワードの入力を求め(-p
) 、バージョンを返すように指示します。 sammy
を専用のMySQLユーザー名に変更し、求められたらそのユーザーパスワードを入力してください:
- sudo mysqladmin -p -u sammy version
次のような出力が表示されます。
Outputmysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, 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.
Server version 8.0.19-0ubuntu5
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 10 min 44 sec
Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per second avg: 0.038
これは、MySQLが稼働していることを意味します。
これで、基本的なMySQLセットアップがサーバーにインストールされました。 次のステップの例をいくつか示します。
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!