Web制作、Web開発の歩き方

サーバー、データベース、インフラに関するトピックス

■第11話:MySQL5からMySQL8へのアップグレードにおける注意点

(最終更新日:2024.10.31)

Cookieのイメージ
この記事は6分で読めます!
(絵が小さい場合はスマホを横に)

「安全にアップグレードしたい!」

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することが必要になる。

MariaDB

7.まとめ

今回、MySQL5から8へのメジャーバージョンアップの注意点について説明した。 メジャーバージョンアップの際には、今まで構築したシステム、アプリケーション、諸々で異なった動作をすることがつき物である。 型の違い、推論の違い、関数や予約語の違いなどで、旧バージョンとの食い違いが起こる。 今までと同じ動作をさせるためには、検証、修正の時間が必要なので、リプレースのための時間をある程度設けることが必要である。 苦労することは間違いないが、時間をかけて、しっかりと同じ動作をできるように確認しよう。

リプレースの手間はかかるものの、きちんとバージョンアップができれば、長く安心して使うことができる。 パフォーマンスの改善、新機能活用、セキュリティの向上など、パワーアップした恩恵も少なくない。 余裕を持ったアップグレード作業を行い、検索スピードの向上や新しい機能の活用を楽しもう。 今より快適なデータベースライフが築けるはずだ。

▼参考図書、サイト

   MySQL8.0 での変更  MySQL
   MySQL8.0へのアップグレードのメリットと必要性  Oracle Video Hub