サーバー、データベース、インフラに関するトピックス
■第11話:MySQL5からMySQL8へのアップグレードにおける注意点
(最終更新日:2023.09.07)
(絵が小さい場合はスマホを横に)
「安全にアップグレードしたい!」
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することが必要になる。
7.まとめ
今回、MySQL5から8へのメジャーバージョンアップの注意点について説明した。
メジャーバージョンアップの際には、今まで構築したシステム、アプリケーション、諸々で異なった動作をすることが付き物である。
パフォーマンスの改善、セキュリティの向上など、必要性があってバージョンアップしている。
ある時点では避けられない作業になるので、今回説明したようなポイントはおさえるようにしよう。
廃止されたもの、デフォルト設定の変更など、確認すべき点は変わらないはずだ。
確実にアップグレードに対応した上で、検索スピードの向上や新しい機能の活用を楽しもう。
▼参考図書、サイト
MySQL 8.0 での変更
MySQL
MySQL 8.0へのアップグレードのメリットと必要性
Oracle Video Hub