Вопрос или проблема
Рассмотрите:
./mysqladmin -u root -p** '_redacted_'
Вывод (включая ввод пароля):
Введите пароль:
mysqladmin: ошибка соединения с сервером ‘localhost’:
‘Доступ запрещен для пользователя ‘root’@’localhost’ (используется пароль: ДА)’
Как я могу это исправить?
Все решения, которые я нашел, были намного более сложными, чем необходимо, и ни одно из них не сработало для меня. Вот решение, которое решило мою проблему. Нет необходимости перезапускать mysqld или запускать его с особыми привилегиями.
sudo mysql
-- для MySQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
-- для MariaDB
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');
С помощью одного запроса мы изменяем auth_plugin на mysql_native_password и устанавливаем пароль root на root (не стесняйтесь изменить его в запросе).
Теперь вы должны иметь возможность войти как root. Дополнительную информацию можно найти в документации MySQL или документации MariaDB.
(Выйдите из консоли MySQL с помощью Ctrl + D или введя exit.)
- Откройте и отредактируйте
/etc/my.cnf
или/etc/mysql/my.cnf
, в зависимости от вашего дистрибутива. - Добавьте
skip-grant-tables
под[mysqld]
- Перезапустите MySQL
- Теперь вы должны иметь возможность войти в MySQL, используя следующую команду
mysql -u root -p
- Выполните
mysql> flush privileges;
- Установите новый пароль с помощью
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
- Вернитесь в /etc/my.cnf и удалите/закомментируйте skip-grant-tables
- Перезапустите MySQL
- Теперь вы сможете войти с новым паролем
mysql -u root -p
Ни один из предыдущих ответов не помог мне с этой проблемой, поэтому вот решение, которое я нашел.
Соответствующая часть:
В системах Ubuntu, работающих на MySQL 5.7 (и более поздних версиях), корневой пользователь MySQL по умолчанию аутентифицируется с использованием плагина auth_socket вместо пароля. Это позволяет увеличить безопасность и удобство использования во многих случаях, но также может усложнить ситуацию, когда вам нужно разрешить внешней программе (например, phpMyAdmin) доступ к пользователю.
Чтобы подключиться к MySQL как root с использованием пароля, вам необходимо изменить метод аутентификации с auth_socket на mysql_native_password. Для этого откройте запрос MySQL из вашего терминала:
sudo mysql
Затем проверьте, какой метод аутентификации используют ваши учетные записи MySQL с помощью следующей команды:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Вывод
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
В этом примере вы можете увидеть, что пользователь root действительно аутентифицируется с помощью плагина auth_socket. Чтобы настроить учетную запись root для аутентификации с помощью пароля, выполните следующую команду ALTER USER. Будьте уверены, что измените пароль на надежный пароль по вашему выбору, и обратите внимание, что эта команда изменит пароль root, который вы установили на Шаге 2:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Затем выполните FLUSH PRIVILEGES, который говорит серверу перезагрузить таблицы прав и применить ваши новые изменения:
FLUSH PRIVILEGES;
Проверьте методы аутентификации, используемые каждым из ваших пользователей, еще раз, чтобы подтвердить, что root больше не аутентифицируется с помощью плагина auth_socket:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Вывод
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
Вы можете увидеть в этом примерном выводе, что пользователь root MySQL теперь аутентифицируется с помощью пароля. Как только вы подтвердите это на своем сервере, вы можете выйти из оболочки MySQL:
exit
Я попробовал многие шаги, чтобы исправить эту проблему. Существует так много источников для возможных решений этой проблемы, что трудно выделить смысл из бессмысленности. Я наконец нашел хорошее решение здесь:
Шаг 1: Определите версию базы данных
mysql --version
Вы увидите вывод, подобный этому для MySQL:
mysql Вер 14.14 Distrib 5.7.16, для Linux (x86_64) с использованием EditLine wrapper
Или вывод, подобный этому для MariaDB:
mysql Вер 15.1 Distrib 5.5.52-MariaDB, для Linux (x86_64) с использованием readline 5.1
Обратите внимание, какую базу данных и какую версию вы используете, так как вы будете использовать их позже. Далее вам нужно остановить базу данных, чтобы вы могли получить к ней доступ вручную.
Шаг 2: Остановка сервера базы данных
Чтобы изменить пароль root, вам нужно заранее остановить сервер базы данных.
Вы можете сделать это для MySQL с помощью:
sudo systemctl stop mysql
А для MariaDB с помощью:
sudo systemctl stop mariadb
Шаг 3: Перезапуск сервера базы данных без проверки разрешений
Если вы запускаете MySQL и MariaDB без загрузки информации о привилегиях пользователей, это позволит вам получить доступ к командной строке базы данных с привилегиями root без предоставления пароля. Это позволит вам получить доступ к базе данных, не зная ее.
Для этого вам нужно остановить базу данных от загрузки таблиц прав, которые хранят информацию о привилегиях пользователей. Поскольку это является небольшой угрозой безопасности, вам также следует пропустить сетевые подключения, чтобы предотвратить подключение других клиентов.
Запустите базу данных без загрузки таблиц прав или включения сетевого подключения:
sudo mysqld_safe --skip-grant-tables --skip-networking &
Амперсанд в конце этой команды заставит этот процесс работать в фоновом режиме, чтобы вы могли продолжать использовать свой терминал.
Теперь вы можете подключиться к базе данных как пользователь root, который не должен запрашивать пароль.
mysql -u root
Вы сразу же увидите приглашение оболочки базы данных.
Подсказка MySQL
Введите 'help;' или '\h' для помощи. Введите '\c', чтобы очистить текущее входное выражение.
mysql>
Подсказка MariaDB
Введите 'help;' или '\h' для помощи. Введите '\c', чтобы очистить текущее входное выражение.
MariaDB [(none)]>
Теперь, когда у вас есть доступ root, вы можете изменить пароль root.
Шаг 4: Изменение пароля root
mysql> FLUSH PRIVILEGES;
Теперь мы можем на самом деле изменить пароль root.
Для MySQL 5.7.6 и более поздних, а также MariaDB 10.1.20 и более поздних, используйте следующую команду:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Для MySQL 5.7.5 и более ранних, а также MariaDB 10.1.20 и более ранних, используйте:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
Убедитесь, что вы заменили new_password
на новый выбранный вами пароль.
Примечание: Если команда ALTER USER
не работает, это обычно указывает на более серьезную проблему. Однако вы можете попробовать UPDATE ... SET
для сброса пароля root вместо этого.
[ВАЖНО] Это конкретная строка, которая исправила мою проблему:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User="root" AND Host="localhost";
Не забудьте перезагрузить таблицы прав после этого.
В любом случае вы должны увидеть подтверждение того, что команда была успешно выполнена.
Запрос выполнен, 0 строк затронуто (0.00 сек)
Пароль был изменен, так что теперь вы можете остановить ручной экземпляр сервера базы данных и перезапустить его, как было раньше.
Шаг 5: Обычный перезапуск сервера базы данных
Учебник идет дальше, чтобы перезапустить базу данных, но единственный момент, который я использовал, был этот:
Для MySQL используйте:
sudo systemctl start mysql
Для MariaDB используйте:
sudo systemctl start mariadb
Теперь вы можете подтвердить, что новый пароль был правильно применен, запустив:
mysql -u root -p
Команда теперь должна запросить новый назначенный пароль. Введите его, и вы должны получить доступ к приглашению базы данных, как и ожидалось.
Заключение
Теперь у вас восстановлен административный доступ к серверу MySQL или MariaDB. Убедитесь, что новый пароль root, который вы выберете, надежный и безопасный, и храните его в надежном месте.
После того, как я попробовал все остальные варианты, вот что в конце концов сработало для меня:
sudo mysql -- Он не запрашивает у меня никакого пароля
-- Затем в консоли MariaDB/MySQL:
update mysql.user set plugin = 'mysql_native_password' where User="root";
FLUSH PRIVILEGES;
exit;
Я нашел ответ в блоге Решено: Ошибка “Доступ запрещен для пользователя ‘root’@’localhost'” MySQL — codementor.tech (Medium).
Для пользователей Ubuntu/Debian
(Это также может работать на других дистрибутивах, особенно основанных на Debian.)
Запустите следующее, чтобы подключиться в качестве root
(без пароля)
sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf
Если вы не хотите добавлять --defaults-file
каждый раз, когда хотите подключиться как root
, вы можете скопировать /etc/mysql/debian.cnf
в вашу домашнюю директорию:
sudo cp /etc/mysql/debian.cnf ~/.my.cnf
А затем:
sudo mysql
По своему опыту, если вы запустите без sudo, это не сработает. Поэтому убедитесь, что ваша команда такова;
sudo mysql -uroot -p
Для новых пользователей Linux это может быть сложной задачей. Позвольте мне обновить это с MySQL 8 (последняя версия доступна сейчас — 8.0.12 на 2018-09-12)
- Откройте файл конфигурации “mysqld.cnf” в “/etc/mysql/mysql.conf.d/”.
- Добавьте skip-grant-tables на следующую строку секции [mysql] и сохраните.
- Перезапустите службу MySQL с помощью “sudo service mysql restart”. Теперь ваш MySQL свободен от любых аутентификаций.
- Подключитесь к клиенту MySQL (также известному как mysql-shell) как mysql -u root -p. В данный момент пароль вводить не нужно.
- Выполните SQL команду flush privileges;
- Сбросьте пароль сейчас, используя ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘MyNewPassword’;
- Теперь давайте вернемся к нормальному состоянию; удалите эту строку “skip-grant-tables” из “mysqld.cnf” и перезапустите службу.
Вот и всё.
В моем случае под Debian 10 ошибка
ERROR 1698 (28000): Доступ запрещен для пользователя 'root'@'localhost'
была решена (хороший способ)
sudo mysql -u root -p mysql
Плохой способ:
mysql -u root -p mysql
Моя станция здесь:
-
UBUNTU 21.04
-
PHP 5.6.40-57
-
MYSQL 5.7.37
Давайте настроим это
nano /etc/mysql/mysql.conf.d/mysqld.cnf
внизу напишите это
skip-grant-tables
перезагрузите его
service mysql restart
Я сделал это, чтобы установить свой пароль root в первоначальной настройке MySQL в OS X. Откройте терминал.
sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'
Закройте терминал и откройте новый терминал.
И следующее сработало на Linux, чтобы установить пароль root.
sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables
(sudo mysqld_safe --skip-grant-tables
: Это не сработало для меня в первый раз. Но со второго раза это было успешно.)
Затем войдите в MySQL:
mysql -u root
FLUSH PRIVILEGES;
Теперь измените пароль:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
Перезапустите MySQL:
sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Используйте sudo, чтобы изменить свой пароль:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'insert_password';
Источник: Phoenixnap – Доступ запрещен для пользователя root localhost
В вашем MySQL Workbench вы можете перейти в левую боковую панель, в разделе Управление выберите “Пользователи и привилегии”, нажмите root под Учетные записи пользователей, в правом разделе нажмите на вкладку “Ограничения учетной записи”, чтобы увеличить максимальное количество запросов, обновлений и т.д., а затем нажмите на вкладку “Административные роли” и отметьте флажки, чтобы предоставить учетной записи доступ.
Ух – ничего не сработало для меня! У меня машина CentOS 7.4, работающая на MariaDB 5.5.64.
Мне пришлось сделать это сразу после установки MariaDB с YUM;
systemctl restart mariadb
mysql_secure_installation
Команда mysql_secure_installation
проведет вас через несколько шагов, включая “Задать пароль root? [Y/n]”. Просто скажите “y” и дайте ему пароль. Ответьте на другие вопросы по своему усмотрению.
Затем вы сможете войти с вашим паролем, используя
mysql -u root -p
Он выживет
systemctl restart mariadb
Ключ
Затем я проверил исходный код /bin/mysql_secure_installation
, чтобы выяснить, как он мог волшебным образом изменить пароль root, и ни один из других ответов здесь не смог этого сделать. Важный момент:
do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User="root";"
…Говорит SET Password=...
, а не SET authentication_string = PASSWORD...
. Таким образом, правильная процедура для этой версии (5.5.64) следующая:
Войдите с помощью mysql -u root -p
, используя пароль, который вы уже установили.
Или остановите базу данных и запустите ее с помощью:
mysql_safe --skip-grant-tables --skip-networking &
С подсказки mysql>:
use mysql;
select host,user,password from user where user="root";
(посмотрите на ваши существующие пароли для root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user="root" AND host="localhost";
select host,user,password from user where user="root";
flush privileges;
quit;
Убейте запущую mysqld_safe. Перезапустите MariaDB. Войдите как root: mysql -u -p
. Используйте свой новый пароль.
Если хотите, вы можете установить все пароли root одновременно. Я думаю, что это мудро:
mysql -u root -p
(войти в систему)
use mysql;
select host,user,password from user where user="root";
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user="root";
select host,user,password from user where user="root";
flush privileges;
quit;
Это обновит все пароли root: т.е. для “localhost”, “127.0.0.1” и “::1”
В будущем, когда я перейду на RHEL 8 или что-то еще, я постараюсь запомнить, чтобы проверить /bin/mysql_secure_installation и посмотреть, как это сделали ребята, которые настраивали MariaDB для этой ОС.
Исправление для macOS
-
Установите MySQL с https://downloads.mysql.com/archives/community/ (8.x — последняя на данный момент версия, но убедитесь, что версия совместима с версией macOS)
-
Установите пароль для
root
(пускай<root-password>
будет паролем) во время установки (не забудьте запомнить пароль!) -
Выберите опцию Использовать устаревшее шифрование пароля (это то, что я использовал, и не пробовал опцию Использовать сильное шифрование пароля)
-
Найдите и откройте MySQL.prefPane (используйте инструмент поиска)
- Выберите вкладку Конфигурация
- Нажмите на опцию Выбрать в разделе Файл конфигурации
- Выберите
/private/etc/my.cnf
- Выберите
-
Из терминала откройте новый или существующий файл с именем
/etc/my.cnf
(vi /etc/my.cnf
) и добавьте следующий контент:[mysqld] skip-grant-tables
-
Перезапустите mysqld следующим образом:
ps aux | grep mysql
kill -9 <pid1> <pid2> ...
(получите pid всех связанных с MySQL процессов)
-
mysqld
перезапустится автоматически -
Убедитесь, что опция установлена, запустив следующее из терминала:
ps aux | grep mysql > mysql/bin/mysqld ... --defaults-file=/private/etc/my.cnf ... (вывод)
-
Выполните следующую команду для подключения (пусть
mysql-<версия>-macos<версия>-x86_64
будет папкой, в которой установлен MySQL. Чтобы получить фактическую папку, выполнитеls /usr/local/
и скопируйте имя папки):/usr/local/mysql-<версия>-macos<версия>-x86_64/bin/mysql -uroot -p<root-password>
Если вы, как и я, и вся информация из предыдущих ответов не сработала, перейдите к удалению всех версий MySQL на вашем компьютере, найдите все оставшиеся файлы MySQL, используя команду sudo find / -name "mysql"
и rm -rf
каждый файл или директорию с именем “mysql” (вы должны пропустить файлы, связанные с библиотеками языков программирования).
Теперь установите свежую версию MySQL и наслаждайтесь. Примечание: вы потеряете все свои данные, поэтому сначала оцените свои варианты.
Иногда по умолчанию устанавливается временный пароль при установке – как упоминается в документации. Это можно подтвердить с помощью следующей команды.
sudo grep 'temporary password' /var/log/mysqld.log
Это может произойти, если у вас недостаточно привилегий.
Введите su
, введите пароль root и попробуйте снова.
После множества попыток с следующим ответом:
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');
И подобными ответами, мой терминал по-прежнему выдавал мне следующую ошибку:
У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MariaDB для правильного синтаксиса, используемого рядом…
Поэтому после исследований в интернете эта строка решила мою проблему и позволила изменить пароль пользователя root:
sudo mysqladmin --user=root password "[ваш пароль]"
windows :
cd \Ampps\mysql\bin :
mysql.exe -u root -pmysql
после запуска mysql (вы можете видеть оболочку, подобную этой mysql> )
используйте этот запрос :
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
попробуйте снова получить доступ с root root
Одна из вещей, которую стоит проверить, — это фильтр from-host. По умолчанию он может быть “localhost”. Пытаетесь подключиться с удаленного клиента? Измените его на “%”.
На Arch Linux
Пакет: mysql 8.0.29-1
Что сработало для меня:
-
Отредактируйте файл my.cnf, который обычно можно найти по адресу
/etc/mysql/my.cnf
и добавьтеskip-grant-tables
в конце файла. -
Перезапустите службу mysql, вызвав
sudo systemctl restart mysqld
-
Убедитесь, что служба mysql стартовала правильно, вызвав
sudo systemctl status mysqld
-
Войдите в mysql, используя ‘root’, вызвав
mysql -u root -p
-
Сбросьте привилегии, вызвав
flush privileges;
-
Создайте нового пользователя с помощью
CREATE USER 'root'@'localhost' IDENTIFIED BY 'rootpassword';
-
(Если вы планируете использовать эту базу данных с PHP), вы должны вместо этого использовать
CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'rootpassword';
-
Проверьте, отобразились ли ваши изменения в базе данных, вызвав следующее по порядку:
use mysql;
SELECT User, password_last_changed FROM user;
-
Выйдите из консоли mysql и закомментируйте/удалите
skip-grant-tables
, отредактировав файл my.cnf (см. шаг 1 для местоположения) -
Перезапустите службу mysql (см. шаг 2 и шаг 3)
И это всё.
Если вы попали на эту страницу через Google, как я, и ни одно из предыдущих решений не сработало, то оказалось, что ошибка была на 100% глупостью с моей стороны. Я не подключился к серверу. Как только я подключился, всё пошло гладко.
На случай, если это поможет понять мою настройку, я использую Sequel Pro и пытаюсь подключиться к нему с Node, используя пакет NPM, mysql. Я не считал нужным фактически подключаться (кроме запуска Sequel Pro), потому что я уже делал это из своего приложения.
Я получал ту же ошибку, настраивая версию mysql-8 zip
. Наконец, я переключился на версию installer
, которая работала безупречно. Во время установки есть запрос на установку пароля для root
. После установки он точно работает.
Согласно официальной документации MariaDB, в MariaDB 10.4.3 и более поздних версиях плагин аутентификации unix_socket
установлен по умолчанию.
Чтобы отключить его и вернуть предыдущий метод аутентификации mysql_native_password
, добавьте строку ниже в секцию [mysqld]
файла my.cnf
:
[mysqld]
unix_socket=OFF
А затем выполните:
mysql_install_db --auth-root-authentication-method=normal
А затем запустите mysqld
Эта команда будет работать нормально:
mysqladmin -u root password CHANGEME
Для дополнительной информации смотрите Настройка mysql_install_db для возвращения к предыдущему методу аутентификации.
Я пытался использовать Docker Desktop на Mac, чтобы запустить 5.7.35, и эта конфигурация docker-compose.yml позволила это сделать:
В частности, это было добавление строки…
command: –default-authentication-plugin=mysql_native_password
…что и сработало
version: '3.3'
services:
mysql_db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'your_password'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- ~/your/volume/path:/var/lib/mysql
Столкнувшись с аналогичной проблемой при интеграции с Spring Boot, проблема в моем случае была довольно простой.
Я пытался получить доступ к пользователю root, но предоставлял неверный пароль в своем application.properties
Решение таково
- Либо измените пользователя с root на фактического пользователя, с которым вы хотите получить доступ с предоставленным паролем
Пример для моего случая: я указал root вместо budget в качестве имени пользователя.
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/budgetdb
spring.datasource.username=budget
spring.datasource.password=@@@password1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-
Либо предоставьте правильный пароль для пользователя root, что является потенциальной причиной проблемы.
spring.jpa.hibernate.ddl-auto=create spring.datasource.url=jdbc:mysql://127.0.0.1:3306/budgetdb spring.datasource.username=root spring.datasource.password=@@@Budget9650 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Аргумент ‘-p’ не ожидает пробел между именем аргумента и значением.
Вместо
./mysqladmin -u root -p 'redacted'
Используйте
./mysqladmin -u root -p'redacted'
Или просто
./mysqladmin -u root -p
что запросит вас ввести пароль.
Решение: Сдавайтесь!
Послушайте меня. Я потратил около двух полных дней, пытаясь заставить MySQL работать безуспешно, постоянно сталкиваясь с ошибками разрешений, которые не исправились с помощью ответов на этот вопрос. Дошло до того, что я думал, если продолжу, то сойду с ума.
Из-за недостатка терпения к тому, чтобы заставить это работать, я отправил команду на установку SQLite, которая использует всего 450 КБ, и это сработало прекрасно с самого начала.
Если у вас нет терпения святого, выберите SQLite и сэкономьте себе много времени, усилий, боли и места на диске..!
Ответ или решение
Ошибка MySQL: "Access denied for user ‘root’@’localhost’" – Решение проблемы с доступом
Ошибка "Access denied for user ‘root’@’localhost’" часто возникает при попытке доступа к серверу MySQL или MariaDB. Этот документ объясняет причины ошибки и предлагает решения для её устранения.
Природа ошибки
Ошибка возникает, когда сервер MySQL или MariaDB не позволяет подключение пользователя root
с указанными учетными данными. Возможные причины включают:
- Неверные учетные данные: Убедитесь, что вы вводите корректный пароль для пользователя
root
. - Метод аутентификации: В MySQL версии 5.7 и выше по умолчанию используется плагин аутентификации
auth_socket
, который требует, чтобы пользователь входил в систему через UNIX-пользователяroot
, а не по паролю. - Проблемы с конфигурацией: Настройки сервера могли быть неправильно настроены, что приводит к отказу в доступе.
Шаги для решения проблемы
1. Проверьте учетные данные
Убедитесь, что вы используете правильное имя пользователя и пароль. Попробуйте выполнить команду в терминале:
mysql -u root -p
При этом будет предложено ввести пароль. Убедитесь, что между -p
и паролем нет пробела.
2. Проверка метода аутентификации
Если вы имеете доступ к серверу через sudo
, выполните:
sudo mysql
Затем проверьте метод аутентификации:
SELECT user, host, plugin FROM mysql.user;
Если для пользователя root
установлен плагин auth_socket
, измените его на mysql_native_password
:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'новый_пароль';
FLUSH PRIVILEGES;
Теперь попробуйте подключиться снова, введя новый пароль.
3. Перезапуск MySQL без проверки привилегий
Если предыдущие шаги не помогли, вам может потребоваться запустить MySQL без проверки учётных записей, чтобы сбросить пароль:
- Остановите службу MySQL:
sudo systemctl stop mysql
- Запустите MySQL в безопасном режиме:
sudo mysqld_safe --skip-grant-tables &
- Подключитесь к MySQL:
mysql -u root
- Внутри MySQL выполните:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'новый_пароль';
- Перезапустите MySQL:
sudo systemctl restart mysql
Теперь вы сможете подключиться с новым паролем.
Заключение
Ошибка "Access denied for user ‘root’@’localhost’" может быть вызвана множеством причин, включая неверные учетные данные и неправильные настройки аутентификации. Примеры выше представляют несколько возможных решений. Обязательно проверяйте каждый шаг внимательно, чтобы убедиться, что вы устраните проблему на своём сервере MySQL или MariaDB.
Старайтесь избегать общих ошибок и будьте внимательны к нюансам конфигурации сервера, чтобы значительно сократить время на устранение неполадок.