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

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

내 질문은 : 내가하려는 일을 할 수있는 권한을 가진 사용자와 이미 암호를 입력하고 액세스 권한이 부여 된 위치에 대한 사용자의 액세스가 거부되는 이유는 무엇입니까? (완전성을 기하기 위해 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라는 사용자가 없다고 제안하려는 사람에게는 훌륭하고 다른 사용자에게 권한을 부여 할 수 있다면 좋을 것입니다.

감사합니다!



답변

출력이 어떻게

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가 수행되지 않아 보이는 동작이 발생합니다.


답변

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에서도 작동하기를 바랍니다.


답변

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

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

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

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


답변

배포판과 함께 제공되는 것보다 높은 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 명령으로 예상대로 작동합니다 …


답변

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

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

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


답변

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

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을 발행 한 후 정상적으로 작동했습니다.


답변

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

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