MySQL 5.7を入れる

「がとらぼ」の動いているサーバ(というか「がとらぼ」は規模が小さいのでおまけで相乗り)が、電源となっていたUPSの故障で、突然電源を絶たれた。普通は大したダメージにならないんだけど、これが余程タイミングが悪かったのかDBサーバのデータが手酷く壊れたようで、復旧を試みてもまったく歯が立たず。
MySQLをクリーンインストールしてバックアップのデータを流し込むことにした。
大量のデータを抱えるデータベースを迂闊に触るとロクなことにならないということもあってこのホストは構築時に入れたMySQL 5.5のままでいたが、せっかくクリーンインストールするならということでMySQL 5.7を入れることに。

別ホストではMySQL 5.6から5.7に更新したことがあるが、こちらはMySQL本体更新後にmy.cnfをちょろっと修正してmysql_upgradeを実行しただけでわりとサクッといった。(MySQLが起動しなくなったのでログ見ながらmy.cnfを修正したというのはあったけど)

今回はMySQLのクリーンインストールなので更新より簡単かなと思ったが勝手が違って意外と苦労したので備忘録。

インストール

FreeBSDのportsでインストールした。
# cd /usr/ports/databases/mysql57-server
# make install clean
構築時のオプションとしては普通?は初期値かINNOBASE(コンパイル静的)を追加で[x]付ける程度かしら。
これでmysql57-serverとmysql57-clientがインストールされる。

FreeBSDのportsではMySQL5.6以降? my.cnfの置き場所が /usr/local/etc/mysql 下に変更になっているようなのでrc.confの指定を変更する。

/etc/rc.conf
mysql_enable="YES"
mysql_optfile="/usr/local/etc/mysql/my.cnf"
#mysql_args=" --skip-grant-tables"    #MySQL5.7の最初の起動時だけ有効にする(後述)

/usr/local/etc/my.cnf
[client]
中略
default-character-set           = utf8mb4

[mysqld]
中略
character-set-server            = utf8mb4
log-error                       = /var/log/mysqld-error.log
中略

[mysqldump]
中略
default-character-set           = utf8mb4
中略

最初から用意されているmy.cnfの雛形にデフォルトの文字コードの指定を追加しておく。(エラーログも)
他はそのままで良いかと思う。(と、書いておきながら、いろいろ手を入れたけど)

MySQLサーバ起動

# service mysql-server start
または
# /usr/local/etc/rc.d/mysql-server start

ここは全く変わらず。

MySQLのCLIログイン

MySQL 5.7以前はMySQLのCLIの初回ログインは何も考えずにできた。
MySQL 5.7ではおせっかいなことに初期状態の管理者アカウントrootに勝手にユニークなパスワードが付けられるらしい。つまり(普通には)パスワードを何とかして知らないとログインできないということになる。
MySQLサーバを起動すると自動的root用のパスワードが付けられて、それがログ(テキストログ?)に記録されているのでそれを見ると判るということであるが、設定したmy.cnfの都合で存在しないので不明。それでは何もできないので上のmy.cnfの例のように--skip-grant-tablesをオプション指定するか--skip-grant-tablesを付けて手動でmysqldを実行する。これで以前のmysqlのCLI同様rootをパスワード無しで使える。

% mysql mysql
root@localhost [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySecretPassword';
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> CREATE DATABASE new_db;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> CREATE USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewUserPassword';
Query OK, 0 rows affected (0.01 sec)

root@localhost [mysql]> GRANT ALL PRIVILEGES ON new_db.* TO 'newuser'@'localhost';
Query OK, 0 rows affected (0.01 sec)

root@localhost [mysql]> DROP DATABASE test;
Query OK, 0 rows affected (0.00 sec)

root@localhost [mysql]> exit
Bye
%

mysqlコマンドでMySQLのmysqlデータベースに接続する。
rootパスワードの設定にはMySQL 5.7.6以降はALTER USERを使うらしい。
新しいデータベース new_dbを作成。これは以前から変わらない。
新しいユーザー newuserを作成。
先に作成したnew_dbの全権をnewuserに与える。
最初から存在するtestデータベースを削除する。
MySQLのCLIを終了。

rootユーザーのパスワードを設定したら先に設定した /etc/rc.confの --skip-grant-tables行を削除してMySQLサーバーを再起動する。

ユーザーの作成は以前の様にGRANTでデータベースへの権限付けと同時に行うことはできなくなったらしい。CREATE USERでユーザーを作成するのとGRANT hogeで権限付けを分けて行う。ここは以前が変だったので常識的になったといえるかも。

または/usr/local/bin/mysql_secure_installationを実行してメッセージに従って入力することでrootのパスワードを設定できる他幾つか機能があるらしいが使いたくない。でも、今後はこれが標準手順になるのかしら?

これでMySQL 5.7で最初に躓くところは終わり?

関連記事:


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です