第6回 mysqlコマンドラインクライアントにページャーを指定する の際にも少しだけ触れましたが、去る2015/10/21、MySQLの最新版となるMySQL 5.7が製品リリース されました。筆者が執筆してきた第2回 、第4回 、第6回 ではそれぞれ、第2回 の執筆時に「MySQL Yum Repository を導入し、執筆時点で最新のmysql-community-server-5.6.26-2.el6.x86_64をyumコマンドでインストール」したものを利用していました。
今回はそれらをMySQL 5.7にアップグレードする方法と、「 MySQL 5.6から5.7ってマイナーバージョンアップじゃないの?」「 GA(General Availability)とかRC(Release Candidate)とか一体何なの?」というバージョンにまつわる説明をしたいと思います。
MySQLのバージョンについて
MySQL x.y.zと書いた場合、xがメジャーバージョン番号、yがリリースレベル、x.yが1つのリリースシリーズとなり、zがリリースシリーズ内でのバージョン番号になるとされています(ドキュメント上の記載はこちら です) 。
しかし実際のところ、互換性の単位やドキュメントの単位としてほぼx.yの「リリースシリーズ」が単位となることから、開発元のOracleで開催されるセミナーなどで語られる際は、リリースシリーズとされているx.yが(メジャー)バージョン、zがマイナーバージョンとして呼ばれることが多くなっています。筆者も慣習的に「ドキュメント上のリリースシリーズ」=「( メジャー)バージョン」 、「 リリースシリーズ内でのバージョン番号」=「マイナーバージョン」と呼んでいますので、今回の説明の中でもその呼び方を使いたいと思います。
メジャーバージョンをまたぐバージョンアップをメジャーバージョンアップ、同一メジャーバージョン内でマイナーバージョンのみ変更されるバージョンアップをマイナーバージョンアップと呼びます。
全く余談ですが、たとえば「MySQL 5.6」は「マイエスキューエル ごーてんろく」と呼ばれることが多く、たまに「マイエスキューエル ごーろく」 、英語に行くと「マイエスキューエル ファイブシックス」と呼ばれることが多いようです。
互換性の単位について
先ほど「互換性の単位」という言い方を用いましたが、ここでいう互換性とはmysql_upgrade
コマンドを用いたアップグレードの後方互換性のことを意味します(ただし、後程説明しますが、GA版以外のマイナーバージョンではこれらは保証されません) 。
MySQLではメジャーバージョン(リリースシリーズ)ごとにmysqlスキーマを始めとするシステム用のスキーマに含まれるテーブルの構造に変化があり、これを解消する(古い形式のシステム用スキーマから新しいシステム用のスキーマに変換する)ためにmysql_upgrade
というコマンドが同梱されています。このコマンドを利用したアップグレードは原則「同じ、あるいは1つ前のバージョンのシステム用スキーマを、現在のバージョンのシステム用スキーマに変更する」ことを意図して設計されていたため、2つ以上のバージョンをまたいだmysql_upgrade
は失敗することがあります[1] 。MySQLのメジャーバージョンアップに関するドキュメント上の記載はこちら です。
また、大きな機能追加や機能の廃止、SQL構文の変更(稀です) 、パラメーター名の変更(MySQL 5.6ではマイナーバージョンアップで変更されたこともありますが)などは原則メジャーバージョン単位で行われます。
[1] 成功することもあります。筆者が試した限りでは、MySQL 5.1.73からMySQL 5.6.27へのメジャーバージョンアップはmysql_upgrade
コマンドで実施可能、MySQL 5.0.96からMySQL 5.6.27へのメジャーバージョンアップは失敗(MySQL 5.6がクラッシュする)でした。ドキュメント上の記載も「not recommended or supported(推奨されない、またはサポートされない) 」となっています。
バージョンのステータスについて
MySQLのメジャーバージョンは、大きく分けて3つの状態に分けられます。
「サポートが終了したバージョン」「 サポートされているバージョン」「 開発が進められているバージョン」の3つです。2015/11/28現在、MySQL 5.1とそれより以前のバージョンは「サポートが終了したバージョン」で、これ以上マイナーバージョンのリリースはありません。MySQL 5.5、5.6、5.7が「サポートされているバージョン」で、バグフィックスなどによる新しいマイナーバージョンが提供されることが期待できます(MySQL 5.5は2015/12でサポート期限が切れるため、その後は「サポートが終了したバージョン」になりますが) 。
MySQL 5.7が製品リリースされたため現在は「開発が進められているバージョン」はありませんが、このままの予定でいけば、いずれMySQL 5.8が次の「開発が進められているバージョン」としてリリースされるのではないでしょうか(公式にはMySQL 5.8という名前はまだ出てきていませんが、MySQLのコミュニティーマネージャーであるMorgan Tockerのブログ やツイート 、バグレポートの返信メッセージ などで5.8の片鱗が見えはじめています) 。
また、「 開発が進められているバージョン」には別の形態もあり、"lab"版、「 実験室」版などと呼ばれています。これはMySQL Labs にて配布されている文字通り「実験中」のリリースで、「 本番環境での使用はやめてほしい」( "Please, DO NOT USE THESE BINARIES IN PRODUCTION")とダウンロードページに記載があります。これらは今後の「開発が進められているバージョン」に取り入れられる可能性のある新機能を試すためのリリースであり、開発中のバージョンのツリーとは独立して開発が進められています。
図1 "Please, DO NOT USE THESE BINARIES IN PRODUCTION"の記載があるMySQL Labs
また、MySQLはマイナーバージョンによっても大きく3つの状態に分けられます。
DMR("Development Milestone Release"、かつては「ベータ版」と名前が付けられていました)版、RC("Release Candidate"、「 リリース候補」の名の通り、DMRとGAの間に位置します。かつて「ガンマ版」と呼ばれていた時期もあったようですが、あまり流行らなかったようです)版、GA("General Availability"、かつては"Production"版とも名前が付けられていました。MySQLでは"stable"版という言い方は耳にしませんが、他のプロダクトで言う"stable"版に相当するのがこれです)版です。
各メジャーバージョンの最後のマイナーバージョンのステータスをもって、メジャーバージョン全体のステータスを呼ぶことも多々あります(例えばMySQL 5.7のGA前の2015/9の時点で言えば、MySQL 5.5(5.5.45-GA)と5.6(5.6.26-GA)がGA、MySQL 5.7(5.7.8-rc)はRCでした)が、「 サポートが終了したバージョン」に関してはGAとは呼ばれなくなります。
デモンストレーション環境について
この回でアップグレードを説明している環境は、第2回 MySQLにはじめてのデータを入れてみる でインストールしたmysql-community-server-5.6.26-2.el6.x86_64を、執筆時点で最新のmysql-community-server-5.7.9-1.el6.x86_64にアップグレードします。
2015/11/28現在、MySQLのyumリポジトリー を新しくセットアップしようとした場合、MySQL 5.7のリポジトリーがデフォルトとして登録されます(デモンストレーション環境はMySQL 5.6のリポジトリーがデフォルトになっています。詳しくは第2回 を参照してください) 。
自分のインストールしたyumリポジトリーがどちらかわからなくなってしまった場合は、/etc/yum.repos.d/mysql-community.reso
ファイルを確認してみてください。MySQL 5.7のリポジトリーがmysql57-community-dmr
となっている(その直前に「MySQL 5.7 is currently in development.」とも記載があります)場合、MySQL 5.6が最新時代のyumリポジトリーがインストールされています。また、yumリポジトリーのパッケージ名はmysql-community-release
です。
$ cat /etc/yum.repos.d/mysql-community.repo
..
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# Note: MySQL 5.7 is currently in development. For use at your own risk.
# Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/
[mysql57-community-dmr]
name=MySQL 5.7 Community Server Development Milestone Release
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
$ rpm -qa | grep mysql.*release
mysql-community-release-el6-5.noarch
それに対し、MySQL 5.7が最新時代のyumリポジトリーは以下のようになっています。パッケージ名はmysql57-community-release
です。
$ cat /etc/yum.repos.d/mysql-community.repo
..
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
$ rpm -qa | grep mysql.*release
mysql57-community-release-el6-7.noarch
MySQL 5.6.27へバージョンアップする
まず最初に、MySQL 5.6.26からMySQL 5.6.27(2015/11/28現在のMySQL 5.6の最新版)にマイナーバージョンアップします。大概の場合これは必須ではない(MySQL 5.6の任意のバージョンからMySQL 5.7の任意のバージョンへのメジャーバージョンアップが可能…ただし、GA以外のマイナーバージョンを除きます)のですが、折角なので説明させてください。
とはいえyumでインストールした環境であれば手順は簡単なもので、デモンストレーション環境上ではMySQL 5.6のリポジトリーが有効になっていますので、ここでyum upgrade
コマンドを実行するだけで最新のマイナーバージョンにバージョンアップされます。MySQLが起動している場合、アップグレードの処理中に停止され、再度起動されます。
$ sudo yum upgrade mysql-community-server
..
==============================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================
Updating:
mysql-community-server x86_64 5.6.27-2.el6 mysql56-community 53 M
Installing for dependencies:
numactl x86_64 2.0.9-2.el6 base 74 k
Updating for dependencies:
mysql-community-client x86_64 5.6.27-2.el6 mysql56-community 18 M
mysql-community-common x86_64 5.6.27-2.el6 mysql56-community 307 k
mysql-community-libs x86_64 5.6.27-2.el6 mysql56-community 1.9 M
mysql_upgrade
コマンドでシステム用のスキーマをアップグレードして終了です。rootアカウントにパスワードを設定している場合は、-p
オプションでパスワードを指定してください(デモンストレーション環境ではrootにパスワードが設定されていません) 。mysql_upgrade
コマンドはMySQLが起動状態で実行する必要があります。
$ mysql_upgrade -uroot
MySQL 5.7.9へバージョンアップする
続いて、MySQL 5.6のリポジトリーが標準で有効になったパッケージ(mysql-community-release-*.rpm
)を削除し、MySQL 5.7のリポジトリーが標準で有効になったパッケージ(mysql57-community-release-*.rpm
)をインストールします。以下のコマンド例の中で利用しているURLは2015/11/15現在のものになりますので、最新のリポジトリーをインストールする場合にはダウンロードページ からURLを確認してください。
$ sudo rpm -e mysql-community-release
$ sudo rpm -i http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
その後、yum upgrade
を実行します。MySQLが起動中の場合、アップグレードの処理中に停止され、再度起動されます。
$ sudo yum upgrade mysql-community-server
..
==============================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================
Updating:
mysql-community-server x86_64 5.7.9-1.el6 mysql57-community 133 M
Updating for dependencies:
mysql-community-client x86_64 5.7.9-1.el6 mysql57-community 23 M
mysql-community-common x86_64 5.7.9-1.el6 mysql57-community 324 k
mysql-community-libs x86_64 5.7.9-1.el6 mysql57-community 2.1 M
yum upgrade
しただけの状態だと、古いMySQL 5.6のシステム用のスキーマを利用しているため、エラーログ(/var/log/mysqld.log
)に大量のエラーを出力しています(MySQL 5.6.27へのマイナーバージョンアップでは、この点に非互換がなかったため、mysql_upgrade
実行前でもエラーは出力されていませんでした) 。これをMySQL 5.7用のシステム用スキーマにアップグレードするため、mysql_upgrade
コマンドを実行します。rootアカウントにパスワードを設定している場合は、-p
オプションでパスワードを指定してください。mysql_upgrade
コマンドはMySQLが起動状態で実行する必要があります。
$ mysql_upgrade -uroot
..
Upgrade process completed successfully.
Checking if update is needed.
これでMySQLのバージョンアップは終了です。ね? 簡単でしょう?
$ mysql -uroot
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.9 |
+-----------+
1 row in set (0.00 sec)
今回はyumでインストールした環境でのコマンドだけを紹介しましたが、運用環境のMySQLを本当にアップグレードするためには、MySQL 5.6とMySQL 5.7で変更になったポイントを丁寧に調べる必要があります。SQLの互換性はほぼ保たれていますが、パラメーターの追加、デフォルト値の変更に伴う振る舞いの変更などがあります。MySQL 5.6からの変更点についてはドキュメント にも記載がありますが、残念ながらMySQL 5.7のドキュメントは日本語訳されていません。
手前味噌ですが、筆者がMySQL 5.7GA直前の2015/10/03にMySQL 5.7について講演したスライドがありますので、日本語の情報元として参考にしてください。