권한을 부여하려고 시도하는 동안 사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다. 권한을 어떻게 부여합니까?


166

비슷한 질문을 많이 보았으므로 기본 사항을 확인했음을 보여줍니다. 물론 그렇다고해서 완전히 명백한 것을 놓친 것은 아닙니다. :-)

내 질문은 : 내가하려는 일을 할 수있는 권한을 가진 사용자와 이미 암호를 입력하고 액세스 권한이 부여 된 위치에 대한 사용자의 액세스가 거부되는 이유는 무엇입니까? (완전성을 기하기 위해 MySQL 클라이언트가 프로그램 시작시 액세스를 거부하도록 잘못된 암호를 입력하려고했습니다.)

배경:

ssh를 통해 MySQL 서버를 실행하는 시스템의 쉘에 로그인하면 루트로 로그인합니다.

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

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

mysql> 

대박. 비슷한 질문에 대한 답을 읽으면 보조금 표에있는 권한이 최신 상태인지 확인해야합니다

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> 

다음은 내가 생각하는 사람인지 확인하십시오.

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

... 정말 정말 있는지 확인합니다 :

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

여태까지는 그런대로 잘됐다. 이제 어떤 특권이 있습니까?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

이제는 읽기가 약간 어렵 기 때문에이 방법으로 시도해보십시오 (로컬 호스트가 아닌 '루트'사용자가 있음을 알 수 있습니다).

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

대박! MySQL은 내가 root @ localhost이고 root @ localhost는 모든 권한을 가지고 있다고 생각합니다. 그것은 내가 원하는 것을 할 수 있어야한다는 것을 의미합니다.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

이 기본적인 것을 어떻게 망칠 수 있었습니까?

참고 사항 : 모든 권한을 가진 root라는 사용자가 없다고 제안하려는 사람에게는 훌륭하고 다른 사용자에게 권한을 부여 할 수 있다면 좋을 것입니다.

감사합니다!


2
원격에서 동일한 문제가 발생했습니다 (그리고 user = 'root'및 host = '%'와 동일한 * FROM mysql.user를 선택하십시오). 그러나 호스트 = '%'인 mysql.user의 행이 해당 필드를 제외하고 호스트 = 'localhost'인 행과 동일하더라도 IT는 LOCALHOST에서 작동합니다. Windows Server 2003에서 5.0.45를 실행하고 있습니다. 모든 답변에 감사드립니다.
Richard Fawcett

3
이러한 체계적인 질문에 +1하십시오!
Dewsworld

1
관리자로 실행하여 cmd를 열 었는지 확인하십시오
Lijo

1
방금 -p비밀번호와 비밀번호 사이에 공백이있었습니다 . 나는 그 바보 같은 것을 알고 있지만 누군가를 도울 수 있습니다.
Vinay W

답변:


57

출력이 어떻게

SHOW GRANTS FOR 'root'@'localhost';

'모든 PRIVILEGES'라고 말하지 않았지만 root @ localhost가 가지고있는 것을 철자해야했습니다.

사용자가 가지고 있지 않은 것을 부여 할 수 없으며 서버가 무언가가 여기에 없다고 생각하는 것처럼 보이기 때문에 모든 권한을 부여하십시오.

이제 무엇이 빠졌습니까?

내 시스템에서 다음을 얻습니다.

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

5.5에는 mysql.proxies_user와 같은 새로운 테이블도 있습니다 : 테이블이 있는지 확인하십시오.

새로운 mysql 서버 인스턴스를 설치할 때 설치 스크립트는 적절한 구조로 모든 mysql. * 테이블을 만듭니다.

이전 버전에서 업그레이드 할 때는 적절한 업그레이드 절차 (mysql_upgrade)를 사용하여 누락 된 테이블 / 열을 추가해야합니다.

추측에 불과하지만,이 인스턴스에 대해 mysql_upgrade가 수행되지 않아 보이는 동작이 발생합니다.


7
유용한 정보이지만 문제를 어떻게 해결합니까?
augurar

2
@augurar, mysql_upgrade 실행
Marc Alff

또는 'ALL PRIVILEGES'를 가진 다른 사용자가 있는지 확인하고 해당 사용자로 전환하여 로컬 호스트의 권한을 변경하십시오. 예를 들어 root@127.0.0.1에 대한 모든 권한이 있었고 root @ localhost는 그렇지 않았습니다.
Carabus Manuel

72

MySQL 5.1에서 MySQL 5.5로 업그레이드 한 후 Windows에서도 동일한 문제가 발생했습니다. 이미 변화 만들고,에 언급 된 비밀번호 재설정 시도 여기를 , 여기 , 여기 , 그리고 여기 , 단서. 여전히 같은 오류가 발생합니다.

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

정상적으로 연결하고, 모든 데이터베이스를 표시하고, 선택 및 삽입을 수행하고, 사용자를 생성 및 추가 할 수 있지만 GRANT에 관해서는 망쳤습니다. 해당 액세스 거부 오류가 다시 나타납니다.

여기에 언급 된대로 MySQL 서버 bin / 디렉토리에서 다음 명령으로 권한을 수정 하여이 문제를 해결했습니다 .

C:\MySQL Server 5.5\bin> mysql_upgrade

그런 다음 문제가 사라졌습니다. 일반적으로 MySQL이 Linux와 Windows에서 동일한 명령을 제공하기 때문에이 솔루션이 Linux에서도 작동하기를 바랍니다.


2
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
mybrew가

30
CentO에 있거나 패키지 관리자를 통해 MySQL을 설치 한 경우 다음 명령을 실행 /usr/bin/mysql_upgrade -u root -p하십시오. password 및 Bob 's Your Uncle!
Zjoia

많은 의견으로 여기저기서 싸운 후에, 이것은 저에게 도움이되었습니다. 고마워
siddhusingh

나는 이것이 더 오래되었다는 것을 알고 있지만 이것은 나에게 많은 도움이되었고 미래의 방문객을 위해 하나 이상의 의견을 추가하고 싶었습니다 : ACCESS DENIED가 mysql_upgrade를 실행하려고하면 대신 다음과 같이 실행하십시오 : mysql_upgrade -p
blizz

2
내가 찾은 것은 MySQL <= 5.1을 통해 데이터베이스를 내 보낸 mysqldump ... --all-databases다음 MySQL> = 5.5로 가져 오면 사용자는 물론 교체되지만 rootOP와 동일한 문제가 발생한다는 것입니다. 그리고 mysql_upgrade작동하지 않습니다- --force플래그 를 추가해야합니다 mysql_upgrade -u root -p --force. 그것이 누군가에게 도움이되기를 바랍니다.
gregoltsov

62

mysql.users 테이블은 root 이외의 사용자에 대한 제한이없는 것으로 간주되므로 모든 테이블에 대한 모든 권한을 다른 사용자에게 부여하려고 할 때 발생할 수 있습니다.

그러나 다음은 작동합니다.

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

*. * 대신`%`. *를 사용합니다.


28
이것을 설명하십시오. 왜 '%'.*작동하지만 작동하지 *.*않습니까?
Pacerier

이것이 올바른 방법입니다. 루트로 MySQL에 로그인 한 다음 권한을 부여해야합니다.
Nav

1044 액세스 거부 오류가 발생했습니다 :( 제발 도와주세요
Bhaumik Thakkar

감사합니다, pymysql을 사용하여 Python 응용 프로그램에서 mysql에 액세스하려고했습니다. "호스트가이 MariaDB 서버에 연결할 수 없습니다"라는 오류가 발생했습니다. [여기] ( stackoverflow.com/questions/19101243/… )에 지정된 새 사용자를 추가하여 "사용자가 액세스가 거부되었습니다"라는 오류가 발생했습니다. 귀하의 방법으로 해결했습니다.
Balraj Bains

1
'%'.*대신 사용하면 `%`.*작동하지 않습니다. 당신은 반드시 사용`%`.*
로사리오 루소

7

배포판과 함께 제공되는 것보다 높은 MySQL 버전을 설치하려고 할 때 이런 일이 발생했습니다.

이전 버전을 지우고 새로운 버전 (rpm -e ... 다음 rpm -i MySQL-server *)을 설치했지만 / var / lib / mysql의 파일이 여전히 이전 버전의 파일이라는 것을 알지 못했습니다. Marc Alff의 설명-감사합니다!)

나는 mysql_upgrade를 할 수 있었지만 처음부터 시작하고 싶었다.

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

그런 다음 루트 암호 (/ usr / bin / mysqladmin -u 루트 암호)를 설정하면 GRANT 명령으로 예상대로 작동합니다 ...


고마워, 이것은 나를 도왔다. 운 좋게도, 내가 모든 DB를 제거했는지는 문제가되지 않았다 ...
Jarrod Mosen

5

기본적으로이 오류는 비밀번호를 지정하지 않은 경우 발생하며 일부 옵션 파일에 잘못된 비밀번호가 나열되어 있음을 의미합니다.

계정에 비밀번호를 지정하고 관리하는 방법을 이해하려면 이 DOC 를 읽으십시오 .

또한 폴더에 대한 권한 /var/lib/mysql/mysql 이 711인지 확인하십시오 .


이것은 나를 위해 일했습니다. mysql이 'user'@ 'localhost'에 대한 권한을 생성하지 않는 것 같습니다. 그래서 그 사용자를 만들고 암호를 가지고 있는지 확인해야했습니다.
Jerinaw

권한이 잘못되었습니다! 나는 놀랐다. 게시 해 주셔서 감사합니다.
Adam

5

나는 같은 문제가 있었다. 즉 루트에 부여 된 모든 권한

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

...하지만 여전히 테이블을 만들 수는 없습니다.

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

글쎄, 그것은 성가신 사용자 오류로 인한 것입니다. 즉, 데이터베이스를 선택하지 않았습니다. USE dbname을 발행 한 후 정상적으로 작동했습니다.


5

MySQL 5.5.40을 사용하는 Debian ( Wheezy , 7.8) SELECT * FROM mysql.user WHERE User='root'\G에서 Event_priv및 'Trigger_priv` 필드 있지만 Y로 설정 되지 않은 것으로 나타났습니다 .

달리기 mysql_upgrade(의 유무에 관계없이 --force)는 아무런 차이가 없었습니다. 매뉴얼을 작성해야했습니다.

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

그런 다음 마침내 사용할 수 있습니다.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

… 그리고 개별 데이터베이스 / 사용자 계정에서보다 정확하게 사용하십시오.


1
이것은 나에게도 문제를 해결했지만, 당신이 PRIVILEGES를 화제가되어야한다는 것을 알게 된 후에야; 그 후 부여 옵션을 설정하려면 다시 로그인하십시오.
Hendrik

5

당신은 (나 같은) MySQL 버전 8이 설치되어 있고이 질문에 만족스러운 답변을 찾지 못했을 때이 질문에 도달했을 수 있습니다. 버전 8에서는 더 이상 이와 같은 사용자를 만들 수 없습니다.

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

다소 혼란스러운 오류 메시지는 다음과 같습니다. ERROR 1410 (42000): You are not allowed to create a user with GRANT

버전 8에서 사용자를 작성하려면 다음 두 단계로 수행해야합니다.

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

물론, 당신이 원하는 경우, 당신은 또한 권한 (대신 제한된 수의를 제공 할 수 있습니다 GRANT ALL PRIVILEGES), 예를 들어,GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER


3

입력하면 SHOW GRANTS FOR 'root'@'localhost';암호가 잘 보이지 않아 다른 시스템에서 HeidiSQL을 사용하여 해당 시스템의 mysql에 로그인하고 ( root사용자 이름 및 해당 암호로 사용) 입력했습니다
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

시스템으로 돌아가서 다음을 사용하여 로그온했을 때 작동했습니다.
mysql -uroot -pthepassword;



2

나는 같은 문제가 있었고 SO 게시물과 Google의 문서를 읽는 데 많은 시간이 걸렸습니다. 마침내 Cloud SQL FAQ 에서 이것을 발견했습니다 .

Google Cloud SQL은 SUPER 권한을 지원하지 않으므로 GRANT ALL PRIVILEGES명령문이 작동하지 않습니다. 대안으로, 당신은 사용할 수 있습니다GRANT ALL ON `%`.*


1

내가 한 것처럼 여전히 우연히 만난 사람들에게는 시도 GRANT가 아직 존재하지 않는지 확인하는 것이 좋습니다 .

SHOW GRANTS FOR username;

내 경우에는 실제로 오류가 있었기 때문에 오류가 아니라 GRANT이미 존재 했기 때문 입니다.


1

mysql "access denied"오류가 발생했을 때 항상 작동하는 간단한 솔루션 : use sudo.

sudo mysql -u root

그런 다음 GRANT명령에 필요한 권한이 존재 합니다.

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