Truy cập bị từ chối cho người dùng 'root' @ 'localhost' trong khi cố gắng cấp đặc quyền. Làm thế nào để tôi cấp đặc quyền?


166

Tôi đã xem xét một số câu hỏi tương tự và vì vậy tôi chứng minh rằng tôi đã kiểm tra những điều cơ bản. Mặc dù vậy, điều đó không có nghĩa là tôi đã bỏ lỡ điều gì đó hoàn toàn rõ ràng. :-)

Câu hỏi của tôi là: tại sao tôi bị từ chối truy cập vào người dùng với các đặc quyền để làm những gì tôi đang cố gắng làm và nơi tôi đã nhập mật khẩu và được cấp quyền truy cập? (Để hoàn thiện, tôi đã thử gõ sai mật khẩu chỉ để đảm bảo rằng máy khách MySQL sẽ từ chối tôi truy cập khi bắt đầu chương trình.)

Lý lịch:

Đăng nhập vào shell của máy chạy máy chủ MySQL thông qua ssh, tôi đăng nhập bằng root:

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

Tuyệt vời. Việc tôi đọc các câu trả lời cho các câu hỏi tương tự cho thấy rằng tôi nên đảm bảo rằng các đặc quyền hiện tại với những gì có trong các bảng cấp

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

mysql> 

Tiếp theo hãy chắc chắn rằng tôi là người mà tôi nghĩ tôi là:

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

... và thực sự thực sự chắc chắn:

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

mysql> 

Càng xa càng tốt. Bây giờ tôi có những đặc quyền gì?

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)

Bây giờ hơi khó đọc, vì vậy hãy thử theo cách này (bạn cũng sẽ thấy rằng có một người dùng 'root' không phải localhost):

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)

Tuyệt vời! MySQL nghĩ rằng tôi là root @ localhost và root @ localhost có tất cả những đặc quyền đó. Điều đó có nghĩa là tôi phải có thể làm những gì tôi muốn, phải không?

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)

Làm thế nào tôi có thể làm hỏng cái gì đó cơ bản này?

Lưu ý bên lề: đối với bất kỳ ai muốn đề xuất rằng tôi không có người dùng có tên root với tất cả các đặc quyền, điều đó thật tuyệt và tôi sẽ cân nhắc làm một khi tôi có thể cung cấp cho người dùng khác một số đặc quyền.

Cảm ơn bạn!


2
Tôi đang trải nghiệm điều tương tự từ xa (và chọn * TỪ mysql.user trong đó user = 'root' và host = '%' hiển thị cùng các đặc quyền mà bạn làm). TUY NHIÊN, NÓ LÀM VIỆC TRÊN ĐỊA PHƯƠNG mặc dù hàng trong mysql.user với host = '%' giống hệt với hàng có host = 'localhost' ngoài trường đó. Tôi đang chạy 5.0.45 trên Windows Server 2003. Mọi câu trả lời đều được chấp nhận!
Richard Fawcett

3
+1 cho một câu hỏi có tổ chức như vậy!
Dewswworld

1
đảm bảo bạn đã chống lại cmd bằng cách chạy với tư cách quản trị viên
Lijo

1
Tôi chỉ có một khoảng trống giữa -pvà mật khẩu. Tôi biết nó ngớ ngẩn nhưng có thể giúp đỡ một ai đó.
Vinay W

Câu trả lời:


57

Chú ý đầu ra của

SHOW GRANTS FOR 'root'@'localhost';

đã không nói 'TẤT CẢ CÁC ƯU ĐÃI' nhưng phải đánh vần root @ localhost có gì.

GRANT ALL PRIVILEGES sẽ thất bại, vì người dùng không thể cấp những gì họ không có và máy chủ dường như nghĩ rằng có gì đó không có ở đây ...

Bây giờ, những gì còn thiếu sau đó?

Trên hệ thống của tôi, tôi nhận được điều này:

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)

Ngoài ra còn có các bảng mới trong 5.5, chẳng hạn như mysql.proxies_user: đảm bảo bạn có chúng.

Khi cài đặt một cá thể máy chủ mysql hoàn toàn mới, tập lệnh cài đặt sẽ tạo ra tất cả các bảng mysql. * Với cấu trúc phù hợp.

Khi nâng cấp từ phiên bản cũ, hãy đảm bảo quy trình nâng cấp thích hợp (mysql_upTHER) được sử dụng, sẽ thêm các bảng / cột bị thiếu.

Đây chỉ là một phỏng đoán, nhưng có vẻ như mysql_upTHER đã không được thực hiện trong trường hợp này, gây ra hành vi được nhìn thấy.


7
Đây là thông tin hữu ích, nhưng làm cách nào để khắc phục sự cố?
6/2016

2
@augurar, Chạy mysql_upTHER
Marc Alff

Hoặc, kiểm tra xem bạn có người dùng khác với 'TẤT CẢ CÁC ƯU ĐÃI' và chuyển sang người dùng đó và thay đổi các đặc quyền cho localhost. Đối với ex, tôi có tất cả các đặc quyền trên root@127.0.0.1 và root @ localhost thì không.
Carabus Manuel

72

Tôi cũng gặp vấn đề tương tự với điều này nhưng trên Windows sau khi nâng cấp lên MySQL 5.5 từ MySQL 5.1. Tôi đã thử thay đổi, tạo và đặt lại mật khẩu được đề cập ở đây , đây , đâyđây , không có manh mối. Tôi vẫn nhận được cùng một lỗi:

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

Tôi có thể kết nối bình thường, hiển thị tất cả các cơ sở dữ liệu, thực hiện các lựa chọn và chèn, tạo và thêm người dùng, nhưng khi nói đến GRANT, tôi đã gặp rắc rối. Những lỗi truy cập bị từ chối xuất hiện một lần nữa.

Tôi đã quản lý để giải quyết vấn đề này bằng cách sửa các đặc quyền bằng lệnh sau trên thư mục bin / thư mục máy chủ MySQL như được đề cập ở đây :

C:\MySQL Server 5.5\bin> mysql_upgrade

Sau đó, vấn đề biến mất. Tôi hy vọng giải pháp này cũng hoạt động trên Linux vì thông thường MySQL cung cấp cùng một lệnh trên cả Linux và Windows.


2
thanx .. trong mac OS với mysql được cài đặt thông qua homebrew chạy lệnh saucd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras

30
Nếu bạn đang sử dụng CentO hoặc đã cài đặt MySQL thông qua trình quản lý gói, đây có thể là lệnh bạn nên chạy: /usr/bin/mysql_upgrade -u root -pnhập mật khẩu và chú của Bob!
Zjoia

Sau khi chiến đấu ở đây và ở đó với rất nhiều ý kiến, điều này đã giúp tôi. Cảm ơn rất nhiều
siddhusingh

Tôi biết điều này đã cũ hơn nhưng điều này đã giúp tôi rất nhiều và tôi muốn thêm một nhận xét cho khách truy cập trong tương lai: nếu bạn đang bị ACCESS DENIED cố gắng chạy mysql_upTHER, hãy thử chạy nó như thế này: mysql_upTHER -p
blizz

2
Những gì tôi tìm thấy là nếu bạn xuất cơ sở dữ liệu từ MySQL <= 5.1 qua mysqldump ... --all-databasesvà sau đó nhập dữ liệu đó vào MySQL> = 5.5, người dùng của bạn sẽ được thay thế (tất nhiên), nhưng bạn rootsẽ gặp vấn đề tương tự như OP. Và mysql_upgradesẽ không hoạt động - bạn phải thêm --forcecờ, tức là mysql_upgrade -u root -p --force. Hy vọng rằng sẽ giúp được ai đó ở đây.
gregoltsov

62

Điều này có thể xảy ra khi bạn cố gắng cấp tất cả các đặc quyền trên tất cả các bảng cho người dùng khác, vì bảng mysql.users được coi là ngoài giới hạn cho người dùng không phải là root.

Tuy nhiên, sau đây nên hoạt động:

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

Lưu ý rằng chúng tôi sử dụng `%`. * Thay vì *. *


28
Hãy giải thích điều này. Tại sao '%'.*làm việc nhưng không *.*?
Pacerier

Đây là cách đúng đắn để làm điều đó. Bạn phải đăng nhập vào MySQL với quyền root và sau đó thử cấp đặc quyền.
Nav

Tôi nhận được quyền truy cập Lỗi 1044 bị từ chối :( hãy giúp tôi
Bhaumik Thakkar

Cảm ơn, đã cố gắng truy cập mysql từ một ứng dụng python bằng pymysql. Có lỗi khi nói "Máy chủ không được phép kết nối với máy chủ MariaDB này", đã giải quyết điều đó bằng cách thêm một người dùng mới được cung cấp [tại đây] ( stackoverflow.com/questions/19101243/ ,), sau đó gặp một lỗi khác nói "quyền truy cập bị từ chối cho người dùng" và giải quyết nó bằng phương pháp của bạn.
Balraj Bains

1
Nếu bạn sử dụng '%'.*thay vì `%`.*không hoạt động. Bạn PHẢI sử dụng`%`.*
Rosario Russo

7

Điều này xảy ra với tôi khi tôi cố gắng cài đặt phiên bản MySQL cao hơn phiên bản đi kèm với bản phân phối.

Tôi đã xóa phiên bản cũ sau đó cài đặt phiên bản mới (rpm -e ... sau đó là rpm -i MySQL-server *) Nhưng không nhận ra rằng các tệp trong / var / lib / mysql vẫn từ phiên bản cũ hơn (có sự khác biệt như được giải thích bởi Marc Alff - cảm ơn!)

Tôi có thể đã thực hiện một mysql_upTHER, nhưng vì tôi muốn bắt đầu lại từ đầu nên tôi đã làm:

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

Sau đó, đặt mật khẩu gốc (/ usr / bin / mysqladmin -u mật khẩu gốc) và tất cả đều hoạt động như mong đợi với các lệnh GRANT ...


Cảm ơn, điều này đã giúp tôi ra ngoài. May mắn thay, không thành vấn đề nếu tôi xóa sổ tất cả các DB ...
Jarrod Mosen

5

Về cơ bản lỗi này xuất hiện khi bạn chưa chỉ định mật khẩu, điều đó có nghĩa là bạn có mật khẩu không chính xác được liệt kê trong một số tệp tùy chọn.

Đọc DOC này để hiểu cách gán và quản lý Mật khẩu cho tài khoản.

Ngoài ra, Kiểm tra xem quyền trên thư mục /var/lib/mysql/mysql có phải là 711 hay không.


Điều này làm việc cho tôi. Có vẻ như mysql không tạo quyền cho 'user' @ 'localhost'. Vì vậy, tôi phải tạo người dùng đó và đảm bảo rằng nó có mật khẩu.
Jerinaw

Các quyền đã sai! Tôi ngạc nhiên. Cảm ơn rất nhiều vì đã đăng nó.
Adam

5

Tôi đã có cùng một vấn đề, tức là tất cả các đặc quyền được cấp cho root:

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

... nhưng vẫn không được phép tạo bảng:

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

Chà, nguyên nhân là do lỗi người dùng gây phiền nhiễu, tức là tôi đã không chọn cơ sở dữ liệu. Sau khi phát hành USE dbname, nó hoạt động tốt.


5

Trên Debian ( Wheezy , 7.8) với MySQL 5.5.40 tôi tìm thấy SELECT * FROM mysql.user WHERE User='root'\Gcho thấy sự Event_privvà 'Trigger_priv` lĩnh vực đã có mặt nhưng không thiết lập để Y.

Chạy mysql_upgrade(có hoặc không có --force) không có sự khác biệt; Tôi cần làm một hướng dẫn:

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

Cuối cùng tôi cũng có thể sử dụng:

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

Sau đó sử dụng chính xác hơn trên một cơ sở dữ liệu / tài khoản người dùng.


1
Điều này cũng giải quyết được vấn đề cho tôi, nhưng chỉ sau khi tôi phát hiện ra rằng bạn cần phải XÁC NHẬN QUYỀN RIÊNG TƯ; sau đó và đăng nhập lại để đặt tùy chọn cấp.
Hendrik

5

Bạn có thể đã đến câu hỏi này với phiên bản MySQL 8 được cài đặt (như tôi) và không tìm thấy câu trả lời thỏa đáng. Bạn không còn có thể tạo người dùng như thế này trong phiên bản 8:

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

Thông báo lỗi khá khó hiểu mà bạn nhận được là: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Để tạo người dùng trong phiên bản 8, bạn phải thực hiện theo hai bước:

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

Tất nhiên, nếu bạn thích, bạn cũng có thể cung cấp một số đặc quyền hạn chế (thay vì GRANT ALL PRIVILEGES), vdGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER


3

Nhập vào SHOW GRANTS FOR 'root'@'localhost';cho tôi thấy một số mật khẩu bị che khuất, vì vậy tôi đã đăng nhập vào mysql của hệ thống đó bằng cách sử dụng HeidiSQL trên một hệ thống khác (sử dụng rootlàm tên người dùng và mật khẩu tương ứng) và nhập
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

và nó hoạt động khi tôi quay lại hệ thống và đăng nhập bằng
mysql -uroot -pthepassword;



2

Tôi đã có cùng một vấn đề và phải mất rất nhiều bài đọc SO và tài liệu của Google. Cuối cùng tôi đã tìm thấy điều này từ Câu hỏi thường gặp về Cloud SQL :

Google Cloud SQL không hỗ trợ các đặc quyền SUPER, điều đó có nghĩa là các GRANT ALL PRIVILEGEScâu lệnh sẽ không hoạt động. Thay thế, bạn có thể sử dụngGRANT ALL ON `%`.*


1

Đối với những người vẫn vấp phải điều này như tôi đã làm, đáng để kiểm tra để đảm bảo rằng nỗ lực đã GRANTkhông tồn tại:

SHOW GRANTS FOR username;

Trong trường hợp của tôi, lỗi không thực sự là do có lỗi cho phép, mà là do GRANTđã tồn tại.


1

Một giải pháp đơn giản luôn hoạt động với tôi khi gặp phải lỗi "truy cập bị từ chối" của mysql: use sudo.

sudo mysql -u root

Sau đó, các quyền cần thiết tồn tại cho GRANTcác lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.