Acesso negado para o usuário 'root' @ '%'

29

Eu costumava acessar o usuário root no MySQL muito bem. Mas, recentemente, não sou mais capaz.

Eu consigo fazer o login bem:

 mysql -u root -p

Aqui está o status do mysql após o login:

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

Mas quando eu quero executar qualquer ação, como:

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

Entendo que %é usado para indicar qualquer host, mas meu status indica claramente localhost. Alguém tem uma idéia do que pode estar acontecendo?

RolandoMySQLDBA
fonte

Respostas:

17

Eu acho que você tem usuários anônimos

Tente executar o seguinte:

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

Isso mostrará quais usuários anônimos existem. Provavelmente, você verá uma linha com um usuário, host %e uma senha em branco, conforme mostrado abaixo:

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     | %           |                                           |
+-----------+-------------+-------------------------------------------+

Então, como você se logou? Execute esta consulta:

SELECT USER(),CURRENT_USER();

O que isso diz a você?

  • USER () relata como você tentou se autenticar no MySQL
  • CURRENT_USER () relata como você pôde se autenticar no MySQL

A segunda função CURRENT_USER()revela como qual usuário anônimo foi usado para efetuar login.

Quais privilégios você tinha ao fazer login?

Por favor corra

SHOW GRANTS;

Isso revelará quais privilégios você tinha no momento em que efetuou login. O fato de você ter sido impedido de criar um banco de dados mostra que você não era root, mas algum usuário com menos privilégios.

Limpe suas concessões de usuário.

Quanto à redefinição da senha root, faça o seguinte:

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

Aprendi esse método eficiente com @ShlomiNoach .

De uma chance !!!

RolandoMySQLDBA
fonte
10

Eu sei o que você fez.

Fazem isto:

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

Você provavelmente notará que ele retorna um 'N' para Grant_priv. Então faça o seguinte:

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

E walla! Espero que ajude.

Kevin Florida
fonte
Além disso, por razões de segurança, você sempre deve excluir o usuário root após criar um novo dba .. apenas certifique-se de que eles são GRANT ALL PRIVILEGES e, no final, com GRANT OPTION .. esse bit é importante.
Kevin Flórida
Isso, combinado com o fechamento e a reabertura da conexão (no meu caso da HeidiSQL), fez o truque!
Xorinzor
4

Depois de entrar como rootusuário, verifique seus privilégios:

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

Após verificar seus privilégios, você pode tentar conceder a outro usuário todos os privilégios ou pode tentar conceder ao rootusuário todos os privilégios novamente:

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

Se seu root usuário não tiver privilégios, tente restaurá-los, portanto:

Pare o mysqld servidor

Reinicie o servidor dessa maneira mysqld_safe --skip-grant-table

Restaure rootprivilégios com:

 mysql> flush privileges;
 mysql> grant all privileges on *.* to 'root'@'localhost' with grant option;
Atropo
fonte
Isto é o que eu recebo após as concessões do show para o comando 'root' @ 'localhost': ERRO 1141 (42000): Não existe tal concessão definida para o usuário 'root' no host 'localhost'
Qual é a saída do segundo comando?
2
Há uma maneira "melhor" de fazer isso no Debian, onde você não precisa reiniciar o servidor. Apenas rootconecte debian-sys-maint@localhoste use a senha /etc/mysql/debian.cnf. Esse usuário tem TODOS os privilégios no MySQL. O bom é que você não precisa reiniciar o servidor.
Anders
Tente isso. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders
0

Seus privilégios podem ser reduzidos?

Além disso, você pode tentar criar outra conta com privilégios de root.

E exclua o usuário root e recrie com privilégios especificados.

Isso pode ser útil: http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2 - LINUX (Crie um arquivo com a consulta que cria, um novo usuário com privilégios de root)

C.5.4.1.1 - Windows (Crie um arquivo com a consulta que cria, um novo usuário com privilégios de root)

Consulta: (Criar usuário 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;

Manual MySQL: Criar Usuário: http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

David Metcalfe
fonte