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

29

Я имел обыкновение обращаться к пользователю root в MySQL просто отлично. Но в последнее время я больше не могу.

Я могу войти в систему нормально:

 mysql -u root -p

Вот состояние mysql после входа в систему:

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (i686) using readline 6.2

Connection id:      37
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.5.28-0ubuntu0.12.04.3 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         4 min 16 sec

Threads: 1  Questions: 112  Slow queries: 0  Opens: 191  
Flush tables: 1  Open tables:  6  Queries per second avg: 0.437
--------------

Но когда я хочу сделать какие-либо действия, такие как:

mysql> CREATE DATABASE moyennegenerale;
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'moyennegenerale'

Я понимаю, %что используется для обозначения любого хоста, но в моем статусе четко указано localhost. У кого-нибудь есть представление о том, что может происходить?

RolandoMySQLDBA
источник

Ответы:

17

Я думаю, что у вас есть анонимные пользователи

Попробуйте запустить это:

SELECT user,host,password FROM mysql.user WHERE user='';

Это покажет, какие анонимные пользователи существуют. Скорее всего, вы увидите строку с пустым пользователем, хостом %и пустым паролем, как показано ниже:

mysql> select user,host,password from mysql.user;
+-----------+-------------+-------------------------------------------+
| user      | host        | password                                  |
+-----------+-------------+-------------------------------------------+
| lwdba     | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| lwdba     | %           | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | localhost   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root      | 127.0.0.1   | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| vanilla   | localhost   |                                           |
| mywife    | %           |                                           |
|           | %           |                                           | <<<--- LOOK !!!
| replicant | 10.64.113.% | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| kumar     | %           |                                           |
+-----------+-------------+-------------------------------------------+

Итак, как вы вошли в систему? Запустите этот запрос:

SELECT USER(),CURRENT_USER();

Что это говорит вам?

  • USER () сообщает, как вы пытались пройти аутентификацию в MySQL
  • CURRENT_USER () сообщает, как вам разрешили проходить аутентификацию в MySQL

Вторая функция CURRENT_USER()показывает, каким образом анонимный пользователь использовался для входа в систему.

Какие привилегии у вас были, когда вы вошли в систему?

Пожалуйста, запустите

SHOW GRANTS;

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

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

Что касается сброса пароля root, пожалуйста, сделайте следующее:

echo "SET PASSWORD FOR root@localhost=PASSWORD('password');" > /var/lib/mysql/rootpwd.sql
service mysql restart
rm -f /var/lib/mysql/rootpwd.sql

Я узнал этот эффективный метод от @ShlomiNoach .

Попробуйте!

RolandoMySQLDBA
источник
10

Я знаю, что ты сделал.

Сделай это:

SELECT `User`, `Grant_priv` FROM `mysql`.`user` WHERE `User` = 'root';

Вы, вероятно, заметите, что он возвращает 'N' для Grant_priv. Так что сделайте это:

UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
FLUSH PRIVILEGES;
SELECT `User`, `Grant_priv` FROM `mysql`.`user`;

И Уолла! Надеюсь, это поможет.

Кевин Флорида
источник
также, из соображений безопасности, вы всегда должны удалять пользователя root после создания нового dba ... просто убедитесь, что он GRANT ALL PRIVILEGES, а затем в конце WITH GRANT OPTION ... этот бит важен.
Кевин Флорида
Это в сочетании с закрытием и повторным открытием соединения (в моем случае из HeidiSQL) сделало свое дело!
xorinzor
4

После того, как вы вошли как rootпользователь, проверьте свои права:

 mysql> show grants for 'root'@'localhost';

После проверки ваших привилегий вы можете попытаться дать другому пользователю все привилегии, или вы можете попытаться дать rootпользователю все привилегии снова:

 mysql> grant all privileges on *.* to 'root'@'localhost';

Если у вашего rootпользователя нет привилегий, вы можете попытаться восстановить их, поэтому:

Остановить mysqldсервер

Перезагрузите сервер таким образом mysqld_safe --skip-grant-table

Восстановите rootпривилегии с помощью:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
Atropo
источник
Это то, что я получаю после того, как show grants для команды 'root' @ 'localhost': ОШИБКА 1141 (42000): Для пользователя 'root' такой хост не определен на хосте 'localhost'
Каков вывод второй команды?
2
В Debian есть «лучший» способ сделать это, когда вам не нужно перезагружать сервер. Так же, как rootподключиться debian-sys-maint@localhostи использовать пароль в /etc/mysql/debian.cnf. Этот пользователь имеет ВСЕ привилегии в MySQL. Хорошо, что вам не нужно перезагружать сервер.
Андерс
Попробуй это. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Андерс
0

Ваши привилегии могут быть уменьшены?

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

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

Это может быть полезно: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (создайте файл с запросом, который создаст, новый пользователь с полными привилегиями root)

C.5.4.1.1 - Windows (Создайте файл с запросом, который создает, новый пользователь с полными привилегиями суперпользователя)

Запрос: (Создать пользователя root)

  CREATE USER 'new_root'@'%' IDENTIFIED BY '***';
  GRANT ALL PRIVILEGES ON *.* TO 'new_root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

MySQL Manual Create User: http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

Дэвид Меткалф
источник