Ubuntu 18.04 (Bionic Beaver) に MySQL をインストールする

aptmysql-server をインストールします。

$ sudo apt update
$ sudo apt install mysql-server

インストールが終わると自動的に MySQL サーバーが起動するようです。

$ service mysql status
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Sun 2019-03-17 07:36:24 UTC; 19s ago
 Main PID: 19007 (mysqld)
    Tasks: 27 (limit: 1152)
   CGroup: /system.slice/mysql.service
           └─19007 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pi

ところが root でログインしようとしてもできません。

$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

これは root の認証方法がデフォルトで auth_socket に設定されているためです。
auth_socket についての詳細は https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html で確認できます。

簡単に説明すると、認証方法が auth_socket に設定されている場合は以下のいずれかに一致する時のみログインすることができます。

  • mysql コマンドで指定したユーザ名が、Ubuntu にログイン中のユーザ名と等しい(今回は root
  • mysql.user テーブルにある、 mysql コマンドで指定したユーザ名の行の authentication_string 列の値が Ubuntu にログイン中のユーザ名と等しい

つまり Ubuntu 上で root ユーザになってからログインすればよいということなので、sudo を使ってログインします。

$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

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>

ログインできました。

mysql.user テーブルを確認すると確かに auth_socket になっています。

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | auth_socket           |                                           |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
+------------------+-----------------------+-------------------------------------------+
4 rows in set (0.00 sec)

新しく作成したユーザの認証方法はデフォルトで mysql_native_password になるようです。

mysql> CREATE USER newuser IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | auth_socket           |                                           |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
| newuser          | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+------------------+-----------------------+-------------------------------------------+
5 rows in set (0.00 sec)

root の認証方法を変更する

root の 認証方法を auth_socket から変えたい場合は ALTER USER 文を使います。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Query OK, 0 rows affected (0.00 sec)

変更できました。

mysql> select User, plugin, authentication_string from mysql.user;
+------------------+-----------------------+-------------------------------------------+
| User             | plugin                | authentication_string                     |
+------------------+-----------------------+-------------------------------------------+
| root             | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| mysql.session    | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | mysql_native_password | *D7714B61633694B96C8A02C2486C20B8ADBEFE53 |
| newuser          | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+------------------+-----------------------+-------------------------------------------+
5 rows in set (0.00 sec)