2026年9月15日

2026年9月15日

MySQL 8.0への移行方法と注意点(5.7からの移行と8.4 LTSへの道筋)

MySQL 5.7 から 8.0 への移行では、認証方式や既定の文字セットが変わり、設定ファイルやユーザー作成の書き方によってはサーバーが起動しない・アプリケーションが接続できないといった問題が起きます。この記事では、変わる点を先に整理し、事前確認から移行後の確認までの手順を説明します。

2026年11月時点の前提

  • MySQL 8.0 はサポートが終了しています: Oracle は 8.0 の提供終了(EOL)を2026年4月と案内しており、8.0 系の最後のリリースは 8.0.46 です。いま新しく移行先を選ぶなら、長期サポート版(LTS)の 8.4 か 9.7 が対象です(9.7 以降は 26.7 のような年.月形式の番号になります)。
  • 5.7 から 8.4 へは一度に上げられません: MySQL の公式マニュアルは、LTS 系列を飛ばすアップグレードをサポートしておらず、5.7 → 8.0 → 8.4 の順に進めるよう案内しています。つまり 5.7 からの移行では、8.0 で変わる点への対応が避けられません。
  • WordPress の推奨環境: wordpress.org の要件ページでは、MySQL 8.0 以上または MariaDB 10.11 以上が推奨されています。
  • ディストリビューションの標準パッケージ: Ubuntu 24.04 の標準リポジトリの mysql-server は 8.0 系(8.0.46)です。サポートの扱いはディストリビューションの方針によります。

5.7 から 8.0 で変わる主な点

変わる点 起きること 対処
既定の認証プラグインが caching_sha2_password になる 古いクライアントライブラリでは接続できない クライアントを更新する。当方の検証では、PHP 8.3 の mysqli で接続できた
既定の文字セットが utf8mb4、照合順序が utf8mb4_0900_ai_ci になる 8.0 で作ったテーブルのダンプを MariaDB や 5.7 に読み込むと照合順序が未対応でエラーになる 戻す可能性がある場合は照合順序を確認しておく
GRANT でユーザーを作れなくなる GRANT … IDENTIFIED BY … は構文エラーになる 先に CREATE USER でユーザーを作り、GRANT で権限だけ与える
クエリキャッシュが廃止 設定ファイルに query_cache_size などがあるとサーバーが起動しない 該当する行を設定ファイルから消す
sql_mode の NO_AUTO_CREATE_USER が廃止 設定ファイルで指定しているとサーバーが起動しない sql_mode から外す
予約語が増える(RANK など) その名前の列やテーブルを引用符なしで使うクエリがエラーになる クエリの中で名前をバッククォートで囲むか、名前を変える

8.0 で加わった機能には、ウィンドウ関数、共通テーブル式(WITH 句)、ロール、非表示インデックス、降順インデックス、JSON_TABLE()、トランザクション対応のデータディクショナリなどがあります。WordPress 本体はこれらを使わなくても動くので、移行の段階では互換性の確認を優先します。

手順1:アップグレードチェッカーで事前に確認する

MySQL Shell のアップグレードチェッカーは、移行の妨げになるものを一覧にしてくれます。移行先のバージョンを --target-version で指定し、MySQL Shell は移行先と同じかそれより新しいものを使います(チェックできる上限は MySQL Shell のバージョンです)。

# 5.7 のサーバーに対して、8.0.46 への移行で問題になる点を調べる
mysqlsh root@localhost:3306 -- util checkForServerUpgrade \
    --target-version=8.0.46 \
    --config-path=/etc/mysql/my.cnf

パスワードは対話で聞かれます。--config-path に設定ファイルを渡すと、廃止された設定項目も調べます。当方の検証(5.7.44 に対して MySQL Shell 8.4 で実行)では、rank という列名が予約語と衝突するという警告や、sql_mode の NO_AUTO_CREATE_USER が移行時に消されるという通知が表示されました。「Error」と表示された項目は移行前に直し、「Warning」は内容を読んで対応を決めます。

手順2:バックアップを取る

# WordPress のデータベースだけを書き出す(データベース名は wp-config.php の DB_NAME)
mysqldump -u root -p --single-transaction --routines --triggers \
    --default-character-set=utf8mb4 wordpress > wordpress.sql

WP-CLI が使える環境なら、WordPress のディレクトリで wp db export wordpress.sql でも書き出せます。インプレースで上げる場合は、これに加えてデータディレクトリ全体のバックアップ(サーバーを止めてからのコピーやスナップショット)も取っておきます。

手順3-A:新しいサーバーへ移す(論理移行)

新しく用意した 8.0 または 8.4 のサーバーに、WordPress のデータベースだけを移す方法です。ユーザーと権限は新しいサーバーで作り直します。公式マニュアルには --all-databases で全体を書き出して戻す手順もありますが、その場合はシステムテーブル(mysql データベース)も含まれ、GTID を有効にしたサーバーには読み込めないなどの注意点があります。WordPress だけを移すなら、そのデータベースだけを扱うほうが簡単です。

-- 新しいサーバーで実行(名前とパスワードは自分の環境のものに置き換える)
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '長いランダムなパスワード';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
# 書き出したファイルを読み込む
mysql -u root -p wordpress < wordpress.sql

読み込んだテーブルは、元の照合順序(WordPress では utf8mb4_unicode_520_ci など)のまま作られます。最後に wp-config.php の DB_HOST・DB_USER・DB_PASSWORD を新しいサーバーの値に書き換えます。

5.7 から 8.4 へこの方法で直接移すことは、上で触れた公式の移行経路には含まれません。当方の検証では、5.7.44 で作った WordPress のデータベースを 8.4 に読み込み、PHP 8.3 から接続して読み出せましたが、本番で行う前にステージング環境で確かめてください。

手順3-B:同じサーバーで上げる(インプレース移行)

同じサーバーのままパッケージを入れ替える方法です。MySQL 8.0.16 以降は、新しいバージョンのサーバーが起動時にデータディクショナリやシステムテーブルの更新を自動で行うため、以前の mysql_upgrade を手で実行する必要はありません。

-- innodb_fast_shutdown を 2 にしている場合は、停止の前に 1(高速)か 0(スロー)にする
SELECT @@innodb_fast_shutdown;
SET GLOBAL innodb_fast_shutdown = 0;

公式マニュアルによると、高速またはスローシャットダウンで止めておくと、InnoDB のファイルがバージョン間の形式の違いに対応できる状態で残ります。

# サーバーを止める(サービス名は環境によって mysql または mysqld)
sudo systemctl stop mysql

その後、MySQL 公式の APT / Yum リポジトリなどから 8.0 のパッケージに入れ替えて起動し、エラーログ(Ubuntu では /var/log/mysql/error.log)でアップグレードが完了したことと、起動を妨げるエラーが無いことを確認します。パッケージの入れ替え方は配布元によって違うので、使っているリポジトリの公式手順に従ってください。

手順4:移行後に確認する

-- バージョンと既定の文字セットを確認
SELECT VERSION();
SHOW VARIABLES LIKE 'character_set_server';

-- 各ユーザーの認証プラグインを確認
SELECT user, host, plugin FROM mysql.user;

WordPress の管理画面では、「ツール」→「サイトヘルス」の「情報」タブにある「データベース」の項目で、接続しているサーバーのバージョンを確認できます。投稿の表示・編集、ログイン、問い合わせフォームなど、データベースに書き込む機能も一通り試してください。

8.0 から 8.4 LTS へ進めるときの注意

  • mysql_native_password が既定で無効: 8.4 では、このプラグインは読み込まれていても無効の状態で、このプラグインのユーザーはログインできません。手順4の確認で mysql_native_password のユーザーが残っていたら、8.4 に上げる前に切り替えます。
ALTER USER 'wpuser'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新しいパスワード';
  • チェッカーをもう一度実行する: --target-version を移行先の 8.4 のバージョンにして、手順1と同じように確認します。
  • 8.0 から 8.4 へは、インプレース、論理移行、レプリケーションのいずれでも上げられます(公式マニュアルの移行経路)。

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲