b-shock. Fortress

Xubuntu上でMySQL 5.7のセットアップ

Xubuntuへの開発環境の構築に着手した。
KVM上のFreeBSDを中心とし、ホストOS(Xubuntu)にPowerDNSやsshfsを導入して、 最終的にひとつのものにまとめる予定。

本稿では、PowerDNSの構成要素として、MySQL 5.7系を導入していく。
5.7系に地雷がたくさんある(その一方で性能も向上しているため、一概に避けるべき とは言えない)ことは承知していたが、実際には当初の予想も超えるトラブルに 見舞われた。
MySQLの導入なんて何度もやってるのに、ほんのちょっとのバージョン番号の違いで こんなに手こずるとは。古い話だが、4.1と4.0がまるで別物だったことを思い出す。

パッケージのインストール

1
sudo apt install mysql-server-5.7

これを入力したあとに出てくるパスワードに関する設問に要注意。極力パスワードは 入力して、空にはしないほうが、余計なトラブルを抱えずに済む。
ちなみに、 このパッケージをChef(のapt_packageリソース)から導入する場合、 空のパスワードを指定した扱いになる様なので、後述する手順でrootのパスワードを 変更する必要がある。

my.cnf設定

以下を実行すると、 /etc/my.cnf を直接記述するのと同様の要領で、 /etc/mysql/conf.d/local.cnf から設定変更が行えるようになる。
大本のmy.cnfにはほとんど何も書かれておらず、local.cnfをインクルードする 仕組みになってるみたい。いや、こっちのほうがシンプルで使いやすいな。

1
sudo update-alternatives --set my.cnf /etc/mysql/my.cnf.fallback

local.cnf に書き込む内容は、最低限のものとして以下のものを入れてる。
ローカルのPowerDNSから利用することを想定したMySQLなので、チューニングに関する 設定などは不要と思われる。

内容は大まかに、以下の通り。

  • パスワードは無期限に。
  • デフォルトのエンコーディングはutf8mb4。
  • ログはsyslogに出力する想定。
  • secure-file-privは別にどこでもいいけど、何かしら指定しないとwarning。

特筆すべきはパスワードの期限(default_password_lifetime)。MySQL 5.7系の 初期、明示的に0を指定しないと約1年でパスワードが使えなくなってしまう時期が あった。
言うまでもなく運用に重篤な支障がある為、現在はさすがに0がデフォルトになって いる。だが、一度このような機能が実装されてしまった以上は信用できない感があり、 5.7以降の全てのMySQLにおいて、default_password_lifetimeを明示的に 0に設定することを強くお勧めする次第。

その他お好みの設定を加えて頂き、設定を反映するためにMySQLを再起動。

1
sudo service mysql restart

rootパスワード変更

インストール時に空のrootパスワードを指定してしまった場合、結局空には ならないので、パスワードの再設定が必要。
Chefから導入を行った場合も、パスワードの指定が出来ない為、このケースに該当。 (default_password_lifetimeだけでなく、パスワードまわりは地雷満載だわ)
rootパスワードの更新については、以下の記事を参考にした。

Ubuntu16.04にaptでMySQL5.7を入れる時にrootを空パスワードにするとどうなるか

OSのroot権限からMySQLに接続する方法が紹介されているが(以下)、

1
sudo mysql

apt実行時にデフォルトで作成される特権ユーザー(rootユーザーと同様の操作が可能) を利用するのでもよい。
接続情報は以下の手順で確認できるので、お手元のEvernote等に控えておくと、 あとあと便利。

1
sudo cat /etc/mysql/debian.cnf

いずれかの方法でMySQLに接続したら、以下のSQLを実行し、rootパスワードの 変更を実行。

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

WITH mysql_native_password が肝のようだ。

また、MySQLには古くから、mysql.userテーブルを直接修正するという方法もあるが、 mysql_native_passwordに変更してからでないとテーブルを書き換えても反映しない ので注意。
mysql_native_passwordに変更したあとであれば、従来通り、以下の手順でパスワードの 更新が可能。

1
2
UPDATE mysql.user SET authentication_string=password('your_password') WHERE user='root';
FLUSH PRIVILEGES;

従来通り?
かつてmysql.userテーブルにはpasswordというフィールドがあったはずだが、何故か、 authentication_stringなるわかりにくい名前に変更された。わけわからん。

このMySQLはPowerDNSで使用する想定なので、rootユーザー以外は不要と思われるが、 通常の用途では他にもユーザーを登録するはず。
確かMySQL 5.7系の初期では問題なかったと記憶するが(自信なし)、GRANTはあくまで 権限の付与を行うだけになり、存在しないユーザーを指定した時にユーザーを作成する という振る舞いは廃止された様だ。

また、aptで設置した場合は該当しないが、validate_passwordなるプラグインが有効の 場合、パスワードの更新時に多くの制限が課せられる様だ。
個人的には理不尽なほど厳しいルールに感じる。ご興味の向きはググって頂ければ、 この機能に関する知見や苦言がたくさんヒットするので参考にして頂ければと。

GUIクライアント

MacではSequel Proを愛用しているので、同様の GUIクライアントがほしいところ。通常の用途ではなく、PowerDNSのストレージとして 使用する想定の為、なおさら。
取り急ぎ、aptからも導入できる純正クライアントをインストールしとく。

1
sudo apt install mysql-workbench

機能が多すぎて、その一方でテーブルビューがわかりやすくなくて、正直使いづらい。
ググったらでてきた以下のページをみると、

Top 10 MySQL GUI Tools

HeidiSQLなるWindowsむけのツールをwineで動かすのも悪くないかもと思った。
Workbenchを使い続けることに我慢できなくなったら、挑戦するかも。

2017/11/14追記
その後、HeidiSQLを導入した。
XubuntuでHeidiSQL