MySQL道普請便り

第8回MySQLのバージョン体系を知る

第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ではマイナーバージョンアップで変更されたこともありますが)などは原則メジャーバージョン単位で行われます。

バージョンのステータスについて

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
図1

また、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について講演したスライドがありますので、日本語の情報元として参考にしてください。

おすすめ記事

記事・ニュース一覧