MySQL道普請便り

第76回MySQL 8.0へのアップグレード

リリースからこの記事を書くまでに少し時間が空いてしまいましたが、2018年4月、MySQL 5.7の次のバージョンとなる MySQL 8.0が製品リリースされました。

思い起こせば第2回 MySQLにはじめてのデータを入れてみるの時にはデモンストレーション環境としてMySQL 5.6.26をインストールし、第8回 MySQLのバージョン体系を知るではその環境をMySQL 5.6.27(当時の5.6系最新バージョン)を経てMySQL 5.7.9にバージョンアップしました。

せっかくなので今回も、MySQL 5.7.9からMySQL 5.7.22(2018/07/17現在の5.7系列の最新バージョン)を経て、MySQL 8.0.11へのバージョンアップ方法を紹介したいと思います。

時間のない人のための4行まとめ

  • 第8回 MySQLのバージョン体系を知るの時点と同じく、MySQL 5.7のyumリポジトリーを向いたmysql-releaseパッケージがインストールされているものとします
  • yum upgradeでMySQL 5.7.22にアップグレードします
  • MySQL Shellをインストールし、checkForServerUpgradeを実行します
  • MySQL 8.0のyumリポジトリーを向いたmysql-releaseパッケージに入れ替え、yum upgradeを実行します

第8回の時点でのおさらい

  • MySQL Yum Repositoryを使用して、MySQL 5.7.9のパッケージがインストールされています。
$ rpm -qa | grep -i mysql
mysql-community-libs-5.7.9-1.el6.x86_64
mysql-community-server-5.7.9-1.el6.x86_64
mysql57-community-release-el6-7.noarch
mysql-community-common-5.7.9-1.el6.x86_64
mysql-community-client-5.7.9-1.el6.x86_64
  • 古い(2015年12月時点の)mysql57-community-releaseパッケージがインストールされており、ここにはまだMySQL 8.0用のリポジトリーはリストされていません。
$ cat /etc/yum.repos.d/mysql-community.repo
...
[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

MySQL 5.7.22へのアップグレード

まずは同じMySQL 5.7系列の中で、2018/07/17現在の最新版であるMySQL 5.7.22にバージョンアップします。MySQL 5.6.26から5.6.27への時と同じく、yum upgradeでバージョンアップしましょう。

$ sudo yum upgrade mysql-community-server
..
==============================================================================================================================
 Package                              Arch                 Version                      Repository                       Size
==============================================================================================================================
Updating:
 mysql-community-server               x86_64               5.7.22-1.el6                 mysql57-community               153 M
Updating for dependencies:
 mysql-community-client               x86_64               5.7.22-1.el6                 mysql57-community                23 M
 mysql-community-common               x86_64               5.7.22-1.el6                 mysql57-community               332 k
 mysql-community-libs                 x86_64               5.7.22-1.el6                 mysql57-community               2.1 M

Transaction Summary
==============================================================================================================================
Upgrade       4 Package(s)
..

この時点でmysqldプロセスは再起動されます。

mysql_upgradeコマンドを実行しておきましょう。mysql_upgradeコマンドはMySQLのシステムテーブルをアップグレードするためのコマンドです。"Upgrade process completed successfully"の出力があれば完了です。

$ mysql_upgrade -uroot
..
mysql.user                                         OK
Upgrading the sys schema.
Checking databases.
ls.ls                                              OK
sys.sys_config                                     OK
vmstat.vmstat                                      OK
zipcode.prefecture_kana                            OK
zipcode.zipcode                                    OK
Upgrade process completed successfully.
Checking if update is needed.

MySQL Shellのインストールとアップグレードチェッカーの実行

MySQL Shellmysqlコマンドと同じくMySQLのコマンドラインクライアントプログラムです。mysqlコマンドに比べさまざまな拡張が加えられた次世代のコマンドラインクライアントであり、今回はMySQL Shellの提供するアップグレードチェッカーを利用します。

リポジトリー(mysql-tools-community)の設定はmysql57-community-releaseパッケージに含まれているため、yum installコマンドで簡単に利用を開始できます。

$ sudo yum install mysql-shell
..
==============================================================================================================================
 Package                     Arch                   Version                       Repository                             Size
==============================================================================================================================
Installing:
 mysql-shell                 x86_64                 8.0.11-1.el6                  mysql-tools-community                 4.8 M

Transaction Summary
==============================================================================================================================
Install       1 Package(s)
..

2018/07/17現在のMySQL Shellの最新バージョンは8.0.11です。MySQL Shellが8.0系でもMySQLサーバーの8.0系にしか接続できないわけではないので、MySQL 5.7系でも安心して最新版を使用してください。

$ mysqlsh -uroot -S /var/lib/mysql/mysql.sock
Creating a session to 'root@/var%2Flib%2Fmysql%2Fmysql.sock'
Enter password:
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 5
Server version: 5.7.22 MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.
MySQL Shell 8.0.11

Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type '\help' or '\?' for help; '\quit' to exit.


 MySQL  localhost  JS >

MySQL Shellはyumでインストールしてもデフォルトでは/var/lib/mysql/mysql.sockを向いていないため、明示的に-Sオプションで指定する必要があります。

MySQL Shellには "JavaScript", "Python", "SQL" の3モードがあり、デフォルトは "JavaScript"モードです(プロンプトの最後が "JS" になっています⁠⁠。mysqlコマンドと同じような操作をするには"SQL"モードに設定する必要があります。アップグレードチェッカーは "JavaScript" モードで使用します。

 MySQL  localhost  JS > util.checkForServerUpgrade()
The MySQL server at /var%2Flib%2Fmysql%2Fmysql.sock will now be checked for compatibility issues for upgrade to MySQL 8.0...
MySQL version: 5.7.22 - MySQL Community Server (GPL)

1) Usage of db objects with names conflicting with reserved keywords in 8.0
  No issues found

2) Usage of utf8mb3 charset
  No issues found

3) Usage of use ZEROFILL/display length type attributes
  No issues found

4) Issues reported by 'check table x for upgrade' command
  No issues found

5) Table names in the mysql schema conflicting with new tables in 8.0
  No issues found

6) Usage of old temporal type
  No issues found

7) Foreign key constraint names longer than 64 characters
  No issues found

8) Usage of obsolete MAXDB sql_mode flag
  No issues found

9) Usage of obsolete sql_mode flags
  No issues found

10) Usage of partitioned tables in shared tablespaces
  No issues found

11) Usage of removed functions
  No issues found

No known compatibility errors or issues for upgrading the target server to MySQL 8 were found.
0

util.checkForServerUpgrade() を実行すると、全部で11のテストが走ります。

MySQL 5.7と8.0は「メジャーバージョン番号」⁠詳細は第8回 MySQLのバージョン体系を知るを参照してください)が異なっており、パラメーターの非互換や機能の追加/廃止、新たな予約語の追加などがあります。これらの非互換に当たってしまった場合、SQLがエラーになる, SQLが期待した結果を返さない、などの問題が発生する可能性があるため、それらを事前にチェックしよう、というのがこのアップグレードチェッカーの主旨です。

アップグレードチェッカーで互換性の問題が検出された場合、MySQL 8.0にバージョンアップする前にアプリケーションのコードをチェックして問題がないかどうかを調査します(たとえば新たに予約語として指定されたワードがカラム名に使われていた場合、カラム名がクォーテーションされていれば問題はありませんが、クォートなしで指定されていた場合はシンタックスエラーになります⁠⁠。

MySQL 8.0.11へのアップグレード

アップグレードチェッカーで問題が検出されなければ、いよいよMySQL 8.0にアップグレードします(ただし、アップグレードチェッカーは全ての互換性の問題を検出するわけではありませんので、本番環境に適用するにはこれまで同様、リリースノートのチェックなどが必要不可欠です⁠⁠。

現在MySQL 5.7のリポジトリーを向いているmysql57-community-releaseのパッケージをアンインストールし、MySQL 8.0のリポジトリーを向いたmysql80-community-releaseのパッケージをインストールします(バージョンによってはmysql57-community-releaseパッケージにもMySQL 8.0のリポジトリーが含まれており、yum-config-managerなどで設定を変更することでも対応できる場合がありますが、割愛します⁠⁠。

$ sudo yum remove mysql57-community-release
$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm

$ cat /etc/yum.repos.d/mysql-community.repo
..
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
..

mysql80-community-releaseパッケージをインストールしたら、yum upgradeでMySQL 8.0をインストールできます。

$ sudo yum upgrade mysql-community-server
..
==============================================================================================================================
 Package                              Arch                 Version                      Repository                       Size
==============================================================================================================================
Updating:
 mysql-community-server               x86_64               8.0.11-1.el6                 mysql80-community               378 M
Updating for dependencies:
 mysql-community-client               x86_64               8.0.11-1.el6                 mysql80-community                28 M
 mysql-community-common               x86_64               8.0.11-1.el6                 mysql80-community               656 k
 mysql-community-libs                 x86_64               8.0.11-1.el6                 mysql80-community               2.5 M

先ほどと同じく、自動でmysqldは再起動します。

MySQL 5.7のシステムテーブルのままMySQL 8.0が起動しますので、エラーログには複数のエラーが出力されますが、mysql_upgradeを実行して再起動することでこのエラーは収まります。

$ mysql_upgrade
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
...
Upgrade process completed successfully.
Checking if update is needed.

$ sudo service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

$ sudo less /var/log/mysqld.log
...
2018-07-17T10:28:46.408223Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.11) starting as process 1393
2018-07-17T10:28:46.784815Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-07-17T10:28:46.809878Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.11'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.

まとめ

今回はyumリポジトリーを利用した環境で、2018/07/17現在の最新版であるMySQL 8.0.11へのバージョンアップの手順と、MySQL Shellのアップグレードチェッカーの使い方を紹介しました。

リリースから4か月とまだまだ情報の少ないMySQL 8.0ですが、今後試される方が増えることを期待しています。

おすすめ記事

記事・ニュース一覧