サーバー、データベース、インフラに関するトピックス
■第11話:MySQL5からMySQL8へのアップグレードにおける注意点
(最終更新日:2024.10.31)
(絵が小さい場合はスマホを横に)
「安全にアップグレードしたい!」
MySQL5.7のサポートが2023年10月で終了した。
それに伴い、MySQL5.7からMySQL8.0にアップグレードしようと考える人も多いはずだ。
2024年4月には、6年ぶりの長期サポート安定版、8.4LTSがリリースされた。現在はこれを使うのが最善の選択だろう。
最長8年(2032年4月)までのサポートが保証されている。
今回は、MySQL5から8へのアップグレードを例として、データベースを新バージョンにする際の注意点を説明する。
1.アップグレードの意義
バージョンアップを行うことは、パフォーマンスの向上、新機能の追加、セキュリティの強化など、それぞれに意義がある。 特にセキュリティに関しては、バージョンアップを行わないと、脆弱性に関するパッチを充てられない。 安全にWeb開発を行うためにも、サポート期限が切れる前にバージョンアップは行おう。
2.デフォルトの文字コードの変更
MySQL8から、デフォルトの文字コードがutf8mb4になった。
これにより、絵文字や幾つかの特殊な文字を保存できるようになった。
これらはメリットではあるが、絵文字や特殊な文字を使わないという方は、
今まで通り使用していた文字コードを指定して、過去のデータベースと互換性を保つ方が良いだろう。
加えて、defaultのcharacter setで設定していた人は、
今まで使っていた文字コードと変わってしまうので、自分で以前使っていた文字コードを指定するようにしよう。
3.予約語の追加と影響
MySQL5.7から8に上がるに辺り、予約語も幾つか追加になった。
予約語をSQL文やカラム名に使用すると構文エラーなどが生じる。チェックしておこう。
いくつか例を挙げると「CUBE」「EMPTY」「JSON_TABLE」「LAST_VALUE」「RANK」などである。
詳しくは、公式サイトでチェックしよう。
現在、900弱の予約語がある。
4.変数、関数の削除と追加
クエリの中で、使える変数や関数にも変更があったので、幾つか紹介をする。
こちらも気になる方は公式サイトをチェックして欲しい。
削除されたものを、ストアドプロシージャやバッチ処理の中で使っている場合は、実行されなくなるので注意が必要だ。
■変数(廃止)
query_cache_size, query_cache_type : クエリキャッシュはMySQL8.0で完全に削除された。
secure_auth: この変数は廃止され、MySQL8.0以降ではセキュアなパスワード認証は常に必須となった。
old_passwords: MySQLの旧バージョンのパスワードハッシュ方式に関連していたが、MySQL8.0では削除された。
■関数(廃止)
PASSWORD(): ユーザーパスワードのハッシュを生成するために使われていたが、廃止された。
ENCRYPT(): この関数は暗号化のためのものだったが、他のより安全な関数やアルゴリズムに置き換えられた。
DES_ENCRYPT(), DES_DECRYPT(): これらの関数も同様に暗号化のためのものだったが、MySQL8.0で削除された。
これらは、古い暗号形式を用いており、現在のセキュリティ要件には合わなくなった。
代わりに、より安全な暗号化方式であるAES(Advanced Encryption Standard)を使用したAES_ENCRYPT()、AES_DECRYPT()があり、
こちらを使用することが推奨される。強力なハッシュ関数として用いることができる。
■関数(追加)
JSON_ARRAYAGG(): JSON配列として集約された結果セットの値を返す。
JSON_OBJECTAGG(): キーと値のペアを使用して、集約された結果セットからJSONオブジェクトを作成する。
JSON_TABLE(): JSONドキュメントを関係データの行と列に変換、通常のテーブルのようにJOINやクエリを実行できる。
JSON_OVERLAPS(): 2つのJSONドキュメントが共通の要素やキーを持っているかどうかを判定する。
JSON_MERGE_PATCH(): 2つのJSONドキュメントを統合するが、
JSON_MERGE_PRESERVE()とは異なり、2つ目のオブジェクトでNULLの値を持つキーは最初のオブジェクトから削除される。
JSON_STORAGE_SIZE(): JSONドキュメントがディスク上で消費するバイト数を返す。
JSON_STORAGE_FREE(): JSONドキュメント内で未使用のスペースのバイト数を返す。
JSON_KEYS(): JSONオブジェクトのキーの配列を返す。
ここで示した削除された変数、関数はごく一部である。 削除された変数、関数、非推奨になった変数、関数についての詳しい情報は、 公式サイトで確認しよう。
5.デフォルトの認証プラグインの変更
MySQL8では、デフォルトの認証プラグインとしてcaching_sha2_passwordが導入されている。
これは、旧バージョンのmysql_native_passwordよりもセキュリティが向上している。
よって、アプリケーションやライブラリが新しい認証プラグインをサポートしているかどうかを確認し、必要に応じて更新や設定変更を行うことが望ましい。
その他にも、セキュリティ向上策が施されている。
MySQL8は、セキュアな通信のための新しいTLS/SSLプロトコルや暗号化アルゴリズムをサポートしている。
強化されたパスワードバリデーションやポリシーを利用して、アクセスのセキュリティを向上させている。
セキュリティを向上させるために、不要なホスト名解決を無効にすることができる。
6.MariaDBとの互換性
MySQLとMariaDBは、共通の起源を持つ2つの異なるRDBMSである。 MariaDBは、MySQLのサンセットからフォークされたが、時間とともに両者は多くの違いを持つようになった。 MySQL 5.7以降とMariaDB 10.2以降の間でのバイナリログ形式は、完全に互換性があるわけではない。 MySQLのGTID(Global Transaction ID)実装もMariaDBとは異なる。 これは、レプリケーションやバックアップなど、特定の状況での互換性の問題を引き起こす可能性がある。 つまり、バイナリのバックアップ(例:mysqlbackupやxtrabackupで取得されたもの)や ファイルシステムのスナップショットをMySQLとMariaDB間で移行に用いることは難しい。 一度mysqldumpを使用してファイルをexportし、それをimportすることが必要になる。
7.まとめ
今回、MySQL5から8へのメジャーバージョンアップの注意点について説明した。
メジャーバージョンアップの際には、今まで構築したシステム、アプリケーション、諸々で異なった動作をすることがつき物である。
型の違い、推論の違い、関数や予約語の違いなどで、旧バージョンとの食い違いが起こる。
今までと同じ動作をさせるためには、検証、修正の時間が必要なので、リプレースのための時間をある程度設けることが必要である。
苦労することは間違いないが、時間をかけて、しっかりと同じ動作をできるように確認しよう。
リプレースの手間はかかるものの、きちんとバージョンアップができれば、長く安心して使うことができる。
パフォーマンスの改善、新機能活用、セキュリティの向上など、パワーアップした恩恵も少なくない。
余裕を持ったアップグレード作業を行い、検索スピードの向上や新しい機能の活用を楽しもう。
今より快適なデータベースライフが築けるはずだ。
▼参考図書、サイト
MySQL8.0 での変更
MySQL
MySQL8.0へのアップグレードのメリットと必要性
Oracle Video Hub