mysql как исправить Доступ запрещен для пользователя 'root' @ 'localhost'

123

Прежде чем что-то испортить, при входе в систему использую $ mysql -u root -pи покажу базы данных:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Затем я попытался создать нового пользователя и заметил, что что-то не так с привилегиями.

Поэтому я удалил новых пользователей, и, думаю, случайно удалил «root» и «Admin».

Затем я снова пытаюсь создать «root», но при попытке предоставить все привилегии выдается ошибка «Отказано в доступе».

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Если я снова войду в MySQL $ mysql -u root -pи покажу базы данных,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Все остальные базы данных исчезли.

Как мне исправить MySQL сейчас?

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

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: ДА).

Должен ли я переустановить MySQL с помощью MacPorts? Если переустановить, я потеряю базу данных game_data, верно?

Vogelsire
источник
Попробуйте получить доступ к серверу с помощью root'@'127.0.0.1, который отличается от root с @ localhost. Затем введите команду для создания пользователя 'root' @ 'localhost' и предоставьте ему все привилегии.
Джимми
Также см. Как дать MySQL права root-пользователю? на супер пользователя. Он пытается избежать сброса паролей.
июня
У меня просто был пробел между -pпаролем. Я знаю, это глупо, но может кому-то помочь.
Vinay Wadhwa

Ответы:

132

Следуйте инструкциям ниже.

  1. Запустите экземпляр или демон сервера MySQL с --skip-grant-tablesпараметром (настройка безопасности).

    $ mysqld --skip-grant-tables
    
  2. Выполните эти заявления.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Если вы сталкиваетесь с неизвестным полем Ошибка пароля выше, используйте:

update user set authentication_string=password('my_password') where user='root';
  1. Наконец, перезапустите экземпляр / демон без --skip-grant-tablesопции.

    $ /etc/init.d/mysql restart
    

Теперь вы сможете подключиться с новым паролем.

$ mysql -u root -p

Введите пароль: my_password

Исправлена ​​ошибка в MySQL «Невозможно заблокировать ibdata1»

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart
Yogus
источник
1
«$ mysqld --skip-grant-tables» и «InnoDB: невозможно заблокировать ./ibdata1, ошибка: 35 InnoDB: убедитесь, что у вас еще нет другого mysqld процесса InnoDB: используется тот же файл данных или журналов InnoDB.»?
см. мое обновление выше
Yogus
Я обнаружил, что остановка mysql перед выполнением 1-й команды останавливает
возникновение
7
По-видимому, столбец «пароль» больше не существует ... он был заменен на «authentication_string». Таким образом, строка обновления пароля теперь выглядит следующим образом: UPDATE user SET authentication_string = PASSWORD ('my_password'), где USER = 'root';
jdmcnair
1
Спасибо! А теперь мне любопытно: что могло вызвать это? На винде?
Илья Андриенко
64

Ничто из вышеперечисленного не помогло мне. Я обнаружил, что мне нужно очистить метод плагина. В 5.6 я мог сделать:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

В 5.7 я обнаружил, что мне нужно:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

Согласно документации, с плагином, установленным в пустую строку, он должен был по умолчанию иметь значение mysql_native_password, но может быть запутан пустым хэшем пароля. Для большего количества нюансов вы можете прочитать документацию здесь: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

Марио Оливио Флорес
источник
5
Это решило это для меня. Когда я посмотрел на состояние демона mysql, я увидел это предупреждение: «[Предупреждение] 'user' запись 'root @ localhost' содержит и пароль, и заданный плагин аутентификации. Пароль будет проигнорирован". Установка плагина в '' позволила мне войти снова. Спасибо, @Mario Флорес
SpacePope
Мой плагин был пустым. Самое смешное, что оно автоматически изменилось на пустое. Обратите внимание, что я говорю об установке на моем персональном компьютере, где я использую dist-upgrade, поэтому это может быть причиной, по которой пользователь root сломался.
Друг Ким
2
set plugin='mysql_native_password'сделал это для меня, спасибо! Для справки: dev.mysql.com/doc/refman/5.7/en/...
Коен.
Почему это все еще является проблемой для установочных пакетов в 2018 году?
Маккензм
1
Ubuntu 18, и это сработало
Rahal Kanishka
8

Также убедитесь, что нужная запись в таблице userимеет пустое pluginполе (может быть, например, "unix_socket").

Начиная с версии 5.5.7, mysql поддерживает различные плагины авторизации https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html.

Так что, если у вас есть непустое pluginполе, пароль будет проигнорирован, и в журнале ошибок mysql появится предупреждение (для меня это /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

d9k
источник
1
Для кого-то еще, кто сталкивается с этим, при запуске сервера MySQL 5.7.15 это фактически блокирует вашего пользователя, если вы не предоставите плагин. Вероятно, то, что вы ищете, является pluginоф mysql_native_password.
Джонатан Кантрелл
8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Вы можете увидеть что-то вроде этого;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Обеспечение безопасности развертывания сервера MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Если вы видите, это говорит

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Посмотрите последние 10 минут этого видео , оно научит вас, как вы это делаете.

Tadeh
источник
Хотя это может дать ответ на вопрос, вы должны дать более подробное описание связанного контента и объяснить, как он связан с вопросом. Это поможет гарантировать, что этот ответ останется полезным в случае, если связанная страница будет удалена или перейдет в автономный режим. Для получения дополнительной информации см. Этот пост Meta Stack Exchange .
bwDraco
Это тот случай использования, который я видел, я устанавливаю mysql на RHEL7 в AWS с Ansible, и я получаю такое же поведение после перенастройки и перезапуска БД. Знаете ли вы, почему это происходит в первую очередь, блокирует доступ Ansible к локальному mysqld и его настройку. Это только для целей тестирования.
Эйнарк
Видимо, это зависит от того, как вы инициализируете сервер, посмотрите на шаг 4 здесь: dev.mysql.com/doc/refman/5.7/en/…
einarc
3

Попробуй:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
Густаво Дуарте
источник
6
Можете ли вы описать, что --no-defaults --forceделают переключатели? В противном случае это дубликат VLQ вышеупомянутого принятого ответа.
канадский Люк
@CanadianLuke no defaults пропускает любые имеющиеся файлы конфигурации, которые он бы включил, принудительно продолжает работу, даже если какая-либо из выданных команд SQL завершается неудачно. В случае сомнений, проверьте руководство
deucalion
3
Это должно быть отредактировано в ответ
канадец Люк
2
Я получаюERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Джонатан
1
@JonathanLeaders взгляд: stackoverflow.com/questions/30692812/…
Густаво Дуарте
3

В моем случае у меня была повреждена база данных, после перезапуска mysql в Debian вход в систему root был без пароля. Решение было таким:

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

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

Джон
источник