MySQL Error:: 'Доступ запрещен для пользователя' root '@' localhost '

264

$ ./mysqladmin -u root -p ' redacted '
Введите пароль:

mysqladmin: ошибка подключения к серверу при локальном хосте: ошибка:
«Отказано в доступе для пользователя root» @ «localhost» (с использованием пароля: ДА)

Как я могу это исправить?

Суровый Триведи
источник
1
@clearlight Не тот же вопрос, этот пост является проблемой с mysqladmin win супер привилегии в mysql, другой пост проблема с простым подключением из сокета.
e-info128
Попробуйте удалить, если существует ~/.my.cnfфайл.
e-info128
11
Я знаю, что это старо, но хочу сказать это для будущих посетителей. Не вводите свой пароль mysql, особенно для root, в самой команде, иначе он будет сохранен в истории вашей оболочки. Просто оставьте эту -pопцию отдельно, и MySQL запросит пароль.
Скотти С.

Ответы:

358
  1. Откройте и измените /etc/my.cnfили /etc/mysql/my.cnf, в зависимости от вашего дистрибутива.
  2. Добавить skip-grant-tablesпод[mysqld]
  3. Перезапустите Mysql
  4. Вы должны иметь возможность войти в MySQL, используя команду ниже mysql -u root -p
  5. Бегать mysql> flush privileges;
  6. Установите новый пароль с помощью ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Вернитесь в /etc/my.cnf и удалите / закомментируйте skip-grant-tables
  8. Перезапустите Mysql
  9. Теперь вы сможете войти с новым паролем mysql -u root -p
Кишоре Венкатараманан
источник
6
Здравствуйте, у меня была такая же проблема. Я сделал выше, и это решило проблему, но каждый раз, когда я перезагружаю CentOS, мне нужно делать все шаги снова (я получил сообщение: Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: НЕТ) - когда запускаю команду mysql (или любую другую команду sql), и я делаю снова и снова все, как указано выше, при каждой перезагрузке
Eitan
19
Жаль, что это не работает с MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Филипп Людвиг
11
Я нашел, что это работает @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Я сделал это после шага 5. Вот как выглядел вывод моей командной строки:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
Для шага 3 перезапустите MariaDB: я нашел следующие работы:sudo systemctl restart mariadb
therobyouknow
7
Некоторые могут найти файл в /etc/mysql/my.cnf
DSinghvi
590

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

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

С помощью одного запроса мы меняем auth_plugin на mysql_native_password и устанавливаем пароль root как root (смело меняйте его в запросе)

Теперь вы должны иметь возможность войти в систему с правами root. Более подробную информацию можно найти в документации MySQL

(выйдите из консоли mysql с помощью Ctrl + D или наберите exit )

user1878906
источник
41
Я не могу сделать это ... "У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, для правильного синтаксиса для использования рядом ...".
TCB13
2
Этот ответ сработал, я случайно добавил не полезный ответ голосования, извините!
Тахир
25
Очень хорошо работал на Ubuntu 18.04
Almino Melo
2
@ TCB13 и всем, кто сталкивается с этой проблемой. «Я не могу сделать это ...» У вас есть ошибка в вашем синтаксисе SQL; обратитесь к руководству, соответствующему вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом ... ». Используйте FLUSH PRIVILEGES перед выполнением команды alter
кодер
3
Вы
спасаете
50

Я попытался много шагов, чтобы исправить эту проблему. Существует так много источников возможных решений этой проблемы, что трудно отфильтровать смысл от бессмыслицы. Я наконец нашел хорошее решение здесь :

Шаг 1: Определите версию базы данных

$ mysql --version

Вы увидите некоторые результаты, как это с MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Или вывод, как это для MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

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

Шаг 2. Остановка сервера базы данных

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

Вы можете сделать это для MySQL с:

$ sudo systemctl stop mysql

И для MariaDB с:

$ sudo systemctl stop mariadb

Шаг 3. Перезапуск сервера базы данных без проверки разрешений.

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

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

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

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

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

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

$ mysql -u root

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

MySQL Prompt

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

MariaDB Prompt

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Теперь, когда у вас есть root-доступ, вы можете изменить пароль root.

Шаг 4: Изменение корневого пароля

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';

Не забудьте перезагрузить таблицы грантов после этого.

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

Query OK, 0 rows affected (0.00 sec)

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

Шаг 5: Перезагрузите сервер базы данных в обычном режиме

Учебное пособие включает дальнейшие шаги для перезапуска базы данных, но единственная часть, которую я использовал, была следующей:

Для MySQL используйте: $ sudo systemctl start mysql

Для MariaDB используйте:

$ sudo systemctl start mariadb

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

$ mysql -u root -p

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

Вывод

Теперь у вас восстановлен административный доступ к серверу MySQL или MariaDB. Убедитесь, что выбранный вами новый пароль root является надежным и надежным, и храните его в надежном месте.

Blairg23
источник
1
Оператор ALTER USER был введен в MariaDB 10.2.0.
Бенуа Дезросье
2
Вот Это Да ! эта самая линия mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';была таким спасителем жизни для меня!
lucyjosef
36

Ни один из приведенных выше ответов не помог мне с этой проблемой, поэтому вот решение, которое я нашел .

Соответствующая часть:

В системах Ubuntu, работающих под управлением MySQL 5.7 (и более поздних версий), пользователь root 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

sonrad10
источник
27

Для пользователей 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
потрясающий
источник
2
Это было все, что потребовалось. По-видимому, root в Ubuntu по умолчанию не является root.
Хаим Элия
21

Перепробовав ответы на все остальные вопросы, вот что у меня наконец получилось

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Я нашел ответ в этом посте: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
источник
1
ЭТА ПЛАГИНОВАЯ ЛИНИЯ ДЕЙСТВИТЕЛЬНО ПОЛЕЗНА. Я перепробовал много компоновок, но это единственное сработало для Ver 14.14 Distrib 5.7.27, для Linux (x86_64)
AlexNikonov
2
Это помогло мне с MySQL 5.7. Так это применимо не только для MariaDB
Podarok
Я только использовал это на MySQL 8 Ubuntu 20.04, и это работало. Другие ответы, использующие skip-grant-table(my.conf или in mysqlcommand), не работали. Я мог войти в учетную запись службы ( askubuntu.com/a/120769/169836 ), но UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';не работал. Только когда при использовании части плагина все заработало. Спасибо ~
hamx0r
16

Для новых пользователей Linux это может быть сложной задачей. Позвольте мне обновить это с помощью mysql 8 (последняя доступная на данный момент версия - 8.0.12 от 12 сентября 2018 года)

  1. Откройте файл конфигурации «mysqld.cnf» в «/etc/mysql/mysql.conf.d/».
  2. Добавьте skip-grant-tables к следующей строке текста [mysql] и сохраните.
  3. Перезапустите службу mysql как «sudo service mysql restart». Теперь ваш mysql свободен от любой аутентификации.
  4. Подключитесь к клиенту mysql (также известному как mysql-shell) как mysql -u root -p . На данный момент нет пароля для ввода.
  5. запустить команду sql flush привилегии;
  6. Сбросьте пароль сейчас как ALTER USER 'root' @ 'localhost', ОПРЕДЕЛЯЕМЫЙ 'MyNewPassword';
  7. Теперь вернемся к нормальному состоянию; удалите эту строку "skip-grant-tables" из "mysqld.cnf" и перезапустите службу.

Вот и все.

Амит Кр
источник
5

В своей рабочей среде MySQL вы можете перейти на левую боковую панель, в разделе «Управление» выбрать «Пользователи и привилегии», щелкнуть «root» в разделе «Учетные записи пользователей», в правой части нажать вкладку «Ограничения учетной записи», чтобы увеличить максимальное количество запросов, обновлений и т. Д., И затем нажмите вкладку «Административные роли» и установите флажки, чтобы предоставить учетной записи доступ. Надеюсь, это поможет!

Коллин Перселл
источник
4

Я сделал это, чтобы установить мой пароль root в начальной настройке MySQL в OSx. Откройте терминал.

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
Sadee
источник
3

В моем случае под Debian 10 ошибка

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

был решен (ХОРОШИЙ СПОСОБ)

sudo mysql -u root -p mysql

ПЛОХОЙ СПОСОБ:

mysql -u root -p mysql
Klor
источник
3

Тьфу - ничего не работает для меня! У меня есть машина CentOS 7.4 под управлением mariadb 5.5.64.

Я должен был сделать это сразу после установки mariadb из yum;

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installation проведет вас через ряд шагов, включая «Установить пароль root? [Y / n]». Просто скажите «у» и введите пароль. Ответьте на другие вопросы, как вы хотите.

Тогда вы можете войти с паролем, используя

# 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):

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

Из приглашения mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for 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. Используйте свой новый пароль.

Если вы хотите, вы можете установить все корневые пароли одновременно. Я думаю, что это мудро

mysql -u root -p
(login)
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;

Это выполнит обновления всех корневых паролей: то есть для "localhost", "127.0.0.1" и ":: 1"

В будущем, когда я перейду на RHEL8 или что там у вас, я постараюсь не забыть проверить / bin / mysql_secure_installation и посмотреть, как это сделали ребята, которые и настроили mariadb для этой ОС.

Майк С
источник
2

Если вы похожи на меня, и все вышеперечисленные предложения не сработали, перейдите к удалению всех версий mysql на вашем компьютере, найдите все оставшиеся файлы mysql с помощью этой команды sudo find / -name "mysql"и rm -rfвсе файлы или каталоги с прикрепленным к нему именем mysql (вам следует пропустить связанные файлы в библиотеки языков программирования). Теперь установите свежую версию MySQL и наслаждайтесь. NB: Вы потеряете все свои данные, поэтому сначала взвесьте ваши варианты.

Майкл Огала
источник
1

Это может произойти, если у вас недостаточно прав. Введите su, введите пароль пользователя root и повторите попытку.

виталий годжи
источник
1

Хорошо, я знаю, что это старая ветка, но если вы зашли на эту страницу через Google, как я, и ни одно из вышеперечисленных решений не сработало, ошибка оказалась на 100% глупостью с моей стороны. Я не подключился к серверу. После подключения все прошло гладко.

В случае, если это помогает узнать мои настройки, я использую Sequel Pro и пытаюсь подключиться к нему с помощью Node с помощью пакета NPM mysql. Я не думал, что мне нужно на самом деле подключаться (кроме запуска Sequel Pro), потому что я уже делал это из своего приложения.

введите описание изображения здесь

Mix Master Майк
источник
0

Решение: сдавайся!

Выслушайте меня, я потратил около двух дней, пытаясь заставить MySQL работать безрезультатно, всегда оставаясь с ошибками разрешения, ни одна из которых не была исправлена ​​ответами в этой теме. Дошло до того, что я подумал, что если я продолжу, то сойду с ума.

Из терпения заставить его работать, я послал команду для установки SQLite, используя только 450 КБ, и она с самого начала работала идеально.

Если у вас нет терпения святого, используйте SQLite и сэкономьте много времени, усилий, боли и места для хранения ..!

ArraysStartAt1
источник