사용자 'root'@ '%'에 대한 액세스가 거부되었습니다.


29

나는 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입니다. 누군가 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

답변:


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;

이렇게하면 로그인 할 때 보유한 권한이 공개됩니다. 데이터베이스를 만들 수 없도록 차단 된 사실은 자신이 루트 권한이 아니라 권한이 낮은 사용자임을 나타냅니다.

사용자 보조금을 정리하십시오.

루트 비밀번호를 재설정하려면 다음을 수행하십시오.

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

@ShlomiNoach 에서이 효율적인 방법을 배웠습니다 .

시도 해봐 !!!


10

네가 한 일을 알아

이 작업을 수행:

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

Grant_priv에 대해 'N'을 반환한다는 것을 알 수 있습니다. 이렇게하십시오 :

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

그리고 왈라! 희망이 도움이됩니다.


또한 보안상의 이유로, 새로운 dba를 생성 한 후에는 항상 루트 사용자를 삭제해야합니다. 모든 PRANTILEGES를 부여한 다음 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;

이것은 내가 '루트'에 대한 쇼 보조금 후 무엇을 얻을 @ 'localhost를'명령 : ERROR 1141 (42000) : '로컬 호스트'호스트의 사용자 '루트'에 대해 정의 된 이러한 보조금이 없다

두 번째 명령의 결과는 무엇입니까?

2
데비안에서는 서버를 다시 시작할 필요가없는 "더 나은"방법이 있습니다. root에서 debian-sys-maint@localhost와 같이 연결 하고 비밀번호를 사용하십시오 /etc/mysql/debian.cnf. 해당 사용자는 MySQL에서 모든 권한을 갖습니다. 좋은 점은 서버를 다시 시작할 필요가 없다는 것입니다.
Anders

이 시도. sudo mysql --defaults-file = / etc / mysql / debian.cnf
Anders

0

귀하의 특권이 축소 될 수 있습니까?

또한 루트 권한으로 다른 계정을 만들 수도 있습니다.

루트 사용자를 삭제하고 지정된 권한으로 다시 작성하십시오.

도움이 될 수 있습니다 : http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

C.5.4.1.2-LINUX (전체 루트 권한을 가진 새 사용자를 작성하는 쿼리로 파일 작성)

C.5.4.1.1-Windows (쿼리 권한을 가진 새 사용자를 작성하는 쿼리 작성 파일 작성)

쿼리 : (루트 사용자 만들기)

  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 수동 사용자 생성 : http://dev.mysql.com/doc/refman/5.5/en/adding-users.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.