免責事項
この記事はMySQL Server Blogの投稿 INPLACE upgrade from MySQL 5.7 to MySQL 8.0 をユーザが翻訳したものであり、Oracle公式の文書ではありません。
==============================
MySQL 8.0のGA版が4月に発表され、多くの新機能が実装されました。新機能の概要やMySQL8.0での改良点については、こちらの記事で確認できます。
MySQLサーバはINPLACEとLOGICAL、両方のアップグレード方式が使えます。INPLACEアップグレードは、MySQL5.7サーバを停止し、古いバイナリをMySQL8.0のものに置き換えた後に、古いデータディレクトリをそのまま使用してMySQL8.0サーバを立ち上げる方法です。LOGICALアップグレードは、mysqldumpやmysqlpumpといったバックアップツールを使用してMySQL5.7からデータをSQLを出力し、インストールしたMySQL8.0に対してインポートする方法です。
MySQL8.0のインストール後にデータをロードする必要がないため、LOGICALアップグレードよりもINPLACEアップグレードの方が高速です。また、LOGICALアップグレードのデータロード中には非互換性に起因したエラーが発生する可能性もあり、その場合出力したSQLファイルを修正する必要があります。
本記事では、MySQL8.0にINPLACEアップグレードするための簡単な手順を説明します。
1. MySQL8.0にアップグレードする最初のステップは、既存のMySQL5.7サーバに対してアップグレードの準備が整っているかチェックすることです。私たちは、この作業がユーザにとって簡単になるよう、MySQL Shell 8.0に付属する形で"Upgrade Checker"を導入しました。この記事では、ツールの実行してアップグレード前にするべき作業があるかどうかを確認する方法について簡単に説明しています。早速、MySQL8.0へのアップグレードをする前に稼働中のMySQL5.7に対してこのツールを実行してみましょう。
npgopala@siv20$ ./mysqlsh root:@localhost:3307 -e "util.checkForServerUpgrade();"
mysqlsh: [Warning] Using a password on the command line interface can be insecure.
The MySQL server at localhost:3307 will now be checked for compatibility issues for upgrade to MySQL 8.0...
MySQL version: 5.7.24 - Source distribution
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
No known compatibility errors or issues for upgrading the target server to MySQL 8 were found.
npgopala@siv20$
ツールは修正しなければいけないエラーを出力しませんでした。そのため、古いバイナリを置き換える次のステップに進むことができます。
2. ここで、mysqldumpもしくはmysqlpump のようなバックアップツールを使って、データのバックアップを取得してください。mysqlのシステムデータやログファイルを含んだバックアップを取っておくことで、あなたのデータを守ることはとても大事なことです。
3. MySQL8.0のバイナリはこちらからダウンロードできます。そして、MySQL8.0サーバは古いデータディレクトリを使ってそのまま起動できます。私は以下のようなデフォルト設定で起動しました。
npgopala@siv20:~/workspace1/mysql-trunk/dbg-8.0$ ./runtime_output_directory/mysqld --basedir=/home/npgopala/workspace1/mysql-trunk/dbg-8.0 --datadir=/home/npgopala/data57 --log-error=/home/npgopala/workspace1/mysql-trunk/dbg-8.0/mysql1.log --socket=/home/npgopala/workspace1/mysql-trunk/dbg-8.0/mysql.sock --port=3307 --gdb --user=`whoami` --console --lc-messages-dir=./sql/share
4. サーバが起動したら、全てのシステムテーブル、およびユーザが作成したテーブルをチェック+アップグレードするために mysql_upgrade
を実行します。
npgopala@siv20$ ./runtime_output_directory/mysql_upgrade --socket=/home/npgopala/workspace1/mysql-trunk/dbg-8.0/mysql.sock --port=3307 --user=root
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
mysql.columns_priv OK
mysql.component OK
mysql.db OK
mysql.default_roles OK
mysql.engine_cost OK
mysql.func OK
mysql.general_log OK
mysql.global_grants OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.password_history OK
mysql.plugin OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.role_edges OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
Found outdated sys schema version 1.5.0.
Upgrading the sys schema.
Checking databases.
events.event_table OK
events.event_table_2 OK
foreign_keys.t1 OK
foreign_keys.t2 OK
foreign_keys.t3 OK
foreign_keys.t4 OK
foreign_keys.t5 OK
foreign_keys.t6 OK
foreign_keys.t7 OK
foreign_keys.t8 OK
partitions.p5_sub OK
sp.t OK
sys.sys_config OK
tablespace.t1 OK
tablespace.t2 OK
tablespace.t3 OK
tablespace.t4 OK
test.55_temporal OK
test.child OK
test.geom OK
test.jemp OK
test.jemp_myisam OK
test.opening_lines OK
test.parent OK
test.t_blackhole OK
test.t_blob OK
test.t_blob_myisam OK
test.t_compressed OK
test.t_compressed2 OK
test.t_compressed3 OK
test.t_dynamic OK
test.t_gen_stored OK
test.t_gen_stored_myisam OK
test.t_gen_stored_myisam2 OK
test.t_index OK
test.t_json OK
test.t_myisam_compressed OK
test.t_sc~!@#$%^&*( OK
test.vt2 OK
triggers.t1 OK
triggers.t2 OK
view_with_column_names.t1 OK
Upgrade process completed successfully.
Checking if update is needed.
npgopala@siv20$
システムテーブルはアップグレードされ、ユーザが作成したテーブルのチェックも完了しました。
5. mysqlクライアントで接続し、既存のデータが全て残っていることを確認してみましょう
npgopala@siv20$ ./runtime_output_directory/mysql --socket=/home/npgopala/workspace1/mysql-trunk/dbg-8.0/mysql.sock --port=3307 --user=root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.12 Source distribution
Copyright (c) 2000, 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 '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+------------------------+
| Database |
+------------------------+
| events |
| foreign_keys |
| information_schema |
| mysql |
| partitions |
| performance_schema |
| sp |
| sys |
| tablespace |
| test |
| triggers |
| view_with_column_names |
+------------------------+
12 rows in set (0.00 sec)
mysql>
6. サーバを停止し、もう一度起動してみます。ログに何もエラーが出力されていないことを確認しましょう。
2018-06-06T09:11:28.167169Z 0 [System] [MY-010116] [Server] /home/npgopala/workspace1/mysql-trunk/dbg-8.0/runtime_output_directory/mysqld (mysqld 8.0.12) starting as process 27147
2018-06-06T09:11:30.261139Z 0 [System] [MY-010931] [Server] /home/npgopala/workspace1/mysql-trunk/dbg-8.0/runtime_output_directory/mysqld: ready for connections. Version: '8.0.12' socket: '/home/npgopala/workspace1/mysql-trunk/dbg-8.0/mysql.sock' port: 3307 Source distribution
以上でINPLACEアップグレードは完了です。もし何かしらのエラーでアップグレードが失敗したら、MySQLサーバはデータディレクトリに対する全ての変更を巻き戻します。再度アップグレードを実施する場合は、以下のようにしてください。
- もしデータディレクトリ内にredoログがある場合は、それらを全て削除する
- 同じデータディレクトリを使用してMySQL5.7を起動する
- アップグレード中に出力されたエラーを全て解消する
- 再度INPLACEアップグレードを実施する
次回の私の記事では、MySQL8.0へのアップグレード中に起こりうるエラーに関して述べたいと思います。MySQL8.0にアップグレードする前には、アップグレードの前提条件とアップグレードによる影響のページを確認してください。
アップグレードに関する詳細な説明は、MySQLドキュメントで確認ができます。 MySQLを使って頂き、ありがとうございます!