備忘録的プログラミングリファレンス

MySQL のインストール

 Ubuntu における MySQL サーバーのインストールからユーザーの設定、ログインについて解説します。

 MySQL といったデータベースのインストールには、サーバーを構築する場合開発環境を構築する場合があります。 開発環境をインストールする場合は、以下の開発用パッケージのインストールから参照してください。

MySQL サーバーのインストール

 以下は、MySQL をサーバーとして運用する場合のインストールの方法です。

 もしも、MySQL データベースを使った API などの開発用のインストールは「開発用パッケージのインストール」を参照してください。 運用が目的なら、開発用パッケージはインストールしないで下さい。サーバーの改編が出来てしまいます。

インストール方法

 インストールの前にインストール済みのパッケージ群をアップデートしておきます。

$ sudo apt update

 管理者権限の apt コマンドによってインストールします。

$ sudo apt install mysql-server

 インストールができたらバージョンを確認してみましょう。

$ mysql -V
...

 mysql は MySQL のコマンドラインにログインするためのコマンドです。

 上記以外に MySQL サイトからインストールする方法もありますが、Ubuntu 版といったディストリビューションとは初期設定やディレクトリ構成などに違いがあります。
 そのような内容に違いがあることを考慮すると、特定のディストリビューションという制限はあるものの、ディストリビューションごとに用意されたパッケージを利用したほうが親和性が高く無難です。

 Ubuntu でのパッケージを利用したインストールでは、インストール後にデータベースが自動で起動するようになっています。

 インストール後はデフォルトでrootでログインができるようになっています。ユーザー名としては 'root'@'%'('root'@'localhost') です。
 ログインは以下のように sudo mysql を実行します。

$ sudo mysql

 MySQL をサーバーとして公開するならば、root でリモート接続ができないようにした方がよいでしょう。詳しくは以下のセキュリティー設定を参照してください。

ユーザーの確認

 MySQL に登録されているユーザとそのホストを確認するには以下のようにします。

mysql> SELECT user, host FROM mysql.user;

 詳しくはユーザー(アカウント)の確認を参照してください。

起動設定

 パッケージインストールによる MySQL はインストールするだけでサーバーとして自動で起動するようになっています。

 起動しているかを確認するには systemctl コマンドのオプション status を使用します。

$ systemctl status mysql

 mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
     Active: active (running) since Wed 2023-09-06 16:58:54 JST; 16min ago
    Process: 939 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=ex>
   Main PID: 1168 (mysqld)
     Status: "Server is operational"
      Tasks: 37 (limit: 9344)
     Memory: 430.4M
        CPU: 9.258s
     CGroup: /system.slice/mysql.service
             └─1168 /usr/sbin/mysqld

 9月 06 16:58:48 user-PC systemd[1]: Starting MySQL Community Server...
 9月 06 16:58:54 user-PC systemd[1]: Started MySQL Community Server.

 上記のように、MySQL サーバーがactiveになっていればログインが可能になります。

 MySQL を起動するためには systemctl コマンドのオプション start を使用します。

$ sudo systemctl start mysql

 MySQL の再起動は restart を使用します。

$ sudo systemctl restart mysql

 MySQL のコマンドラインへのログインに関しては以下のMySQL への初期ログインを参照してください。

古い MySQL の起動と停止

 以下は古い方法によるものだと思います。場合によってはこの方法では起動できないかもしれません。

起動
$ /etc/init.d/mysql start
再起動
$ /etc/init.d/mysql restart
停止
$ /etc/init.d/mysql stop

MySQL への初期ログイン

 Ubuntu のパッケージから MySQL をインストールして、sudo で mysql コマンドを実行すると以下のようにログインができます。

$ sudo mysql


Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2023, 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 でログインできることが分かります。

 ログアウトするには\qです。

mysql> \q

 mysql コマンドのみを実行すると以下のようにユーザー設定を行うことを促されます。

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

 インストールしたままでサーバーとして運用するにはリモートから root でログインできたり、テスト用のユーザーやそのデータベースが利用できるといったセキュリティー上好ましくない状態になっています。

 リモートから root でログインやテスト用のユーザー名の設定は、mysql_secure_installation コマンドで変更することができます。
 詳しくは以下のセキュリティー設定を参照してください。

セキュリティー設定

 この MySQL のセキュリティー設定はサーバーを運用する上で必要となると思われます。開発環境といったローカルのみでの MySQL の利用では必要ないかもしれません。

 インストールしたままではローカルより外部から root で通信可能で、テスト用のユーザーが登録されています。そのままでは推測可能なユーザーが利用できたりとセキュリティー上問題がありますので、サーバーとして運用する場合には mysql_secure_installation で以下の点について変更しておく必要があります。

  • MySQL 専用の root のパスワードの設定を行う
  • root でのログインはローカルのみで出来るようにする
  • テスト用のユーザーとそのデータベースを削除

以上の点を変更するには、sudo で mysql_secure_installation を実行します。

$ sudo mysql_secure_installation

 以下の設定が続きます。

Securing 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:
// パスワードの強度をテストする Validate Password Plugin をセットアップするか。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:
 1
// パスワードの強度を設定。

Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the "ALTER_USER" command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.
// root のパスワードの変更は ALTER_USER コマンドを使用する旨のメッセージ

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
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? (Press y|Y for Yes, any other key for No) :
// 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? (Press y|Y for Yes, any other key for No) :
// 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? (Press y|Y for Yes, any other key for No) :
// yでテスト用のデータベースを削除

...

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
// 最後に運用中の MySQL に以上の設定を反映する。yで反映する

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
// 最後に運用中の MySQL に以上の設定を反映する。yで反映する
Success.

All done!

 MySQL に登録されているユーザーを確認するには以下のようなクエリーを実行します。

mysql> SELECT user, host FROM mysql.user;

ユーザーの追加

 MySQL はインストールのみでの root ユーザーやテスト用のユーザーが利用できるようになっています。

 新たにユーザーを MySQL に登録し権限を与えるには、mysql においてCREATE USERを実行します。

 まずは root で MySQL にログインします。sudo は root としてコマンドを実行します。

$ sudo mysql
...
mysql> CREATE USER 'example'@'localhost' IDENTIFIED BY '5v().B5y4wpT';

 上記の例ではパスワードによるログインができるユーザーが作成されます。

 この例では、ユーザー名example、ホストがlocalhost、パスワードが5v().B5y4wpTでユーザーが作成されます。

 ホスト名はユーザーがどこから接続してよいかを示すものです。MySQL を利用した API といった外部接続を開発する場合には意識する必要があると思います。
 標準的には localhost を指定します。ローカルからのユーザーのみの接続を許します。%はどこからの接続も許します。

 ユーザーの追加が成功すればそのユーザーでログインすることができます。

$ mysql -u example

 MySQL においてはユーザーと別にロールというものがあります。ロールはユーザーに操作権限が与えらるものです。
 ロールは個別に作成することができデータベース操作の権限を設定することができます。ユーザーにロールを設定することで、ユーザーはロールの操作権限を継承します。

 詳しくはユーザー(アカウント)、ロール管理ページを参照してください。

ユーザーの権限の設定

 ユーザーごとのデータベースやテーブルに対する権限の設定には GRANT 文を使用します。

 権限設定の構文は以下のようになっています。

GRANT PRIVILEGE ON database.table TO 'username'@'host';

 もしもすべてのデータベースの全てのテーブルの操作権限を'localhost'から接続してくる'example'ユーザーに許可するには以下のようにします。

mysql> GRANT ALL ON *.* TO 'example'@'localhost';

 *.* はという指定です。

 ユーザーの追加や権限設定が終わったらFLUSH PRIVILEGESクエリーを実行します。

mysql> FLUSH PRIVILEGES;

 このことで即時に追加されたユーザーとその権限が反映されます。

 権限設定のクエリーでユーザー登録ができます。
 以下のように権限設定と同時にパスワードを指定するとユーザー登録ができます。

mysql> GRANT ALL PRIVILEGE ON *.* TO 'example'@'localhost' IDENTIFIED BY 'password';

 MySQL ではユーザーごとに操作権限を設定できます。また、ロールを作成しユーザーにそのロールを含むことで操作権限を設定することもできます。

 詳しくはユーザー(アカウント)の権限の設定を参照してください。

開発用パッケージのインストール

 MySQL 用の API などの開発には、開発用パッケージとライブラリをインストールする必要があります。

 MySQL をサーバーとして運用することが目的なら開発用パッケージはインストールしないで下さい。サーバーの改編が出来てしまいます。運用が目的なら、上記のサーバーのインストールを参照してください。

 開発用のインストールには Ubuntu や CentOS などのディストリビューションからインストールする方法と、MySQL のサイトからパッケージをダウンロードしインストールする方法があります。
 開発環境をディストリビューションを利用して構築するのなら、MySQL もディストリビューションのパッケージを利用してインストールすることをお勧めします。

 インストール元がディストリビューションからなのか、MySQL のサイトからなのかの大きな違いは環境設定とディレクトリ構成です。 環境設定やディレクトリ構成の違いによって動作に不具合が出ることがあります。また、参考にしたサイトや資料によっては環境設定やディレクトリ構成に違いがあり、読み替える必要があります。

 開発用にMySQLをインストールするには開発用ライブラリをインストールする必要があります。例えばスクリプト言語を使用して API を開発するには libmysqlclient-dev パッケージをインストールします。

$ sudo apt install mysql-server libmysqlclient-dev

 libmysqlclient-dev はスクリプトによる MySQL 開発のためのライブラリ群です。使用する言語によってインストールするべきライブラリが変わるかもしれません。

データベース作成とユーザー管理

 以降はデータベースの作成やユーザーの管理をすることと思います。

 データベースの作成などの管理ついては「データベースの管理(確認、作成、削除)」を参照して下さい。

 ユーザーの追加や削除といった管理については「ユーザー(アカウント)、ロール管理」を参照して下さい。