MySQL道普請便り

第10回yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違い

第8回 MySQLのバージョン体系を知るの中で、yumでインストールしたMySQL 5.6をMySQL 5.7にアップグレードしました。今回はアップグレードではなく、MySQL 5.7を新規にyumでインストールする場合のMySQL 5.6との違いを説明したいと思います。

MySQLのインストール方法はいくつかありますが、yumリポジトリーを利用したインストールが好んで選ばれるケースは、おそらくChefのレシピやDockerfileに利用する際ではないでしょうか。筆者はサンドボックス環境にはDockerをよく利用していますが、イメージを作成する際には原則MySQL公式のyumリポジトリーを使うようにしています。

yumリポジトリーを使用したインストール

MySQL開発元のOracleが公開しているyumリポジトリーを利用してインストールする方法です。メリットとしてはインストール、アップグレードとも容易なことですが、インストール先のパスが固定されるため、1台のサーバに複数のMySQLを同居させるには不向きです。yumリポジトリーの設定ファイルはMySQL :: Download MySQL Yum Repositoryからダウンロードすることができます。以下のコマンドはCentOS 6.6上でMySQL 5.7をインストールする方法で、2015年12月現在のURLを記載していますので、今後変更になる可能性があります。

$ sudo yum install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
$ sudo yum install mysql-community-server

インストール自体は方法も変わりませんし、とても簡単です。かつてはcronieパッケージなどの依存関係でインストールされるBaseリポジトリーのmysql-libsパッケージと相性が悪く、たびたび依存性の問題を起こしていたイメージがありますが、2015/12/24現在の最新版であるMySQL 5.7.10は問題なくBaseリポジトリーのmysql-libsパッケージをmysql-community-libs-5.7.10にアップグレードしてくれました。

yumリポジトリーを利用したインストールにおけるMySQL 5.6と5.7の相違点

まずは表形式でまとめてみました。

MySQL 5.6までは「Oracleから配布されているrpmファイルをインストール(以下rpm版⁠⁠」する方法と「Oracleが提供しているyumリポジトリーからインストール(以下yum版⁠⁠」には若干のパッケージの違いがありましたが、MySQL 5.7では、旧来yum版であったパッケージ方式に統一されています。そのため、⁠MySQL 5.6とそれ以前のrpm版」⁠MySQL 5.6とそれ以前のyum版」⁠MySQL 5.7(rpm版, yum版共通⁠⁠」という軸と、参考までにCentOS 6.6のBaseリポジトリーをまとめてあります。

rpm版
5.6とそれ以前
yum版
5.6とそれ以前
5.7
rpm版, yum版共通
CentOS 6.6 Baseリポジトリー(MySQL 5.1.73)
MySQLサーバ(mysqld)MySQL-servermysql-community-servermysql-community-servermysql-server
MySQLコマンドラインクライアント(mysqlなど)MySQL-clientmysql-community-clientmysql-community-clientmysql
MySQLライブラリー(libmysqlclient.soなど)MySQL-sharedmysql-community-libsmysql-community-libsmysql-libs
旧バージョンのMySQLライブラリーMySQL-shared-compatmysql-community-libs-compatmysql-community-libs-compatなし
MySQLヘッダファイル(mysql.hなど)MySQL-develmysql-community-devel mysql-community-develmysql-devel
MySQL単体テストスイート(mysql_test_run.plなど)MySQL-testmysql-community-testmysql-community-testmysql-test
サービス名serviceコマンドで参照する名前)mysqlmysqldmysqldmysqld
データディレクトリーの初期化mysql_install_db
インストール時
mysql_install_db
service mysqld start
mysqld --initialize
service mysqld start
mysql_install_db
service mysqld start
エラーログファイル名/var/lib/mysql/ホスト名.err/var/log/mysqld.log/var/log/mysqld.log/var/log/mysqld.log
初期ユーザroot@localhostなどrootのみroot@localhostなどと匿名ユーザroot@localhostのみroot@localhostなどと匿名ユーザ
rootアカウントの仮パスワード/root/.mysql_secret生成しない/var/log/mysqld.log実装なし
validate_passwordプラグインバンドルされているが有効化されていないバンドルされているが有効化されていない有効化されている
英大文字小文字数字記号の4種を含んだ8文字以上
実装なし
ユーザ作成GRANTステートメントGRANTステートメントCREATE USERステートメント
パスワード設定時はGRANTステートメントでワーニング(作成可)
パスワード未設定時はGRANTステートメントがエラー(作成不可)
GRANTステートメント
LOAD DATA INFILEに対する制限
secure_file_privオプション)
なしなし/var/lib/mysql-filesディレクトリの中のみなし
アカウントの自動EXPIRE実装なし実装なし360日実装なし

以下、それぞれの変更箇所を少し詳しく説明していきます。

パッケージ名の相違

MySQL 5.6とそれ以前のrpm版(以下、旧rpm版)は"MySQL-*"と大文字小文字交じりでしたが、yum版は"mysql-*"と小文字のみのパッケージ名になっています。また、Oracleが提供しているyum版のパッケージは"mysql-community-*"とコミュニティ版であることが明示されたパッケージ名になっています。

サービス名の相違

旧rpm版は"mysql"、yum版は"mysqld"となっており、initスクリプトも/etc/init.d/mysql/etc/init.d/mysqldとそれぞれ名前が違います。シェルからinitスクリプトを実行する分にはTabキーによるパス補完などで気にする必要はないかと思いますが、ちゃんとserviceコマンドで記載する場合やchkconfigコマンドなどの引数にする場合は注意してください。

エラーログファイルのパス

旧rpm版では"/var/lib/mysql/ホスト名.err"(MySQLとしてのデフォルト)ですが、yum版では同時にインストールされる"/etc/my.cnf"にlog_error= /var/log/mysqld.logが設定されているため、エラーログは"/var/log/mysqld.log"に出力されます。

初期ユーザの相違

MySQL 5.6までは"root@localhost", "root@127.0.0.1", "root@サーバのホスト名"など複数のrootアカウントと、yum版ではそれに加えて匿名ユーザ "''@localhost"などが作成されていましたが、MySQL 5.7では"root@localhost" のみを作成します。skip_name_resolveオプションが有効な環境下ではlocalhostと127.0.0.1は別のホストとして扱われるため、TCP接続の場合は注意してください。

rootアカウントの仮パスワード

MySQL 5.6までは旧rpm版でのみ仮パスワードが生成され"/root/.mysql_secret"ファイルに出力されていましたが、MySQL 5.7ではデフォルトで仮パスワードが生成されるようになっています。また、出力先も"/var/log/mysqld.log"(MySQLのエラーログファイル)に変更になっています。

パスワード強度の制限

パスワードの強度を制限し、簡単なパスワードの設定を防止するvalidate_passwordプラグインはMySQL 5.6で導入されましたが、MySQL 5.6では明示的にINSTALL PLUGINステートメントでインストールしない限り有効にはなりませんでした。yum版、rpm版のMySQL 5.7ではこれがデフォルトでインストール済みの状態となっており、⁠英大文字小文字数字記号の4種類を1つずつ含み、8文字以上」のパスワード以外に設定しようとするとエラーになるようになっています。

ユーザ作成ステートメントの変更

MySQL 5.6まではGRANTステートメントで権限を付与すると同時にアカウントを作るやり方が一般的でしたが、MySQL 5.7ではこのやり方はワーニングまたはエラーになるようになりましたIDENTIFIED BY句なし、つまりパスワードなしのアカウントをGRANTと同時に作成しようとした場合はエラーになります⁠⁠。今後はCREATE USERステートメントでユーザを作成後にGRANTステートメントで権限を割り当てるやり方になります。CREATE USERステートメント自体は旧来からサポートされているステートメントであるため、今後の互換性を考えた場合は現在から新しいやり方に変えておく方が良いでしょう。

secure_file_priv

secure_file_privオプションはLOAD DATA INFILEステートメントやSELECT INTO OUTFILEステートメント、LOAD_FILE関数の動作ディレクトリを制限するためのオプションです。オプション自体は旧来から存在しましたが、デフォルトは""(空文字列、任意のディレクトリ内でLOAD DATA INFILEなどを許可)でした。MySQL 5.7ではdeb, rpmなど一部のパッケージものに限り、デフォルトとして"/var/lib/mysql-files"が設定されるようになっています。そのため、デフォルトの状態では"/var/lib/mysql-files"以外のディレクトリからLOAD DATA INFILEなどで読み込もうとした場合にエラーになるようになりました。

アカウントの自動失効

MySQL 5.7で新しく追加された機能の1つに、アカウントの自動失効機能があります。これは最後にパスワードを変更した時間からデフォルトで360日が経過すると、そのアカウントをEXPIRE(無効化)しその後のログインを許可しないという強烈なオプションです。テストのために都度ビルドして利用するようなケースで問題になることは少ないかと思いますが、作成したイメージをそのまま長期間利用する(あるいは、ビルド時にユーザを作成し、その後アカウントが追加されることはあってもパスワードが変更されることはないようなケース)場合はこの機能をOFFにしておいた方がいいでしょう。


今回はyumリポジトリーを利用したインストールにおけるMySQL 5.6と5.7の違いを説明しました。この説明はyum版での差異であることに主眼を置いているため、全般的なMySQL 5.6とMySQL 5.7の機能差には触れていません(とてもたくさんあります⁠⁠。

yum版を利用したMySQLのインストールは自動化にとても便利なので、MySQL 5.7に対応する際の参考になれば幸いです。

おすすめ記事

記事・ニュース一覧