docker compose up で MySQL のコンテナだけが起動せず、ログを数行残して終了します。
[ERROR] [MY-000067] [Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
[ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
[ERROR] [MY-010119] [Server] Aborting
同じ検索で当たる表示ゆれは次のとおりです。
unknown variable 'default_authentication_plugin=mysql_native_password'(アンダースコアで書いた場合。エラー文は書いたとおりの表記をそのまま返します)[ERROR] [MY-010119] [Server] Aborting/[Server] MySQL Server - end.(起動そのものが止まる側の行)unknown variable 'mysql-native-password=ON'(MySQL 9.0 以降で出ます。後述の二段目)[ERROR] [MY-013797] [Server] Option --authentication-policy is set to an invalid value.(移行先として案内される変数を単独で打った場合。これも後述)
修正は、指定を消すことです。 mysqld に渡している --default-authentication-plugin=mysql_native_password の 1 行を削ると起動します。
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: root
# この行を削る:
# command: --default-authentication-plugin=mysql_native_password
my.cnf の [mysqld] に default-authentication-plugin=mysql_native_password と書いてある場合も同じで、その行を削ります(書き方を変えても同じエラーになります。command 行で渡しても設定ファイルに書いても、出るエラー文は 1 文字も変わりません)。
なぜ MySQL 8.4 で出るのか:変数そのものが無くなった
default_authentication_plugin は MySQL 8.0.27 で非推奨になり、8.4.0 で削除されました。8.4.0 のリリースノートにそのまま書いてあります。
default_authentication_plugin: Deprecated in MySQL 8.0.27, and now removed. Useauthentication_policyinstead.
8.0 系では、同じ指定を渡すとサーバは起動して警告だけを出していました。
[Warning] [MY-010918] [Server] 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead.
同じ command 行のまま、イメージの版だけを変えた結果が次のとおりです。
| イメージ | --default-authentication-plugin=mysql_native_password | 終了コード |
|---|---|---|
mysql:8.0.46 | 起動する(MY-010918 の警告のみ) | 0 |
mysql:8.4.11 | unknown variable で Aborting | 1 |
mysql:9.7.2 | 同じ | 1 |
mysql:26.7.0 | 同じ | 1 |
サーバは未知の変数を無視しません。起動時のオプション解析で落として Aborting まで進むので、データディレクトリの中身にも接続元にも関係なく止まります。
タグを変えていないのに渡ることがある
compose.yml の image: を書き換えていなくても、タグの指す先が動きます。2026-08-08 時点の解決先は次のとおりです。
| タグ | 実際の版 |
|---|---|
mysql:8.0 | 8.0.46 |
mysql:8 / mysql:8.4 | 8.4.11 |
mysql:lts / mysql:9 | 9.7.2 |
mysql:latest | 26.7.0 |
mysql:lts は 8.4 系を指していました。 Docker 公式イメージのタグ定義(docker-library/official-images の library/mysql)では、2026-04-21 時点で lts が 8.4.9 に付いており、2026-04-23 の更新で 9.7.0 へ移っています。つまり mysql:lts と書いた compose.yml は、ファイルを 1 文字も編集しないまま 8.4 を飛び越えて 9.7 に着地します。
版が動く理由の側にも締め切りがあります。MySQL 8.0 は 2026 年 4 月 21 日に Oracle Sustaining Support へ移りました。
Per Oracle’s Lifetime Support policy, as of April 21, 2026, MySQL 8.0 is covered under Oracle Sustaining Support. Users are encouraged to upgrade to MySQL 8.4 LTS or 9.7 LTS.
移行先として名指しされているのは 8.4 と 9.7 の 2 本です。どちらにも default_authentication_plugin はありません。
二段になっている:8.4 は変数の削除、9.0 はプラグインの削除
検索で見つかる直し方の多くは、指定を消す代わりに --mysql-native-password=ON へ置き換えます。8.4 ではこれが通ります。
# mysql:8.4.11 --mysql-native-password=ON
[System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.4.11'
8.4.0 でプラグインは削除されていません。既定で読み込まれなくなっただけで、リリースノートは有効化の手順まで書いています。
The deprecated
mysql_native_passwordauthentication plugin is now disabled by default. It can be enabled by starting MySQL with the new--mysql-native-password=ONserver option, or by addingmysql_native_password=ONto the[mysqld]section of your MySQL configuration file.
9.0.0 でプラグインごと削除されました。 同じ =ON を 9.7.2 に渡すと、変数名が変わっただけの同じエラーで止まります。
# mysql:9.7.2 --mysql-native-password=ON
[ERROR] [MY-000067] [Server] unknown variable 'mysql-native-password=ON'.
[ERROR] [MY-010119] [Server] Aborting
9.0.0 のリリースノートは、サーバ側の削除とクライアント側の存続を分けて書いています。
The
mysql_native_passwordauthentication plugin, deprecated in MySQL 8.0, has been removed, and the server now rejectsmysql_nativeauthentication requests from older client programs which do not haveCLIENT_PLUGIN_AUTHcapability. For backward compatibility,mysql_native_passwordremains available on the client; the client-side built-in authentication plugin has been converted into a dynamically loadable plugin.
サーバから消えたのであって、クライアントには残ります。9.0 以降のサーバは、旧いクライアントからの mysql_native 認証要求を拒否します(引用の the server now rejects ... の部分)。クライアント側に mysql_native_password が残っているのは、旧いサーバへ接続するためです。
同じ更新で --mysql-native-password と --mysql-native-password-proxy-users の 2 つのサーバオプションが消えました。9.0.0 のリリースノートは、この一覧に default_authentication_plugin システム変数も並べていますが、この変数が実際に消えたのは 8.4.0 です(上流が 2 つの版のノートで同じ削除を数えています)。
版ごとの状態は、8.4 のマニュアルが 1 文にまとめています。
The
mysql_native_passwordauthentication plugin is deprecated as of MySQL 8.0.34, disabled by default in MySQL 8.4, and removed as of MySQL 9.0.0.
変数とプラグインでは、非推奨になった版が違います。
default_authentication_plugin(変数) | mysql_native_password(サーバ側のプラグイン) | |
|---|---|---|
| 8.0.27〜8.0.33 | 非推奨(動く・MY-010918) | まだ非推奨ではない |
| 8.0.34〜8.0.x | 非推奨 | 非推奨(動く・MY-013360) |
| 8.4.x | 削除 | 既定で無効(--mysql-native-password=ON で有効化できる) |
| 9.0.0 以降 | 削除(8.4.0 で消えたまま) | 削除(オプションごと無い) |
=ON への置き換えは 8.4 の 1 世代だけを渡る手当てです。mysql:lts を使っているなら、その 1 世代は既に通り過ぎています。
8.0 の警告が案内する authentication_policy は、単独で打つと別の失敗になる
8.0 が出していた警告は Please use authentication_policy instead でした。そのとおりに置き換えると、起動は別のエラーで止まります。
# mysql:8.4.11 --authentication-policy=mysql_native_password
[ERROR] [MY-013797] [Server] Option --authentication-policy is set to an invalid value. Please check if the specified authentication plugins are valid.
[ERROR] [MY-010119] [Server] Aborting
authentication_policy は default_authentication_plugin の名前を変えたものではありません。 多要素認証のポリシーを書く変数で、マニュアルはこう定義しています。
This variable is used to administer multifactor authentication (MFA) capabilities. For
CREATE USERandALTER USERstatements used to manage MySQL account definitions, it determines what authentication factor or factors may be specified
値はカンマ区切りの 1〜3 要素で、各要素が 1 つの認証要素に対応します。mysql_native_password のようにプラグイン名だけを書くと、その要素は必須になり、そのプラグインしか使えなくなります。起動が MY-013797 で止まるのは、書いた名前のプラグインが読み込まれていないからです。8.4 では mysql_native_password が既定で無効なので、名前だけを書いても解決先がありません。有効化と指定の 2 つが要ります。
--mysql-native-password=ON --authentication-policy=mysql_native_password
もう 1 つ、置き換えとして使う前に押さえる点があります。マニュアルは適用範囲も明記しています。
Because
authentication_policyapplies only when accounts are created or altered, changes to its value have no effect on existing user accounts.
既存のアカウントは変わりません。 この変数で変わるのは、以後 CREATE USER / ALTER USER で作る・変えるアカウントのほうです。既存ユーザの認証方式を移すのは別の操作になります(後述)。
この組み合わせは 8.4.11 で起動しますが、接続のたびに非推奨の警告が出ます。
[Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
--mysql-native-password=ON には、8.4.0 で mysqld が signal 6 で落ちるという報告が上がっています(docker-library/mysql#1059。クローズされていません)。8.4.0 と 8.4.11 のイメージで実際に渡してみたところ、どちらも起動しました。報告と食い違うので、8.4 系でこのオプションを使うならパッチ版を固定してください。
9.7.2 では --authentication-policy=mysql_native_password も同じ MY-013797 になります。プラグインが無いので、有効化する手段の側が先に消えているからです。
直し方:指定を消して caching_sha2_password に戻す
8.4 と 9.x に共通して残る道は 1 つです。指定を消すと、既定の caching_sha2_password でサーバが起動します。
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: root
削ったあとに接続側で Authentication plugin 'caching_sha2_password' cannot be loaded や Plugin 'mysql_native_password' is not loaded が出る場合は、サーバではなくクライアントの版が古いという別の問題です。そのときに default-authentication-plugin を書き戻しても、8.4 以降では起動しないので手当てになりません。クライアント側のドライバを上げる必要があります(PHP なら mysqlnd、MySQL Connector/J なら 8.0.9 以降が caching_sha2_password を扱います)。
既存のユーザが mysql_native_password で作られている場合は、9.x へ上げる前に作り直します。まず対象を数えます。
SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';
user が同じでも host が違えば別のアカウントです('app'@'%' と 'app'@'localhost' は両方出てきます)。出てきた分をそれぞれ変更します。
ALTER USER 'app'@'%' IDENTIFIED WITH caching_sha2_password BY '<パスワード>';
順序があります。 ALTER USER はその瞬間から認証方式を切り替えるので、まだ caching_sha2_password に対応していないクライアントは次の接続から落ちます。クライアント側を先に対応させてから打ってください。 戻すには IDENTIFIED WITH mysql_native_password を打ち直すことになりますが、その戻り先は 9.x には存在しません。
caching_sha2_password で接続できる管理者が 1 つでもあれば、この ALTER USER に旧プラグインの有効化は要りません。--mysql-native-password=ON が要るのは、移行を実行する管理者自身の接続経路が旧認証に依存している場合です。その場合だけ、有効化 → 移行 → 指定の削除、の順で進めます。
The designated data directory ... is unusable が出るかどうかで状況が違う
冒頭のログの 2 行目は、いつも出るわけではありません。
- ボリュームがまだ空のとき(初回の
docker compose up)はMY-013236 The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.が挟まります。初期化の途中で落ちているので、作りかけのファイルが残っています。 - すでにデータのあるボリュームを使っているときは、この行は出ません。
MY-000067→MY-010119 Aborting→MY-010910 Shutdown completeの順に進みます。
つまり MY-013236 は、初期化に失敗した空のディレクトリについて言っています。中身のあるデータベースが「消してよい」と言われているわけではありません。この行が出ていないなら、データはそのまま残っています。
切り分け
unknown variable 'mysql-native-password=ON'が出ている:8.4 向けの手当てを 9.0 以降に渡しています。指定を消してcaching_sha2_passwordに戻してください。ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loadedが出ている:サーバは起動しています。クライアントが接続したあとの認証の話で、この記事の経路とは別です。- ドライバは新しいのに、公開鍵の取得で止まる:
caching_sha2_passwordは、TLS でない接続ではサーバの公開鍵を必要とします。Connector/J ならPublic Key Retrieval is not allowed、mysqlクライアントなら--get-server-public-keyの指定が要る、という形で出ます。接続を TLS にするか、クライアント側で公開鍵の取得を許可してください(この経路は実測していません)。 unknown variableの変数名が違う:default-authentication-plugin以外の名前が出ているなら、8.4 で削除された別の変数です。MySQL 8.4.0 のリリースノートの Removed 節に一覧があります。mysqld: [Warning] World-writable config file '...' is ignored.が出て設定が効かない:Windows や WSL のバインドマウントで.cnfを渡すと、パーミッションが緩すぎるという理由で MySQL がファイルごと無視します。設定を変えたつもりが読まれていない状態なので、commandで渡すかイメージに焼いてください。- 8.0 のままにしておきたい:
mysql:8.0は 8.0.46 を指しています。8.0 は 2026 年 4 月 21 日に Sustaining Support へ移っており、機能追加や通常の修正はこの系列に降りてきません。
検証環境
mysql:8.4.11、ネットワーク遮断(イメージの pull のみ)- 再現:
docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_passwordがunknown variable 'default-authentication-plugin=mysql_native_password'を出して終了コード 1 - 修正:同じイメージのまま指定を外すと起動し、
mysqladmin pingとSELECT VERSION()が終了コード 0
再現から修正までは errfix の検証ハーネスが機械的に確認しています。版の対照(8.0.46 は警告のみで起動、8.4.11 / 9.7.2 / 26.7.0 は Aborting)、--mysql-native-password=ON が 8.4.0 と 8.4.11 で起動し 9.7.2 / 26.7.0 で unknown variable 'mysql-native-password=ON' になること、--authentication-policy=mysql_native_password が単独では MY-013797 になり --mysql-native-password=ON と併用すると起動すること、my.cnf に書いた場合も同じエラー文になること、アンダースコア表記がそのままエラー文に出ること、MY-013236 が空のデータディレクトリのときだけ挟まり既存データのあるボリュームでは MY-010910 Shutdown complete に続くことは、いずれも同じ手順で実測しています。
タグの解決先(mysql:lts が 9.7.2、mysql:latest が 26.7.0)は実測です。lts が 8.4.9 から 9.7.0 へ移った時期は docker-library/official-images のコミット履歴で確認しました(6a5974e5 / 77eaa8d1 が 8.4.9、6ecf1c5d が 9.7.0)。版の状態は MySQL 8.4.0 と 9.0.0 のリリースノートおよび 8.4 のマニュアル、authentication_policy の定義と適用範囲は 8.4 のシステム変数リファレンス、サポート期限は MySQL の EOL 告知ページによります。
クライアント側は実測していません。 ドライバの版(mysqlnd や Connector/J 8.0.9)も、公開鍵の取得で止まる経路も、各ドライバとサーバのドキュメントによる一般的な話です。切り分け節の該当項目にもその旨を書いています。