Web制作、Web開発の歩き方

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

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

(最終更新日:2023.09.07)

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

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

MySQL5.7のサポートが2023年10月で終了する。 それに伴い、MySQL5.7からMySQL8.0にアップグレードしようと考える人も多いはずだ。 今回は、データベースのアップグレードに関する注意点を、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 : クエリキャッシュはMySQL 8.0で完全に削除された。
secure_auth: この変数は廃止され、MySQL 8.0以降ではセキュアなパスワード認証は常に必須となった。
old_passwords: MySQLの旧バージョンのパスワードハッシュ方式に関連していたが、MySQL 8.0では削除された。

■関数(廃止)
PASSWORD(): ユーザーパスワードのハッシュを生成するために使われていたが、廃止された。
ENCRYPT(): この関数は暗号化のためのものだったが、他のより安全な関数やアルゴリズムに置き換えられた。
DES_ENCRYPT(), DES_DECRYPT(): これらの関数も同様に暗号化のためのものだったが、MySQL 8.0で削除された。

■関数(追加)
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.デフォルトの認証プラグインの変更

MySQL 8では、デフォルトの認証プラグインとしてcaching_sha2_passwordが導入されている。 これは、旧バージョンのmysql_native_passwordよりもセキュリティが向上している。 よって、アプリケーションやライブラリが新しい認証プラグインをサポートしているかどうかを確認し、必要に応じて更新や設定変更を行うことが望ましい。

その他にも、セキュリティ向上策が施されている。 MySQL 8は、セキュアな通信のための新しい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へのメジャーバージョンアップの注意点について説明した。 メジャーバージョンアップの際には、今まで構築したシステム、アプリケーション、諸々で異なった動作をすることが付き物である。 パフォーマンスの改善、セキュリティの向上など、必要性があってバージョンアップしている。 ある時点では避けられない作業になるので、今回説明したようなポイントはおさえるようにしよう。 廃止されたもの、デフォルト設定の変更など、確認すべき点は変わらないはずだ。

確実にアップグレードに対応した上で、検索スピードの向上や新しい機能の活用を楽しもう。

▼参考図書、サイト

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