Cho phép kết nối MySQL từ xa: ERROR 1045 (28000): Truy cập bị từ chối cho người dùng


136

MySQL 5.1.31 chạy trên Windows XP.

Từ máy chủ MySQL cục bộ (192.168.233.142) Tôi có thể kết nối với quyền root như sau:

>mysql --host=192.168.233.142 --user=root --password=redacted

Từ một máy từ xa (192.168.233.163), tôi có thể thấy rằng cổng mysql đang mở:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

Nhưng khi thử kết nối với mysql từ máy từ xa , tôi nhận được:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

Tôi chỉ có 2 mục trong mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

Tôi cần làm gì hơn nữa để cho phép truy cập từ xa?

BIÊN TẬP

Theo đề xuất của Paulo bên dưới, tôi đã thử thay thế mục nhập mysql.user cho% bằng một mục cụ thể IP, vì vậy bảng người dùng của tôi bây giờ trông như thế này:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

Sau đó tôi khởi động lại máy, nhưng vấn đề vẫn còn.

Câu trả lời:


211

Bạn phải đặt cái này làm root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

Trong đó IP là IP bạn muốn cho phép truy cập, USERNAME là người dùng bạn sử dụng để kết nối và PASSWORD là mật khẩu có liên quan.

Nếu bạn muốn cho phép truy cập từ bất kỳ IP nào, chỉ cần đặt %thay vì IP của bạn

và sau đó bạn chỉ phải đặt

FLUSH PRIVILEGES;

Hoặc khởi động lại máy chủ mysql và đó là nó.


Có cách nào để làm điều này mà không cần máy khách mysql cục bộ không?
cmcginty

Làm thế nào để loại bỏ đặc quyền của một ip cụ thể?
Umair Ayub

4
stackoverflow.com/a/21151255/470749 cũng giúp tôi vì tôi đoán cài đặt địa chỉ liên kết của tôi cần được nhận xét. Cấp đặc quyền từ xa là không đủ để làm cho nó hoạt động.
Ryan

8
Không được giải thích trong câu trả lời, nhưng thay thế PASSWORDbằng mật khẩu tài khoản. Tôi đã cố gắng trên chỉ thay đổi USERNAMEIPvà nó đã không làm việc cho tôi cho đến khi tôi đã thay đổi PASSWORD.
Richard Parnaby-King

Sau khi làm điều này, hãy làm theo những gì được nói trong câu trả lời sau đây: stackoverflow.com/a/21151255/445438
budhajeewa 16/1/2015

85

Tôi đã nhận được cùng một lỗi sau khi cấp quyền truy cập từ xa cho đến khi tôi thực hiện điều này:

Từ /etc/mysql/my.cnf

Trong các phiên bản mới hơn của mysql vị trí của tệp là /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(bình luận dòng này: bind-address = 127.0.0.1 :)

Sau đó chạy service mysql restart.


6
Hoặc, thay đổi nó thành bind-address = 0.0.0.0
lolski

2
Chỉ nhận xét bind-addresskhông làm việc cho tôi. Hoặc là bind-address = 0.0.0.0hoặc bind-address = <server_ip>công việc.
chhantyal

58

Theo mặc định, máy chủ MySQL truy cập từ xa bị vô hiệu hóa. Quá trình cung cấp quyền truy cập từ xa cho người dùng là.

  1. Chuyển đến thư mục bin sql của tôi hoặc thêm nó vào PATH
  2. Đăng nhập vào root bằng mysql -uroot -proot (hoặc bất kể mật khẩu gốc là gì.)
  3. Thành công bạn sẽ nhận được mysql>
  4. Cung cấp quyền truy cập tất cả cho người dùng đó.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

Ở đây IP là địa chỉ IP mà bạn muốn cho phép truy cập từ xa, nếu chúng tôi đặt % bất kỳ địa chỉ IP nào cũng có thể truy cập từ xa.

Thí dụ:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

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

Điều này cho một người dùng khác.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

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

Hy vọng điều này sẽ giúp


+1 cho chi tiết xuất sắc, nó thực sự giúp tôi thấy đó 0 rows affectedlà tiêu chuẩn :) Ngoài ra, service mysqld restartđược khuyến nghị ở cuối. [ mysqldđôi khi chỉ là mysql]
Nathan tổng thống

# Lưu ý: Đối với phiên bản 5.6+, hãy sử dụng "cấp tất cả cho ..." (không có đặc quyền)
Nicke Manarin

21

Sự giúp đỡ của Paulo dẫn tôi đến giải pháp. Đó là sự kết hợp của những điều sau đây:

  • mật khẩu chứa ký hiệu đô la
  • Tôi đã cố gắng kết nối từ vỏ Linux

Shell bash coi ký hiệu đô la là một ký tự đặc biệt để mở rộng sang biến môi trường, vì vậy chúng ta cần thoát nó bằng dấu gạch chéo ngược. Ngẫu nhiên, chúng ta không phải làm điều này trong trường hợp ký hiệu đô la là ký tự cuối cùng của mật khẩu.

Ví dụ: nếu mật khẩu của bạn là "pas $ word", từ bash Linux, chúng ta phải kết nối như sau:

# mysql --host=192.168.233.142 --user=root --password=pas\$word

4
Ngoài những điều trên, vui lòng kiểm tra /etc/mysql/my.cnf và bình luận bind-address = 127.0.0.1
Buminda

2
Ngoài ra, người ta có thể sử dụng các trích dẫn duy nhất để ngăn chặn việc mở rộng $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb

'$' trong mật khẩu. Vô giá. Cảm ơn rất nhiều !!
Nagendra Kakarla

Sau khi đập đầu vào màn hình một lúc, tôi tình cờ thấy nó và nó hoạt động. Tôi đã có một ! và @ trong mật khẩu của tôi. Mật khẩu thay đổi, đặc quyền bị xóa và tôi quay lại với nó. Cảm ơn!
AJM

9

Bạn có tường lửa không? đảm bảo rằng cổng 3306 đang mở.

Trên các cửa sổ, theo mặc định, tài khoản gốc mysql được tạo chỉ được phép truy cập từ localhost trừ khi bạn đã chọn tùy chọn cho phép truy cập từ các máy từ xa trong khi cài đặt.

tạo hoặc cập nhật người dùng mong muốn với '%' làm tên máy chủ.

thí dụ :

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';

6
Máy chủ trả lời với "LRI 1045 (28000): Truy cập bị từ chối vì" ... nếu một khối tường lửa sẽ hết thời gian ...
Paulo H.

chỉ muốn đăng đầu tiên. xấu của tôi
Vamsi Krishna B

@Krish - Mọi thứ bạn đề xuất đã được đề cập trong câu hỏi
Mike Chamberlain

5
  1. Hãy thử flush privilegeslại.

  2. Cố gắng khởi động lại máy chủ để tải lại các khoản tài trợ.

  3. Hãy thử tạo một người dùng với máy chủ lưu trữ "192.168.233.163". "%" dường như không cho phép tất cả (thật lạ)


Cảm ơn, tôi đã thử nó nhưng vô ích. Tôi cập nhật câu hỏi với đề xuất của bạn.
Mike Chamberlain

4
Hãy thử tạo một người dùng khác và đừng quên đặt tất cả các khoản tài trợ:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.

4

Trong trường hợp của tôi, tôi đã cố gắng kết nối với một máy chủ mysql từ xa trên cent OS. Sau khi trải qua rất nhiều giải pháp (cấp tất cả các đặc quyền, loại bỏ các ràng buộc ip, cho phép kết nối mạng) vẫn không được giải quyết.

Khi nó bật ra, trong khi xem xét các giải pháp khác nhau, tôi đã bắt gặp iptables, điều đó khiến tôi nhận ra cổng mysql 3306 không chấp nhận kết nối.

Đây là một lưu ý nhỏ về cách tôi đã kiểm tra và giải quyết vấn đề này.

  • Kiểm tra xem cổng có chấp nhận kết nối không:

    telnet (ip máy chủ mysql) [portNo]

  • Thêm quy tắc bảng ip để cho phép kết nối trên cổng:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j CHẤP NHẬN

  • Sẽ không đề xuất điều này cho môi trường sản xuất, nhưng nếu iptables của bạn không được định cấu hình đúng, việc thêm các quy tắc có thể vẫn không giải quyết được vấn đề. Trong trường hợp sau đây nên được thực hiện:

    dịch vụ iptables dừng

Hi vọng điêu nay co ich.


3

nếu bạn đang sử dụng ip động, chỉ cần cấp quyền truy cập vào 192.168.2.% vì vậy bây giờ bạn không phải lo lắng về việc cấp quyền truy cập vào địa chỉ IP của mình mỗi lần.


1

Tôi đã vật lộn với việc đăng nhập từ xa vào MYSQL cho phiên bản Amazon EC2 Linux của tôi. Tìm thấy giải pháp là đảm bảo nhóm bảo mật của tôi bao gồm quy tắc gửi đến cho cổng MySQL 3306 để bao gồm địa chỉ IP của tôi (hoặc 0.0.0.0/0 cho mọi nơi). Ngay lập tức có thể kết nối từ xa ngay khi tôi thêm quy tắc này.


1

Vị trí mới cho tập tin cấu hình mysql là

/etc/mysql/mysql.conf.d/mysqld.cnf

0

Trình điều khiển MySQL ODBC 3.51 là các ký tự đặc biệt trong mật khẩu không được xử lý.

"Cảnh báo - Bạn có thể đau đầu nghiêm trọng với MySQL ODBC 3.51 nếu mật khẩu trong lệnh GRANT của bạn có chứa các ký tự đặc biệt, chẳng hạn như! @ # $% ^ ?. Trình điều khiển ODBC 3.51 ODBC không hỗ trợ các ký tự đặc biệt này trong hộp mật khẩu. Thông báo lỗi duy nhất bạn sẽ nhận được là Truy cập từ chối từ chối (sử dụng mật khẩu: CÓ) "- từ http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/


0

Sự kết hợp người dùng / máy chủ có thể đã được tạo mà không cần mật khẩu.

Tôi đã giả sử rằng khi thêm máy chủ mới cho người dùng hiện tại (sử dụng ứng dụng GUI), mật khẩu hiện tại cũng sẽ được sử dụng cho kết hợp người dùng / máy chủ mới.

Tôi có thể đăng nhập bằng

mysql -u username -p PASSWORD

tại địa phương, nhưng không phải từ IPADDRESS với

mysql -u --host=HOST -p PASSWORD

(Tôi thực sự có thể đăng nhập từ IPADDRESS mà không cần sử dụng mật khẩu)

mysql -u --host=HOST

Đặt mật khẩu cho phép truy cập:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';

1
Cảm ơn bạn, tôi đã dành rất nhiều thời gian để cố gắng kết nối từ xa với máy chủ Mysql của tôi và dòng này đã giúp rất nhiều. Khi đặt mật khẩu của người dùng, tôi đã gặp lỗi ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberdẫn tôi đến bài viết này: knowmysql.blogspot.com/2013/09/NH Sau khi làm theo các bước đó, cuối cùng tôi cũng có thể kết nối với máy chủ.
Andy Forceno
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.