zaLinux.ru

Ошибка ‘mysqli::real_connect(): (HY000/1524): Plugin ‘mysql_native_password’ is not loaded’ (РЕШЕНО)


Оглавление

  1. Ошибка The plugin 'mysql_native_password' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
  2. Как переключить пользователя с mysql_native_password на другой плагин идентификации
  3. Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Windows
  4. Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Linux
  5. Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в macOS/Homebrew
  6. Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в mysql docker tag
  7. Альтернативный способ запустить MySQL без проверки пароля подключающихся пользователей
  8. Как найти всех пользователей, использующих mysql_native_password
  9. Выбрать команду UPDATE mysql.user SET или ALTER USER?

Ошибка ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded

После обновления до MySQL 9 вы можете столкнуться с ошибкой в которой упоминается mysql_native_password.

Ошибка возникает на различных операционных системах, при этом неважно, используете ли вы клиент MySQL для подключения к СУБД, либо phpMyAdmin.

Вот так выглядит ошибка если вы используете phpMyAdmin:

phpMyAdmin, I get this error: 'mysqli::real_connect(): (HY000/1524): Plugin 'mysql_native_password' is not loaded'

Пример лога в котором проблема обозначена более ясно:

2024-09-19T08:37:19.574570Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-09-19T08:37:19.680765Z 0 [Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2024-09-19T08:37:19.681254Z 0 [System] [MY-010116] [Server] C:\Server\bin\mysql\bin\mysqld (mysqld 9.0.1) starting as process 16512
2024-09-19T08:37:19.721573Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-09-19T08:37:20.395562Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-09-19T08:37:20.965885Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2024-09-19T08:37:20.966671Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2024-09-19T08:37:20.988637Z 0 [Warning] [MY-010312] [Server] The plugin 'mysql_native_password' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
2024-09-19T08:37:21.004935Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060
2024-09-19T08:37:21.004981Z 0 [System] [MY-010931] [Server] C:\Server\bin\mysql\bin\mysqld: ready for connections. Version: '9.0.1'  socket: ''  port: 3306  MySQL Community Server - GPL.

Это часть лога из ОС Windows (хотя об аналогичной проблеме сообщают и пользователи macOS/Homebrew, и пользователи которые используют MySQL в контейнере Docker, и, видимо, независимо от способа установки при обновлении до MySQL 9 вы можете столкнуться с этой ошибкой.

Ключевой в журнале запуска службы MySQL является следующее сообщение:

The plugin 'mysql_native_password' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.

При попытке подключиться к MySQL в командной строке:

mysql -u root

Вновь выводится ошибка с упоминанием mysql_native_password.

ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded

Как уже несложно догадаться, плагин mysql_native_password, который участвует в аутентификации пользователя, был удалён из MySQL 9. А root (или даже все пользователи) используют этот метод аутентификации. По этой причине не получается выполнить вход.

Как переключить пользователя с mysql_native_password на другой плагин идентификации

Имеются разные способы решения данной проблемы, например, некоторые пользователи используют для подключения клиент MariaDB в которой присутствует поддержка плагина mysql_native_password, также будет работать понижение версии до MySQL 8.

Но, на мой взгляд, самым лучшим вариантом является переключение root и других пользователей на поддерживаемые в MySQL 9 плагины идентификации. Но как это сделать, если невозможно выполнить вход?

Можно использовать тот же самый приём, который используется для сброса пароля в MySQL и MariaDB. Далее показан способ решить проблему в различных операционных системах.

Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Windows

Откройте первое окно терминала с правами администратора. Для этого нажмите Win+x и выберите Terminal (Admin). В первом терминале остановите процесс MySQL:

net stop mysql

Здесь же перейдите к исполнимому файлу и запустите процесс MySQL с опцией —skip-grant-tables:

cd C:\Server\bin\mysql-9.0\bin\
.\mysqld --skip-grant-tables --skip-networking --shared-memory

Обратите внимание, что на моём компьютере файлы MySQL расположены в директории C:\Server\bin\mysql-9.0\ — если у вас другой путь, то отредактируйте первую команду соответствующим образом.

Не закрывая первый терминал, откройте второе окно терминала и выполните подключение к MySQL:

cd C:\Server\bin\mysql-9.0\bin\
.\mysql -u root

Затем после подключения к СУБД выполните следующие SQL-запосы:

USE mysql;
UPDATE user SET plugin = 'caching_sha2_password' WHERE User = 'root';
FLUSH PRIVILEGES;
exit;


Вернитесь к первому окну терминала — остановите процесс MySQL (для этого нажмите Ctrl+c) и затем запустите службу обычным образом:

net start mysql

Теперь вы можете закрыть все окна терминалов — проблема с mysql_native_password должна исчезнуть.

Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Linux

Отключите процесс СУБД:

sudo systemctl stop mysql

Если вы запускаете MySQL без загрузки информации о привилегиях пользователя, она позволит вам получить доступ к командной строке базы данных с привилегиями рута без идентификации пользователя.

Чтобы это сделать, вам нужно не дать базе данных загрузить таблицы привилегий, которые содержат информацию о привилегиях пользователя. Поскольку это несёт риск безопасности, вы также должны избежать сетевой активности, чтобы не допустить подключения других клиентов.

Запустите базу данных без загрузки таблиц привилегий и без доступа к сети:

sudo mysqld_safe --skip-grant-tables --skip-networking &

Амперсант на конце этой команды сделает так, что процесс запустится в фоне, поэтому вы сможете продолжать использовать ваш терминал.

Если вы видите ошибку

mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

То выполните следующие команды:


sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld

И запустите ещё раз:

sudo mysqld_safe --skip-grant-tables --skip-networking &

Теперь вы можете подключиться к базе данных как пользователь рут, у которого не спросят пароль.

mysql -u root

Вы сразу же увидите приглашение оболочки базы данных.

Затем после подключения к СУБД выполните следующие SQL-запосы:


USE mysql;
UPDATE user SET plugin = 'caching_sha2_password' WHERE User = 'root';
FLUSH PRIVILEGES;
exit;

Остановите экземпляр сервера базы данных, который вы запустили вручную. Следующая команда ищет PID или ID процесса для процесса MySQL и отправляет SIGTERM для сообщения процессу мягко выйти после завершения операций очистки.

sudo kill `sudo cat /var/run/mysqld/mysqld.pid`

Затем перезапустите сервис используя systemctl.

sudo systemctl start mysql

Теперь вы можете подтвердить, что новый пароль работает, запустите:

mysql -u root -p

Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в macOS/Homebrew

Выполните следующие команды:

brew services stop mysql
mysqld_safe --skip-grant-tables &
mysql -u root
USE mysql;
UPDATE user SET plugin = 'caching_sha2_password' WHERE User = 'root';
EXIT;
killall mysqld
brew services start mysql

Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в mysql docker tag

Добавьте в файл docker compose следующую опцию, затем заново создайте контейнер.

command: --skip-grant-tables

Подключитесь к оболочке контейнера mysql, используя пользователя root. Я сделал это через веб-интерфейс portainer. Введите:

mysql

затем нажмите Enter, и вы сможете подключиться к экземпляру mysql.

После этого выполните следующие команды:

FLUSH PRIVILEGES;

Следующий SQL-запрос используется чтобы показать всех пользователей, для идентификации которых используется плагин mysql_native_password:

SELECT User,Host,plugin FROM mysql.user WHERE plugin='mysql_native_password';

Для каждого пользователя и хоста выполните следующую команду:

ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'new_password';

В самом конце выполните ещё раз:

FLUSH PRIVILEGES;

И для отключения выполните команду:

exit;

Удалить из файла docker-compose

command: --skip-grant-tables

затем заново создайте контейнер.

После выполнения вышеуказанных шагов вы сможете снова подключиться к экземпляру MySQL.

Альтернативный способ запустить MySQL без проверки пароля подключающихся пользователей

Если показанный выше способ с командной строкой показался вам запутанным, то вот вам ещё один вариант. Вы можете указать опцию skip-grant-tables в конфигурационном файле MySQL в секции [mysqld], то есть должно быть так:


[mysqld]
skip-grant-tables

Если раздел [mysqld] существует, то просто добавьте опцию skip-grant-tables. Если раздел [mysqld] отсутствует, то добавьте обе указанные выше строки.

Конфигурационный файл MySQL обычно называется my.ini или my.cnf.

Примеры расположения этого файла в Linux:

/etc/my.cnf
/etc/mysql/my.cnf
~/.my.cnf

В macOS путь до файла может быть следующим:

/opt/homebrew/etc/my.cnf

Пример пути до конфигурационного файла MySQL в Windows:

C:\Server\bin\mysql-9.0\my.ini

Смотрите также: Как определить расположение и имя конфигурационного файла MySQL (MariaDB). Как узнать название групп для конфигурационных файлов MySQL и MariaDB

После внесения изменений в файл, нужно перезапустить служб MySQL, чтобы она начала использовать новый файл.

Перезапуск службы MySQL в Linux:

sudo systemctl restart mysql

Перезапуск службы MySQL в macOS:

brew services restart mysql

Перезапуск службы MySQL в Windows:

net stop mysql
net start mysql

Затем с помощью клиента MySQL подключитесь к серверу MySQL. В зависимости от операционной системы команды немного различаются:

mysql -u root
.\mysql -u root
C:\Server\bin\mysql-9.0\bin\mysql -u root

Затем выполните следующие SQL запросы:

USE mysql;
UPDATE user SET plugin = 'caching_sha2_password' WHERE User = 'root';
FLUSH PRIVILEGES;
exit;

Когда закончите, то нужно вновь отредактировать конфигурационный файл MySQL, а именно вернуть его к исходному состоянию и удалить опцию skip-grant-tables. После того как отредактируете и сохраните конфигурационный файл, вновь перезапустите службу MySQL (как это показано чуть выше), чтобы все новые изменения вступили в силу.

Как найти всех пользователей, использующих mysql_native_password

После подключения к MySQL, с помощью следующего SQL-запроса вы можете найти всех пользователей, использующих mysql_native_password:

SELECT User,Host,plugin FROM mysql.user WHERE plugin='mysql_native_password';

Для каждого из них выполните следующий SQL-запрос (замените root на имя пользователя):

UPDATE user SET plugin = 'caching_sha2_password' WHERE User = 'root';

Выбрать команду UPDATE mysql.user SET или ALTER USER?

Для изменения настроек пользователя вы можете выбрать одну из следующих команд:

UPDATE mysql.user SET plugin = 'caching_sha2_password' WHERE User = 'root';

Или:

ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'new_password';

Возможно вы уже обращали внимание на эти команды в разных инструкциях.

ALTER USER — специализированная команда для изменения настроек пользователей.

Но поскольку настройки пользователей хранятся в таблице user в базе данных mysql, то эти настройки можно изменить с помощью универсальной команды «UPDATE».

Какой-то принципиальной разницы, какую именно команду выбрать, нет — вы можете воспользоваться любой из них. Но небольшие нюансы всё-таки имеются.

Если вы выбрали ALTER USER, то вам обязательно нужно указать пароль:

ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'new_password';

Если пароль не указать, то вместо сохранения старого пароля (как вы могли бы предположить), будет сделан сброс на вход без пароля:

ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password

И ещё одно важное отличие ALTER USER в том, что вам нужно указать хост. Помните, что в качестве значений хоста могут быть различные значения. Вывести всех пользователей и их хосты вы можете следующим SQL-запросом:

SELECT User,Host,plugin,authentication_string FROM mysql.user;

Пример из Windows (MySQL 9):

Пример из Linux (MariaDB 11.5.2):

Если вы выбрали «UPDATE mysql.user SET», то вы не сможете поменять пароль, но при этом сможете точечно поменять другие настройки пользователя — например, plugin используемый для идентификации, как это показано выше.

Обратите внимание, что если не указать хост, то настройки в «UPDATE mysql.user SET» применяются сразу для всех пользователей с одинаковым именем, но разным хостом. Вы можете изменить это, явно указав хост:

UPDATE mysql.user SET plugin = 'caching_sha2_password' WHERE User = 'root' AND Host = 'localhost';

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *