Як виправити помилку «Plugin 'mysql_native_password' is not loaded» у MySQL 8.4 для PHP

У матеріалі розбирається підхід Ayesh Karunaratne до того, як адаптувати PHP-додатки до змін аутентифікації в MySQL 8.4 і новіших версіях.

Що змінилося в MySQL 8.4 і чому зламалися PHP-підключення

У MySQL 8.4 плагін аутентифікації mysql_native_password більше не завантажується за замовчуванням. А в MySQL 9.0 його взагалі прибрали з сервера.

Багато PHP-додатків (через PDO або MySQLi) досі використовують користувачів, створених з плагіном mysql_native_password. Коли такий користувач намагається підключитися до MySQL 8.4+, сервер повертає помилку, а PHP показує її у винятку.

Для PDO це виглядає так:

SQLSTATE[HY000] [1524] Plugin 'mysql_native_password' is not loaded

Для MySQLi — так:

mysqli_sql_exception  Plugin 'mysql_native_password' is not loaded.

У версіях MySQL 8.0.34 — 8.3 використання mysql_native_password ще працювало, але сервер писав у лог попередження про застарілість плагіна:

[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 8.4 плагін просто не завантажується, а в MySQL 9.0 взагалі видалений. Саме тому з'являється помилка «Plugin 'mysql_native_password' is not loaded».

PHP уміє працювати з сучасним плагіном caching_sha2_password, починаючи з PHP 7.4. Тому базове рішення — перевести користувачів з mysql_native_password на caching_sha2_password.

Крок 1. Знайти користувачів з mysql_native_password

Спочатку варто подивитися, які саме акаунти MySQL ще використовують застарілий плагін. Це допоможе не змінювати зайвих користувачів і не ламати сторонні інтеграції.

У консолі MySQL виконайте запит до системної таблиці mysql.user:

SELECT user, host, plugin from mysql.user WHERE plugin='mysql_native_password';

Цей запит поверне список усіх користувачів (поле user) та хостів (host), в яких поле plugin встановлене в mysql_native_password.

MySQL 8.4 - users with mysql_native_password plugin

Якщо результат порожній — помилка, швидше за все, стосується не цього плагіна або користувач уже змінений. Якщо є рядки — саме ці акаунти і викликають проблему під час підключення PHP та інших застосунків.

Крок 2. Перевести користувачів на caching_sha2_password

Рекомендований шлях, який описує автор, — для кожного користувача з mysql_native_password змінити плагін на caching_sha2_password. Це працює, починаючи з PHP 7.4, де реалізована підтримка цього механізму аутентифікації.

Маючи достатні привілеї в MySQL (наприклад, ALTER USER або ALL PRIVILEGES), для кожного такого користувача виконайте:

Приклад коду в оригіналі

  • <USERNAME> — ім'я користувача MySQL;
  • <HOST> — значення з колонки host (часто localhost, але може бути IP або шаблон типу %);
  • <PASSWORD> — фактичний пароль, який повинен використовуватися для цього користувача.

Після виконання ALTER USER MySQL оновлює спосіб аутентифікації користувача. Підключення PHP через PDO/MySQLi будуть проходити вже з використанням caching_sha2_password, якщо версія PHP не старіша за 7.4 і розширення MySQL зібрані зі звичайною підтримкою MySQL 8.

How to fix the SQLSTATE[HY000] [1524] Plugin mysql_native_password is not loaded errors caused in MySQL 8.4 no longer enabling the mysql_native_password plugin by default

Коли таке оновлення може бути проблемним

  • Якщо додаток працює на PHP 7.3 або старшій версії, де caching_sha2_password ще не підтримується.
  • Якщо ті самі MySQL-користувачі використовуються іншими клієнтами або бібліотеками, які не вміють працювати з caching_sha2_password.
  • Якщо пароль користувача невідомий і зберігався тільки всередині MySQL (тоді під час ALTER USER ... BY '<PASSWORD>' вам доведеться встановити новий пароль і оновити його в усіх застосунках).

У цих випадках автор розглядає тимчасовий обхідний варіант — знову ввімкнути mysql_native_password на MySQL 8.4.

Крок 3. Тимчасово ввімкнути mysql_native_password у MySQL 8.4

MySQL 8.4 більше не вмикає mysql_native_password за замовчуванням, але плагін ще є в дистрибутиві й його можна вручну активувати через конфігурацію сервера. Автор вказує, що це не рекомендований шлях, окрім випадків, коли немає можливості перейти на PHP 7.4+ або оновити клієнти.

Офіційна документація MySQL щодо цього плагіна доступна за посиланням з оригінального матеріалу: https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html.

Щоб увімкнути mysql_native_password у MySQL 8.4, потрібно додати параметр у конфігураційний файл сервера в секцію [mysqld] і перезапустити службу MySQL.

На Debian/Ubuntu-форках MySQL конфігураційні файли зазвичай розташовані в каталозі /etc/mysql/. Автор рекомендує не правити основний файл, а створити окремий, наприклад /etc/mysql/conf.d/enable-mysql-native-password.cnf, і додати туди такі рядки:

Приклад коду в оригіналі

Після перезапуску MySQL (через systemctl, service або інший механізм залежно від ОС) плагін mysql_native_password буде активний, й існуючі користувачі з цим плагіном знову зможуть підключатися.

Важливе обмеження для MySQL 9.0

У MySQL 9.0 плагін mysql_native_password повністю видалили. Це означає:

  • Активувати його через конфігурацію, як у прикладі вище, вже не можна.
  • Спроба прописати mysql_native_password=ON в конфігах призведе до помилки при старті MySQL, оскільки параметр стане недійсним.
  • Єдиний робочий підхід для MySQL 9.0 — перевести користувачів на підтримуваний плагін, наприклад caching_sha2_password, і оновити клієнтів (PHP, драйвери тощо), щоб вони могли з ним працювати.

Як обрати стратегію для свого проєкту

З огляду на описаний підхід, практична логіка така:

  • Якщо ви використовуєте PHP 7.4 або новішу версію — безпечніше і перспективніше одразу переводити користувачів MySQL на caching_sha2_password через ALTER USER. Це захищає від повного видалення mysql_native_password у 9.0.
  • Якщо ви тимчасово «застрягли» на PHP 7.3 і старіше — можливий обхід через активацію mysql_native_password у MySQL 8.4, але це варто сприймати як тимчасове рішення до оновлення PHP. Для MySQL 9.0 цей варіант уже не працює.
  • Перед масовою зміною користувачів має сенс перевірити, чи не використовують ті самі облікові записи старі клієнти або сторонні системи без підтримки caching_sha2_password.

Ключовий технічний висновок з матеріалу автора: помилка «Plugin 'mysql_native_password' is not loaded» у MySQL 8.4+ не є проблемою PHP-коду — вона пов'язана з налаштуванням користувачів і плагінів аутентифікації на сервері MySQL. Виправляти її потрібно або через переведення користувачів на caching_sha2_password, або, для старих стеків лише на MySQL 8.4, через явне ввімкнення mysql_native_password в конфігурації.


Джерело: Ayesh Karunaratne — PHP.Watch: статьи

Пошук

Закрити