MySQL ERROR 1045 (28000): Truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ)


427

Trước tiên hãy để tôi đề cập rằng tôi đã trải qua nhiều câu hỏi được đề xuất và không tìm thấy câu trả lời phù hợp. Đây là những gì tôi đang làm.

Tôi đang kết nối với phiên bản Amazon EC2 của mình. Tôi có thể đăng nhập bằng MySQL root bằng lệnh này:

mysql -u root -p

Sau đó, tôi đã tạo hóa đơn người dùng mới với% máy chủ

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Cấp tất cả các đặc quyền cho hóa đơn người dùng:

grant all privileges on *.* to 'bill'@'%' with grant option;

Sau đó, tôi thoát khỏi người dùng root và cố gắng đăng nhập bằng hóa đơn:

mysql -u bill -p

nhập đúng mật khẩu và gặp lỗi này:

LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ)


34
Có phải bạn FLUSH PRIVILEGESkhông
eggyal

6
Được rồi, tôi đã thử điều này mà không có bất kỳ thành công. Bất kỳ đề nghị khác xin vui lòng.
Ali

1
Phiên bản nào của máy chủ bạn đang chạy? Tôi đã thấy 5.1 hành xử kỳ quặc về điều này.
Poodlehat

2
Điều này đã xảy ra với tôi trong khi cài đặt Magento và tôi đã mắc một lỗi nhỏ hơn nhiều. Đặt 'mysql -u magento -p magento' đã nhắc tôi nhập mật khẩu và thay vì mật khẩu mặc định tôi đã đặt mật khẩu gốc.
AmirHd

2
@authentictech thật không may, không có giải pháp được đề xuất nào phù hợp với tôi tại thời điểm câu hỏi này được đăng. Xin vui lòng xem câu trả lời của riêng tôi đã giúp tôi thoát khỏi tình huống này. Đó là lý do tôi không đánh dấu bất kỳ câu hỏi nào trong số đó là câu trả lời. Có lẽ tôi có thể đánh dấu câu trả lời xếp hạng cao nhất là câu trả lời.
Ali

Câu trả lời:


441

Bạn có thể có một người dùng ẩn danh ''@'localhost'hoặc ''@'127.0.0.1'.

Theo hướng dẫn :

Khi có thể kết hợp nhiều trận đấu, máy chủ phải xác định sử dụng chúng trong số chúng. Nó giải quyết vấn đề này như sau: (...)

  • Khi một máy khách cố gắng kết nối, máy chủ sẽ xem qua các hàng [của bảng mysql.user] theo thứ tự được sắp xếp.
  • Máy chủ sử dụng hàng đầu tiên khớp với tên máy chủ và tên người dùng của máy khách.

(...) Máy chủ sử dụng quy tắc sắp xếp theo thứ tự các hàng có giá trị Máy chủ cụ thể nhất trước tiên . Tên máy chủ bằng chữ [chẳng hạn như 'localhost'] và địa chỉ IP là cụ thể nhất.

Do đó, một người dùng ẩn danh như vậy sẽ "che dấu" bất kỳ người dùng nào khác như '[any_username]'@'%'khi kết nối localhost.

'bill'@'localhost'không khớp 'bill'@'%', nhưng sẽ khớp (vd)''@'localhost' trước.

Giải pháp được đề xuất là bỏ người dùng ẩn danh này (đây thường là một việc nên làm).


Các chỉnh sửa dưới đây hầu hết không liên quan đến câu hỏi chính. Đây chỉ là để trả lời một số câu hỏi trong các ý kiến ​​khác trong chủ đề này.

Chỉnh sửa 1

Xác thực như 'bill'@'%'thông qua một ổ cắm.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Chào mừng bạn đến với màn hình MySQL (...)

    mysql người dùng CHỌN, lưu trữ TỪ mysql.user;
    + ------ + ----------- +
    | người dùng | máy chủ |
    + ------ + ----------- +
    | hóa đơn | % |
    | root | 127.0.0.1 |
    | root | :: 1 |
    | root | lưu trữ cục bộ |
    + ------ + ----------- +
    4 hàng trong bộ (0,00 giây)

    mysql CHỌN NGƯỜI DÙNG (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | NGƯỜI DÙNG () | HIỆN TẠI_USER () |
    + ---------------- + ---------------- +
    | hóa đơn @ localhost | hóa đơn @% |
    + ---------------- + ---------------- +
    1 hàng trong bộ (0,02 giây)

    mysql HIỂN THỊ BIỂU TƯỢNG THÍCH 'Skip_networking';
    + ----------------- + ------- +
    | Biến_ame | Giá trị |
    + ----------------- + ------- +
    | bỏ qua mạng | TRÊN |
    + ----------------- + ------- +
    1 hàng trong bộ (0,00 giây)

Chỉnh sửa 2

Chính xác thiết lập tương tự, ngoại trừ tôi kích hoạt lại mạng và bây giờ tôi tạo một người dùng ẩn danh ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Chào mừng bạn đến với màn hình MySQL (...)

    mysql TẠO NGƯỜI DÙNG '' @ 'localhost' được xác định bởi 'otherpass';
    Truy vấn OK, 0 hàng bị ảnh hưởng (0,00 giây)

    mys> tạm biệt

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protatio = TCP
    LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protatio = TCP
    LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'bill' @ 'localhost' (sử dụng mật khẩu: CÓ)

Chỉnh sửa 3

Tình trạng tương tự như trong chỉnh sửa 2, hiện cung cấp mật khẩu người dùng ẩn danh.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Chào mừng bạn đến với màn hình MySQL (...)

    mysql CHỌN NGƯỜI DÙNG (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | NGƯỜI DÙNG () | HIỆN TẠI_USER () |
    + ---------------- + ---------------- +
    | hóa đơn @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 hàng trong bộ (0,01 giây)

Kết luận 1, từ chỉnh sửa 1: Người ta có thể xác thực như 'bill'@'%'thông qua một ổ cắm.

Kết luận 2, từ chỉnh sửa 2: 'something'@'localhost'Rõ ràng một người kết nối qua TCP hoặc qua ổ cắm không có tác động đến quá trình xác thực (ngoại trừ người ta không thể kết nối như bất kỳ ai khác nhưng thông qua ổ cắm, rõ ràng).

Kết luận 3, từ chỉnh sửa 3: Mặc dù tôi đã chỉ định -ubill, tôi đã được cấp quyền truy cập với tư cách là người dùng ẩn danh. Điều này là do "quy tắc sắp xếp" được khuyên ở trên. Lưu ý rằng trong hầu hết các cài đặt mặc định, không có mật khẩu, người dùng ẩn danh tồn tại (và cần được bảo mật / xóa).


9
Đối với bất kỳ ai tò mò về lý do tại sao 'bill' @ 'localhost' khớp với '' @ 'localhost' như tôi, một chuỗi trống thực sự hoạt động một thẻ hoang dã trong thuật toán xác thực của MySQL.
Trưởng khoa hoặc

2
@Sanja Hãy cẩn thận hơn với cách giải quyết này. Bạn có thể cho phép truy cập ẩn danh vào cơ sở dữ liệu của bạn từ bất kỳ vị trí nào. Trong trường hợp nghi ngờ, tôi muốn xóa người dùng.
RandomSeed

7
@RandomSeed Cảm ơn bạn đã nhận xét này! Có lẽ tôi chỉ nên xóa người dùng ẩn danh. PS Tôi đã tìm thấy dev.mysql.com/doc/refman/5.1/en/default-priv đặc biệt.html nói rằng những người dùng này chắc chắn có thể bị xóa : DROP USER ''@'localhost';. Chúng không cần thiết cho một số mục đích đặc biệt.
Alex

1
Tôi đã bỏ người dùng ẩn danh, nhưng mọi thứ vẫn không hoạt động. Sau đó, tôi thấy rằng tôi cũng cần phát hành "QUYỀN RIÊNG TƯ". Nó cũng sẽ hữu ích để đề cập đến điều đó.
Neeme Praks

2
Đây là câu trả lời! Tại sao điều này không có chữ in hoa đậm trong mỗi hướng dẫn sử dụng mysql. XÓA BẤT CỨ NGƯỜI DÙNG NÀO HOẶC NÓ SILL GIẾT TẤT CẢ NHỮNG Ý KIẾN CỦA BẠN ĐỂ ĐĂNG NHẬP TỪ ĐỊA PHƯƠNG!
Sergei

140

Thử:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

10
Điều này khá nguy hiểm, nếu ai đó hack tài khoản mysql hóa đơn @ localhost của bạn, anh ta sẽ có quyền truy cập vô hạn vào tất cả các cơ sở dữ liệu của máy chủ mysql của bạn.
Adonis K. Kakoulidis

2
Ai đó Tôi đã phải đặt trích dẫn xung quanh người dùng của mình 'myusername'@'myhost.static.myip.com' sau đó nó hoạt động.
uốn cong

Điều đó hiệu quả với tôi nhưng tôi sợ tôi đã trao quá nhiều đặc quyền cho người dùng
Csaba Toth

1
@CsabaToth bạn đã làm, giảm các đặc quyền một lần nữa cho đến khi người dùng của bạn có những gì anh ta cần và không còn nữa.
jwenting

... Và bạn sẽ làm gì nếu điều này mang lại cho bạn "Truy cập bị từ chối cho người dùng 'root' @ 'localhost' (sử dụng mật khẩu: CÓ)"?
Grunion Shaftoe

76

Khi bạn chạy

mysql -u bill -p

và đã nhận được lỗi này

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

mysqld đang mong đợi bạn kết nối như bill@localhost

Hãy thử tạo bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Nếu bạn muốn kết nối từ xa, bạn phải chỉ định tên DNS, IP công cộng hoặc 127.0.0.1 bằng TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Khi bạn đăng nhập, xin vui lòng chạy này

SELECT USER(),CURRENT_USER();

USER () báo cáo cách bạn đã cố xác thực trong MySQL

CURRENT_USER () báo cáo cách bạn được phép xác thực trong MySQL từ bảng mysql.user

Điều này sẽ cung cấp cho bạn cái nhìn rõ hơn về cách thức và lý do bạn được phép đăng nhập vào mysql. Tại sao quan điểm này quan trọng để biết? Nó phải làm với giao thức đặt hàng xác thực người dùng.

Dưới đây là một ví dụ: Tôi sẽ tạo một người dùng ẩn danh trên máy tính để bàn MySQL của tôi

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK xem tôi đăng nhập như người dùng ẩn danh:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

Đặt hàng xác thực là rất nghiêm ngặt. Nó kiểm tra từ cụ thể nhất đến ít nhất. Tôi đã viết về phong cách xác thực này trong DBA StackExchange .

Đừng quên gọi TCP một cách rõ ràng là giao thức cho máy khách mysql khi cần thiết.


1
'bill'@'localhost'Có nên khớp 'bill@%'không?
RandomSeed

@Yak thứ tự sắp xếp không chỉ dựa trên cột người dùng của mysql.us. MySQL không thực hiện bất kỳ ký tự khớp nào. Tôi đã viết về giao thức đặt hàng xác thực người dùng trong DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMyQueryDBA

@YaK Đây là lý do tại sao tôi đặc biệt đề cập SELECT USER(),CURRENT_USER();. Bạn gần như không bao giờ thấy người dùng ẩn danh xuất hiện từ hai chức năng này ngoại trừ trong các thiết lập thực sự kém.
RolandoMySQLDBA

1
Tôi không bao giờ giả định thứ tự sắp xếp chỉ dựa trên mysql.user. Trong thực tế, nếu bạn đọc lại câu trả lời của tôi, bạn sẽ thấy rằng tôi đã nói (thực ra, hướng dẫn nói) thứ tự sắp xếp dựa trên hostcột đầu tiên. Bạn đã viết rất nhiều về cách kiểm tra thông tin đăng nhập hiện tại của bạn, nhưng tôi thấy ít thông tin về lý do tại sao 'bill'@'localhost'không thể đăng nhập như 'bill'@'%', đó là câu hỏi ngày nay AFAIK. OP có thể có một thiết lập kém, đây là lý do tại sao anh ta gặp những lỗi này.
RandomSeed

2
--protocol=TCPlà chìa khóa Cảm ơn rât nhiều!
lfx

22

Quá muộn

Tôi đã thử tất cả các câu trả lời khác và chạy nhiều phiên bản khác nhau mysql -u root -pnhưng không bao giờ chạy


mysql -u root -p

Và chỉ cần nhấn [ENTER]cho mật khẩu.


Một khi tôi đã làm điều đó nó làm việc. Hy vọng điều này sẽ giúp được ai đó.


18

Một vấn đề liên quan trong trường hợp của tôi là cố gắng kết nối bằng cách sử dụng:

mysql -u mike -p mypass

Khoảng trắng IS rõ ràng được cho phép giữa -u # uname # nhưng KHÔNG nằm giữa -p và # password #

Do đó cần thiết:

mysql -u mike -pmypass

Mặt khác, với khoảng trắng giữa -p mypass, mysql lấy 'mypass' làm tên db


1
hoặc: mysql -u usrname -p - điều này ngăn bất kỳ ai nhìn thấy mật khẩu vì nó sẽ bỏ một dòng mới và yêu cầu mật khẩu mà không hiển thị nó

câu trả lời tuyệt vời @mstram
Arpit Solanki

1
giải pháp này rất thoải mái, tuy nhiên việc nhập mật khẩu rõ ràng là không an toàn, nhưng không cần đặc quyền cấp loại và xác định các nội dung khác. Vì vậy, nếu cuốn sách mac của bạn được bảo mật - cách tiếp cận này rất thoải mái, thậm chí nhiều hơn tôi đã sử dụng nó để nhập dữ liệu vào aws từ trình điều khiển myser docker.
dimpiax

17

Khi bạn nhập mysql -u root -p, bạn đang kết nối với máy chủ mysql qua ổ cắm unix cục bộ.

Tuy nhiên, khoản trợ cấp bạn đã cấp, 'bill'@'%'chỉ phù hợp với các kết nối TCP / IP.

Nếu bạn muốn cấp quyền truy cập vào ổ cắm unix cục bộ, bạn cần cấp các đặc quyền cho 'bill' @ 'localhost', điều này đủ gây tò mò không giống như 'bill'@'127.0.0.1'

Bạn cũng có thể kết nối bằng TCP / IP với máy khách dòng lệnh mysql, để phù hợp với các đặc quyền bạn đã cấp, ví dụ: chạy mysql -u root -p -h 192.168.1.123hoặc bất kỳ địa chỉ IP cục bộ nào mà hộp của bạn có.


"'bill' @ '%' chỉ khớp với các kết nối TCP / IP" Điều này sai. Hãy dùng thử trong trường hợp sạch sẽ (nguyên bản, ngoài skip-networking
luồng

@YaK Tôi không thể khiến 'người dùng' @ '%' hoạt động trong một thiết lập như vậy, ý bạn là gì đã xảy ra?
số

Tôi có thể kết nối dưới dạng 'bill' @ '%' trên phiên bản 5.0 mà không cần kết nối mạng (do đó, thông qua một ổ cắm). Phiên bản nào bạn đang sử dụng? Tôi sẽ thử nó trên v5.5.
RandomSeed

Xin vui lòng xem câu trả lời cập nhật của tôi. Tôi đã có thể đăng nhập như 'bill'@'%'thông qua một ổ cắm trên v5.5.
RandomSeed

17

Nếu bạn quên mật khẩu hoặc bạn muốn sửa đổi mật khẩu của mình. Bạn có thể làm theo các bước sau:

1: dừng mysql của bạn

[root @ maomao ~] # dịch vụ mysqld dừng
Dừng MySQL: [OK]

2: sử dụng Tiếng Việt --skip-Grant-bảng để khởi động lại mysql

[root @ mcy400 ~] # mysqld_safe --skip-Grant-bảng
[root @ cy400 ~] # Bắt đầu trình nền mysqld với cơ sở dữ liệu từ / var / lib / mysql

3: mở một cửa sổ mới và nhập root mysql -u

[root @ cy400 ~] # mysql -u root
Chào mừng bạn đến với màn hình MySQL. Các lệnh kết thúc bằng; hoặc \ g.

4: thay đổi cơ sở dữ liệu người dùng

mysql sử dụng mysql
Đọc thông tin bảng để hoàn thành tên bảng và cột Bạn có thể tắt tính năng này để khởi động nhanh hơn với -A Cơ sở dữ liệu đã thay đổi

5: sửa đổi mật khẩu của bạn, mật khẩu mới của bạn sẽ được nhập vào ")"

mysql cập nhật người dùng đặt mật khẩu = mật khẩu ('root123') trong đó user = 'root';
Truy vấn OK, 3 hàng bị ảnh hưởng (0,00 giây)
Hàng khớp: 3 Thay đổi: 3 Cảnh báo: 0

6: tuôn ra

mysql tuôn ra đặc quyền;

7: bỏ

mysql thoát khỏi
tạm biệt

8: khởi động lại mysql

[root @ cy400 ~] # khởi động lại dịch vụ mysqld;
Dừng MySQL: [OK]
Bắt đầu MySQL: [OK]

Bingo Bạn có thể kết nối cơ sở dữ liệu của mình với tên người dùng và mật khẩu mới:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye

1
Điều này đã giúp tôi, nhưng trên mac nếu bạn cài đặt với homebrew mysql.server stop. Trong trường hợp của tôi, tôi không thể cập nhật cột người dùng vì không có cột nào; cũng không thể tạo một vì nó ở chế độ an toàn. Đối với những gì tôi đang làm bây giờ tôi không quan tâm, nhưng tôi thực sự đánh giá cao câu trả lời định dạng này với đầu vào và đầu ra chính xác được hiển thị. cảm ơn!
szeitlin

Tôi xin lỗi, tôi chưa bao giờ sử dụng mac trước đây. Vì vậy, tôi không thể giúp bạn.
Li Yingjun

15

Hãy tự cứu mình khỏi cơn đau đầu CHÍNH ... Vấn đề của bạn có thể là bạn đang thiếu các trích dẫn xung quanh mật khẩu. Ít nhất đó là trường hợp của tôi đã đi đường vòng trong 3 giờ.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Tìm kiếm "Đây là một tệp tùy chọn người dùng thông thường:" và xem ví dụ họ nêu trong đó. Chúc may mắn, và tôi hy vọng sẽ cứu người khác một thời gian.


1
Cảm ơn vì điều này. Tôi đã lãng phí một nửa ngày cho việc này và những trích dẫn ngu ngốc xung quanh mật khẩu đã làm nên chuyện!
chàng trai từ

Haha. Tôi đã lãng phí khá nhiều như vậy khi nó xảy ra với tôi. Vinh dự khi được giup bạn.
mimoralea

12

Giải pháp là xóa người dùng ẩn danh (Bất kỳ)!

Tôi cũng gặp phải vấn đề tương tự trên thiết lập máy chủ bởi người khác. Tôi thường không chọn tạo một người dùng ẩn danh khi cài đặt MySQL, vì vậy đã không nhận thấy điều này. Ban đầu tôi đăng nhập với tư cách là người dùng "root" và tạo ra một vài người dùng "bình thường" (còn gọi là người dùng chỉ có đặc quyền trên dbs với tên người dùng là tiền tố), sau đó đăng xuất, sau đó tiếp tục xác minh người dùng bình thường đầu tiên. Tôi không thể đăng nhập. Không thông qua phpMyAdmin, cũng như qua shell. Hóa ra, thủ phạm là người dùng "Bất kỳ" này.


11

Tôi đã gặp một vấn đề tương tự - trong lần thử đầu tiên vào MySQL, vì rootnó đã cho tôi quyền truy cập bị từ chối. Hóa ra tôi quên sử dụng sudo...

Vì vậy, nếu bạn thất bại trong rootlần thử đầu tiên, hãy thử:

sudo mysql -u root -p

và sau đó nhập mật khẩu của bạn, điều này sẽ làm việc.


6

Giải pháp tốt nhất tôi tìm thấy cho mình là.

Người dùng của tôi là sonar và bất cứ khi nào tôi cố gắng kết nối với cơ sở dữ liệu của mình từ bên ngoài hoặc máy khác, tôi sẽ gặp lỗi như

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

Ngoài ra, khi tôi đang thử điều này từ một máy khác và thông qua công việc của Jenkins, URL của tôi để truy cập là

alm-lt-test.xyz.com

nếu bạn muốn kết nối từ xa, bạn có thể chỉ định nó theo các cách khác nhau như sau:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Để truy cập URL này, bạn chỉ cần thực hiện truy vấn sau.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';

4

Được rồi, tôi không chắc nhưng có lẽ đây là tập tin my.cnf trong thư mục cài đặt mysql là thủ phạm. Nhận xét dòng này và vấn đề có thể được giải quyết.

bind-address = 127.0.0.1

1
Để biết thêm chi tiết, bạn cũng có thể xem trang này cũng như wiki.bitnami.org/Components/MySQL
Ali

1
Tôi khá chắc chắn rằng đây không phải là vấn đề. Nếu đúng như vậy, MySQL sẽ từ chối các kết nối từ bất kỳ máy chủ nào khác ngoài 127.0.0.1 và bạn sẽ không gặp phải lỗi 'Truy cập bị từ chối' của SQL.
Pellmeister

3

Chỉ muốn cho bạn biết một trường hợp bất thường tôi đã nhận được lỗi tương tự. Có lẽ điều này sẽ giúp ai đó trong tương lai.

Tôi đã phát triển một vài khung nhìn cơ bản, được tạo ra tại địa điểm phát triển và chuyển chúng đến nơi sản xuất. Cuối tuần đó tôi đã thay đổi một tập lệnh PHP và tất cả các lỗi bất ngờ đã xuất hiện rằng Access đã bị từ chối đối với người dùng 'local-web-user' @ 'localhost'. Đối tượng nguồn dữ liệu không thay đổi, vì vậy tôi tập trung vào người dùng cơ sở dữ liệu trong MySQL, trong khi chờ đợi ai đó đã hack trang web của tôi. May mắn là phần còn lại của trang web dường như không hề hấn gì.

Sau đó hóa ra các quan điểm là thủ phạm. Chuyển đối tượng của chúng tôi được thực hiện bằng cách sử dụng người dùng khác (và từ xa: admin @ ip-address) so với người dùng trang web địa phương. Vì vậy, các chế độ xem được tạo với 'admin' @ 'địa chỉ ip' làm công cụ giải mã. Mặc định tạo chế độ xem AN NINH là

SQL SECURITY DEFINER

Khi người dùng web cục bộ cố gắng sử dụng chế độ xem, nó sẽ vấp phải các đặc quyền thiếu của bộ khử để sử dụng các bảng. Khi bảo mật được đổi thành:

SQL SECURITY INVOKER

vấn đề đã được giải quyết. Vấn đề thực tế hoàn toàn khác so với dự đoán dựa trên thông báo lỗi.


1
Điều này cuối cùng cũng là nguồn gốc của vấn đề của tôi - một quan điểm với một "definer" bị thiếu. Một cách nhanh chóng để tìm hiểu xem đây có phải là điều đang xảy ra với bạn hay không là thử truy vấn cùng bảng hoặc xem dưới dạng root - nếu bạn làm như vậy, thông báo lỗi sẽ chuyển sang mô tả "ERROR 1449 (HY000) mô tả nhiều hơn definer không tồn tại ".
Joshua Davies

3

Đó là một sự khác biệt giữa:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Kiểm tra nó:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

Lệnh

mysql -u bill -p

truy cập ngầm định đến 'bill' @ 'localhost' và KHÔNG đến 'bill' @ '%'.

Không có quyền cho 'bill' @ 'localhost'

bạn nhận được lỗi:

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

giải quyết vấn đề:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;

Tuyên bố cấp đã trả lại một lỗi. Tôi cần chỉ định một cơ sở dữ liệu như vậy: cấp tất cả các đặc quyền trên newdb. * Cho ....
LeBird

3

Điều này cũng xảy ra khi mật khẩu của bạn chứa một số ký tự đặc biệt như @, $, v.v. Để tránh tình trạng này, bạn có thể bọc mật khẩu trong dấu ngoặc đơn:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Hoặc thay vào đó không sử dụng mật khẩu trong khi nhập. Để trống và sau đó gõ nó khi thiết bị đầu cuối yêu cầu. Đây là cách được đề nghị.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>

3
Đây thực sự có thể là một vấn đề (như nó là cho tôi). Tất cả mật khẩu của tôi cho bất kỳ tài khoản nào của tôi đều được tạo bằng pwgen. Hôm nay tôi đã tạo một cái mới cho cơ sở dữ liệu MySQL và người dùng của nó. Thật không may, mật khẩu chứa dấu gạch chéo ngược "\" mà tôi không xác định là nguồn gốc lỗi (tôi thậm chí không nghĩ về điều đó). Vì vậy, tôi đã tìm kiếm hàng giờ một giải pháp. Sau khi đặt mật khẩu thành "123" trong tuyệt vọng, đăng nhập cuối cùng đã hoạt động. Người dùng cần lưu ý rằng một số ký tự đặc biệt có thể gây ra sự cố do MySQL không hiển thị bất kỳ cảnh báo nào về việc sử dụng mật khẩu, chẳng hạn như "daiy4ha4in7chooshuiphie \ Th * aew".
Arvid

1
Đã chuẩn bị đăng bài này dưới dạng câu trả lời nếu nó chưa xuất hiện, nó chỉ đơn giản là quá xa danh sách để tôi chú ý (vì vậy tôi sẽ tăng nó lên +1)
Assimilater

3

Đối với tôi, vấn đề này là do một tính năng mới của MySQL 5.7.2: usercác mục bị bỏ qua nếu plugintrường của chúng trống.

Đặt nó thành ví dụ mysql_native_passwordđể kích hoạt chúng:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Xem ghi chú phát hành cho MySQL 5.7.2 , trong «Ghi chú xác thực».

Vì một số lý do (có thể do băm mật khẩu trước 4.1 của tôi đã bị xóa), mysql_upgradetập lệnh không đặt giá trị plugin mặc định.

Tôi phát hiện ra bằng cách nhận thấy thông báo cảnh báo sau trong /var/log/mysql/error.log:

[Cảnh báo] Mục nhập của người dùng 'foo' @ '%' có giá trị plugin trống. Người dùng sẽ bị bỏ qua và không ai có thể đăng nhập với người dùng này nữa.

Tôi đăng câu trả lời này lên đây để có thể cứu ai đó sử dụng cùng một lượng thời gian vô lý về điều này như tôi đã làm.


2

Không chắc chắn liệu có ai khác sẽ thấy điều này hữu ích không, nhưng tôi đã gặp phải lỗi tương tự và tìm kiếm khắp nơi cho bất kỳ người dùng ẩn danh nào ... và không có gì cả. Vấn đề cuối cùng là tài khoản người dùng đã được đặt thành "Yêu cầu SSL" - mà tôi đã tìm thấy trong PHPMyAdmin bằng cách truy cập Tài khoản người dùng và nhấp vào Chỉnh sửa đặc quyền cho người dùng. Ngay khi tôi bỏ chọn tùy chọn này, mọi thứ đã hoạt động như mong đợi!


2

Tóm tắt gỡ lỗi

  • Kiểm tra lỗi đánh máy: tên người dùng hoặc mật khẩu.
  • Kiểm tra tên máy chủ và so sánh nó với tên máy chủ bảng mysql.user.
  • Kiểm tra người dùng có tồn tại hay không.
  • Kiểm tra xem máy chủ chứa địa chỉ IP hoặc tên máy chủ.

Có một cơ hội tuyệt vời rằng, bạn có thể đã gặp phải vấn đề này nhiều lần trong công việc của bạn. Vấn đề này xảy ra với tôi hầu hết các lần do nhập sai tên người dùng hoặc mật khẩu. Mặc dù đây là một trong những lý do, có nhiều cơ hội khác bạn có thể gặp phải vấn đề này. Đôi khi, nó trông rất giống nhau, nhưng khi bạn đào sâu hơn, bạn sẽ nhận ra nhiều yếu tố góp phần gây ra lỗi này. Bài đăng này sẽ giải thích chi tiết, hầu hết các lý do phổ biến và làm việc xung quanh để khắc phục vấn đề này.

Lý do có thể:

  • Trường hợp 1: Lỗi Typo: tên người dùng hoặc mật khẩu.

Đây là lý do phổ biến nhất cho lỗi này. Nếu bạn nhập sai tên người dùng hoặc mật khẩu, chắc chắn bạn sẽ gặp lỗi này.

Giải pháp:

Giải pháp cho loại lỗi này rất đơn giản. Chỉ cần nhập tên người dùng và mật khẩu chính xác. Lỗi này sẽ được giải quyết. Trong trường hợp nếu bạn quên mật khẩu, bạn có thể đặt lại tên người dùng / mật khẩu. Nếu bạn quên mật khẩu cho tài khoản admin / root, có nhiều cách để thiết lập lại / lấy lại mật khẩu root. Tôi sẽ xuất bản một bài viết khác về cách đặt lại mật khẩu gốc trong trường hợp nếu bạn quên mật khẩu root.

  • Trường hợp 2: Truy cập từ máy chủ sai.

MySQL cung cấp hạn chế dựa trên máy chủ để truy cập người dùng như một tính năng bảo mật. Trong môi trường sản xuất của chúng tôi, chúng tôi thường chỉ giới hạn yêu cầu truy cập đối với các máy chủ Ứng dụng. Tính năng này thực sự hữu ích trong nhiều kịch bản sản xuất.

Giải pháp:

Khi bạn đối mặt với loại vấn đề này, trước tiên hãy kiểm tra xem máy chủ của bạn có được phép hay không bằng cách kiểm tra bảng mysql.user. Nếu nó không được xác định, bạn có thể cập nhật hoặc chèn bản ghi mới vào bảng mysql.user. Nói chung, truy cập như một người dùng root từ máy từ xa bị vô hiệu hóa và đó không phải là cách tốt nhất, vì những lo ngại về bảo mật. Nếu bạn có yêu cầu truy cập máy chủ của mình từ nhiều máy, chỉ cấp quyền truy cập vào các máy đó. Tốt hơn là không sử dụng ký tự đại diện (%) và cung cấp quyền truy cập phổ quát. Hãy để tôi cập nhật bảng mysql.user, bây giờ trình gỡ lỗi có thể truy cập máy chủ MySQL từ bất kỳ máy chủ nào.

  • Trường hợp 3: Người dùng không tồn tại trên máy chủ.

Loại lỗi này xảy ra khi người dùng mà bạn đang cố truy cập không tồn tại trên máy chủ MySQL.

Các giải pháp:

Khi bạn đối mặt với loại vấn đề này, chỉ cần kiểm tra xem người dùng có tồn tại trong bảng mysql.user hay không. Nếu hồ sơ không tồn tại, người dùng không thể truy cập. Nếu có yêu cầu cho người dùng đó truy cập, hãy tạo một người dùng mới với tên người dùng đó.

  • Trường hợp 4: Trộn các máy chủ dựa trên số và tên.

Điểm quan trọng

  • Không nên sử dụng ký tự đại diện trong khi xác định máy chủ người dùng, hãy thử sử dụng tên máy chủ chính xác.

  • Vô hiệu hóa đăng nhập root từ máy từ xa.

  • Sử dụng khái niệm người dùng proxy.

Có một vài khái niệm khác liên quan đến chủ đề này và đi vào chi tiết về những chủ đề đó là phạm vi rất khác nhau của bài viết này. Chúng tôi sẽ xem xét các chủ đề liên quan sau đây trong các bài viết sắp tới.

  • Phải làm gì nếu bạn quên mật khẩu root trong máy chủ MySQL.
  • Các vấn đề đặc quyền của Access Access và các bảng liên quan đến người dùng.
  • Tính năng bảo mật MySQL với thực tiễn tốt nhất.

Tôi hy vọng bài đăng này sẽ giúp bạn khắc phục Mã lỗi 1045 Truy cập bị từ chối cho người dùng trong MySQL.


2

Tôi hy vọng bạn đã không gây ra nhiều thiệt hại hơn bằng cách xóa người dùng debian-sys-duy trì trong mysql

Có daemon mysql của bạn chạy theo cách bình thường. Bắt đầu máy khách mysql của bạn như hiển thị bên dưới

mysql -u debian-sys-maint -p

Trong một thiết bị đầu cuối khác, cattập tin /etc/mysql/debian.cnf. Tập tin đó chứa mật khẩu; dán mật khẩu đó khi được nhắc cho nó.

http://ubuntuforums.org/showthread.php?t=1836919


2

Tôi phát hiện ra một trường hợp khác xuất hiện trên bề mặt là trường hợp cạnh; Tôi có thể xuất sang hệ thống tệp, thông qua CHỌN VÀO .. OUTFILE với quyền root, nhưng không phải là người dùng thông thường. Mặc dù đây có thể là vấn đề về quyền, tôi đã xem xét điều đó và không thấy gì đặc biệt rõ ràng. Tất cả những gì tôi có thể nói là việc thực hiện truy vấn như một người dùng thông thường có tất cả các quyền trên cơ sở dữ liệu được đề cập sẽ trả về lỗi từ chối truy cập dẫn tôi đến chủ đề này. Khi tôi tìm thấy bản sao của việc sử dụng thành công CHỌN RA VÀO RA NGOÀI trong một dự án cũ, tôi nhận thấy rằng tôi đã đăng nhập bằng root. Chắc chắn, khi tôi đăng nhập bằng root, truy vấn chạy như mong đợi.


1

Cập nhật: Trên v8.0.15 (có thể là phiên bản này)PASSWORD() chức năng không hoạt động.

Bạn phải:

  1. Hãy chắc chắn rằng bạn đã dừng MySQL trước.
  2. Chạy máy chủ ở chế độ an toàn với bỏ qua đặc quyền: sudo mysqld_safe --skip-grant-tables
  3. Đăng nhập: mysql -u root
  4. mys> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mys> FLUSH PRIVILEGES;
  6. mys> exit;
  7. Đăng nhập lại: mysql -u root
  8. mys> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';

0

Khi bạn chạy mysql -u bill -p, localhostđược phân giải thành ip của bạn, vì nó là 127.0.0.1 và trong /etc/hoststệp của bạn , như mặc định 127.0.0.1 localhosttồn tại. Vì vậy, mysql thông dịch cho bạn như bill@localhostkhông được cấp bill@'%'. Đây là lý do tại sao có 2 bản ghi khác nhau cho rootngười dùng trong kết quả củaselect host, user from mysql.user; truy vấn.

Có hai cách để xử lý vấn đề này.

Một là chỉ định một ip không được giải quyết ngược lại bằng /etc/hoststệp khi bạn cố gắng đăng nhập. Ví dụ, ip của máy chủ là 10.0.0.2. Khi bạn chạy lệnh mysql -u bill -p -h 10.0.0.2, bạn sẽ có thể đăng nhập. Nếu bạn gõ select user();, bạn sẽ nhận được bill@10.0.0.2. Tất nhiên, bất kỳ tên miền nào không nên được giải quyết với ip này trong /etc/hoststệp của bạn .

Thứ hai, bạn cần cấp quyền truy cập cho tên miền cụ thể này. Đối với bill@localhost, bạn nên gọi lệnh grant all privileges on *.* to bill@localhost identified by 'billpass';. Trong trường hợp này, bạn sẽ có thể đăng nhập bằng lệnh mysql -u bill -p. Sau khi đăng nhập, select user();lệnh trả vềbill@localhost .

Nhưng điều này chỉ dành cho việc bạn cố gắng đăng nhập một máy chủ mysql trong cùng một máy chủ. Từ các máy chủ từ xa, mysql hoạt động như mong đợi, '%' sẽ cấp cho bạn đăng nhập.


0

Tôi đã giải quyết vấn đề này bằng cách xóa các mục nhập 'hóa đơn' của người dùng lỗi cũ (đây là phần quan trọng: cả từ mysql.usermysql.db ), sau đó tạo cùng một người dùng như buồn trước đây:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Đã làm việc, người dùng đang kết nối. Bây giờ tôi sẽ xóa một số ưu tiên khỏi nó :)


0

Tôi gặp lỗi tương tự. Thiết lập không hoạt động như sau:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Các thiết lập được chỉnh sửa dưới đây là một trong đó làm cho nó hoạt động. Chú ý sự khác biệt?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Sự khác biệt là dấu ngoặc kép. Chúng dường như khá quan trọng trong PHP trái ngược với Java và chúng có tác động khi thoát các ký tự, thiết lập URL và bây giờ, truyền tham số cho hàm. Chúng đẹp hơn (tôi biết) nhưng luôn sử dụng các trích dẫn càng nhiều càng tốt, sau đó trích dẫn kép có thể được lồng trong đó nếu cần thiết.

Lỗi này xuất hiện khi tôi kiểm tra ứng dụng của mình trên hộp Linux trái ngược với môi trường Windows.


0

Tôi gặp vấn đề tương tự vì mật khẩu của tôi chứa ";" char phá vỡ mật khẩu của tôi khi tôi tạo nó vào lúc đầu tiên. Thận trọng với điều này nếu có thể giúp bạn.


0

Điều này có thể áp dụng cho rất ít người, nhưng ở đây đi. Đừng sử dụng một câu cảm thán !trong mật khẩu của bạn.

Tôi đã làm và nhận được lỗi trên bằng MariaDB. Khi tôi đơn giản hóa nó thành chỉ số và chữ cái nó hoạt động. Các ký tự khác như @$hoạt động tốt - Tôi đã sử dụng các ký tự đó trong một người dùng khác trên cùng một ví dụ.

Phản hồi thứ năm tại địa chỉ này đã đưa tôi đến bản sửa lỗi của mình.


0

Trên Windows, đây là cách giải quyết:

LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu: NO)

  1. Gỡ cài đặt mysql khỏi bảng điều khiển
  2. Xóa thư mục MySql khỏi C:\Program Files,C:\Program Files (x86)C:\ProgramData
  3. Cài đặt mysql

Đã thử tất cả các câu trả lời khác, cuối cùng đã quyết định thử điều này và nó đã hoạt động!
jasonoriordan

0

Điều này cũng có thể xảy ra nếu MySQL đang chạy trên một hệ điều hành không phân biệt chữ hoa chữ thường, chẳng hạn như Windows.

ví dụ: tôi thấy rằng việc cố gắng kết nối với cơ sở dữ liệu bằng các thông tin đăng nhập này đã thất bại:

mys> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

LRI 1045 (28000): Truy cập bị từ chối đối với người dùng 'Specialuser'@'10.0.1.113' (sử dụng mật khẩu: CÓ)

Nhưng, điều này đã thành công:

mys> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Nhập mật khẩu:



0

Ngày nay! Giải pháp cho :

MySQL ERROR 1045 (28000): Truy cập bị từ chối đối với người dùng 'người dùng' @ 'localhost' (sử dụng mật khẩu: CÓ);

Wamperver 3.2.0 cài đặt mới hoặc nâng cấp

Có lẽ xampsử dụng mariaDBnhư mặc định là tốt.

Wampmáy chủ đi kèm mariaDBvà mysql, và mariaDBcài đặt mặc định trên cổng 3306 và mysql trên 3307, cổng đôi khi là 3308.

Kết nối với mysql!

Khi cài đặt, nó yêu cầu sử dụng mariaDBhoặc MySql, nhưng mariaDB được kiểm tra theo mặc định và bạn không thể thay đổi nó, kiểm tra mysqltùy chọn và cài đặt.

khi cài đặt xong, cả hai sẽ chạy mariaDBtrên cổng mặc định 3306 và mysqltrên cổng khác 3307 hoặc 3308.

Nhấp chuột phải vào wampserverbiểu tượng nơi chạy của nó ở góc dưới bên phải, công cụ goto và xem mysqlcổng chạy chính xác của bạn .

Và bao gồm nó trong kết nối cơ sở dữ liệu của bạn giống như folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Tôi đang sử dụng pdo.

Xem tại đây để biết thêm: https://sourceforge.net/projects/wamperver/


Xin vui lòng không sử dụng backticks để nhấn mạnh. Chúng chỉ nên được sử dụng cho mã. Những từ như MySQL hoặc Wamperver không phải là mã.
Dharman
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.