Ubuntu 16.04 + MariaDB

※以下のサイトを参考に全面改訂しました(2017/09/12)
Ubunt 16.04でMariaDBをインストールするとパスワードが変

MySQL から MariaDB に移行するにあたって、パッケージが前提とする流儀が違ったり、罠があったりするので手当てをする。

1. DB root ユーザでの接続

通常は最初に DB root ユーザで DB エンジンに接続して、アプリケーションの要求するデータベースやユーザを作成するだろう。

このとき、OS の一般ユーザでは、DB に root ログインしようとしても不可能になっている。mysql_secure_installation を実行して DB root ユーザのパスワードを設定しておいてもダメである。

user@xenial:~$ mysql -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

この場合、OS の (UNIX ユーザとしての) root 権限を得て mysql コマンドを実行する必要がある。初期状態の DB root ユーザ認証に UNIX ソケット認証プラグインが使われているから、らしい。

つまりは sudo を使うか、su で root になっておく必要がある。OS の root 権限でさえあれば、以下のようにユーザ名指定なし・パスワードなしで接続可能である。

user@xenial:~$ sudo mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.0.31-MariaDB-0ubuntu0.16.04.2 Ubuntu 16.04

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

この初期設定に乗っかっていくなら、DB の root パスワードを設定する必要がない。テストDB等も存在していないため、mysql_secure_installation で初期化してやる必要は特にない (あえてやるなら、mysql_secure_installation を sudo で実行しなければならない)。

この認証方式では、TCP/3306 経由ではログインできないことになる。必ずローカルの UNIX ドメインソケット経由でなければならない。

DB の root ユーザを従来のパスワード認証に変更したい (以前の方式に戻す) 場合は、以下の手順を実行する。

user@xenial:~$ sudo mysql
MariaDB [(none)]> set password for 'root'@'localhost'=password('パスワード文字列');
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set plugin='' where user='root';
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> \q

root ユーザの認証プラグインを外し、通常のパスワードを設定している。この対処を実施した場合は、/etc/mysql/debian.cnf に平文パスワードを記述してやらないと systemctl での起動・停止が動作しなくなる。

もしくは、UNIX ソケット認証を使わない管理者 root2 ユーザを新規作成するという形でもよい。

user@xenial:~$ sudo mysql
MariaDB [(none)]> create user 'root2'@'localhost' identified by 'パスワード文字列';
MariaDB [(none)]> grant all on *.* to 'root2'@'localhost' with grant option;
MariaDB [(none)]> \q

※個人的には、このUNIX認証をDBのユーザ認証に対応させる仕組みは筋が悪いと思う。DB の root という弱い権限 (最悪でもDBしか壊せない) を呼び出すためだけに、OS の root という強い権限 (システム全体を壊せる) を呼び出す必要があるのだから。

2. localhost の tcp/3306 に接続できない

アプリケーションから localhost あてに接続すると、システム上 IPv6 (::1) が優先される。しかし MariaDB デフォルト設定の bind-address は 127.0.0.1 になっている。

このせいで、アプリケーションの設定で、DB サーバのホスト名 / IP アドレス指定を “localhost” にしてあると接続できない。アプリケーション側での DB サーバ指定を 127.0.0.1 とするか、MariaDB 側の設定ファイル /etc/mysql/mariadb.conf.d/50-server.cnf で bind-address を ::1 にする必要がある。