Оглавление
- Ошибка The plugin 'mysql_native_password' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
- Как переключить пользователя с mysql_native_password на другой плагин идентификации
- Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Windows
- Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в Linux
- Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в macOS/Homebrew
- Решение ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded в mysql docker tag
- Альтернативный способ запустить MySQL без проверки пароля подключающихся пользователей
- Как найти всех пользователей, использующих mysql_native_password
- Выбрать команду 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';
Связанные статьи:
- Выбрать команду UPDATE mysql.user SET или ALTER USER? (РЕШЕНО) (93.2%)
- Ошибка «Failed - Network error» во время экспорта в phpMyAdmin (РЕШЕНО) (54.4%)
- Как переименовать таблицу в phpMyAdmin и MySQL (54.1%)
- Как скопировать таблицу в phpMyAdmin (53.5%)
- Как в таблице MySQL/MariaDB найти строки с пустым значением столбца (в phpMyAdmin и в командной строке) (53.5%)
- Ошибка «ERROR 1366 (22007): Incorrect string value» в MySQL / MariaDB (РЕШЕНО) (RANDOM - 50.9%)