Truy cập root MySQL từ tất cả các máy chủ


152

Tôi đã cài đặt máy chủ MySQL trên máy Ubuntu từ xa. Người rootdùng được định nghĩa trong mysql.userbảng theo cách này:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Tôi có thể truy cập với người dùng roottừ cùng giao diện dòng lệnh máy từ xa bằng mysqlứng dụng khách tiêu chuẩn . Bây giờ tôi muốn cho phép truy cập root từ mọi máy chủ trên internet , vì vậy tôi đã thử thêm hàng sau (đây là bản sao chính xác của hàng đầu tiên từ kết xuất trước đó, ngoại trừ hostcột):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Nhưng khách hàng của tôi trên PC cá nhân vẫn tiếp tục nói với tôi (tôi che khuất IP máy chủ):

Lỗi SQL (2003): Không thể kết nối với máy chủ MySQL trên '46 .xxx '(10061)

Tôi không thể biết đó là lỗi xác thực hay lỗi mạng. Trên tường lửa máy chủ, tôi đã bật cổng 3306 / TCP cho 0.0.0.0/0 và điều đó ổn với tôi ...


bạn có thể telnet đến máy trên cổng 3306
mihaisimi

3
nhiều khả năng daemon MySQL không nghe trên 46.xxx mà chỉ trên localhost. Tìm kiếm bind-addresstrong my.cnf
Maxim Krizhanovsky

1
Vì vậy, world + dog hiện có hàm băm của mật khẩu gốc của bạn, kiến ​​thức mà root có thể truy cập được từ bất kỳ máy chủ nào trên Internet và byte đầu tiên của địa chỉ IP của bạn. Bạn không nghĩ rằng đây chỉ là một nhỏ chút liên quan?
eggyal

có thể trùng lặp với bật Kết nối MySQL từ xa
người dùng

Câu trả lời:


362

Có hai bước trong quy trình đó:

a) Cấp đặc quyền. Khi người dùng root thực thi với thay thế này bằng 'password'mật khẩu gốc hiện tại của bạn:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) liên kết với tất cả các địa chỉ:

Cách dễ nhất là nhận xét dòng trong my.cnftệp của bạn :

#bind-address = 127.0.0.1 

và khởi động lại mysql

service mysql restart

Theo mặc định, nó chỉ liên kết với localhost, nhưng nếu bạn nhận xét dòng thì nó liên kết với tất cả các giao diện mà nó tìm thấy. Nhận xét ra dòng tương đương với bind-address=*.

Để kiểm tra nơi dịch vụ mysql đã liên kết thực thi với quyền root:

netstat -tupan | grep mysql

Cập nhật cho Ubuntu 16:

Tập tin cấu hình là (bây giờ)

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

(ít nhất là trên Ubuntu 16 tiêu chuẩn)


5
Ok, vấn đề là địa chỉ ràng buộc. Cảm ơn bạn. @Darhazer Cảm ơn bạn quá :)
lorenzo-s

2
Để truy vấn các khoản trợ cấp hiện tại: `SHOW GRANTS FOR 'root' @ '%';
robsch

5
Để cũng cho phép root @% cấp quyền cho người dùng khác, ngay sau bước (a) chạy: SỬ DỤNG GRANT ON *. * TO 'root' @ '%' VỚI GRANT OPTION;
Caleb

1
Tệp cấu hình là (ngay bây giờ) /etc/mysql/mysql.conf.d/mysqld.cnf (ít nhất là trên Ubuntu 16 tiêu chuẩn)
jgp

2
Tôi chỉ cần làm điều này, để có thể kết nối từ xa với máy chủ từ xa:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Chạy truy vấn sau:

use mysql;

update user set host='%' where host='localhost'

LƯU Ý: Không khuyến nghị sử dụng cho sản xuất.


2
Đây không phải là giải pháp hoàn hảo. Nó có thể làm việc. Đối với tôi, nó tạo ra một lỗi: ERROR 1062 (23000): Mục nhập trùng lặp '% -root' cho khóa 'PRIMARY'
Scriptlabs

2
@Scriptlabs, rất có thể có nhiều hơn một mục trong bảng người dùng với một loạt 'localhost'. Và nhiều hơn một hàng với root, bao gồm root.localhost, root.127.0.0.1, root.::1. Vì vậy, tốt hơn hết bạn nên thêm một người dùng riêng thay vì cập nhật, đó là lý do tại sao tôi hạ thấp câu trả lời này.
Mike Purcell

4
không phải là QUYỀN RIÊNG TƯ; cũng cần thiết ngay sau đó?
Nom1fan

1
cái này làm việc cho tôi thử cái này. update mysql.user set host='%' where user='root'
nuôi dưỡng zazin


7

MYSQL 8.0 - máy khách dòng lệnh mysql mở
GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost';
sử dụng mysql
CẬP NHẬT mysql.user SET host = '%' WHERE user = 'root';
Khởi động lại dịch vụ mysql


4

MariaDB chạy trên Raspbian - tệp chứa địa chỉ liên kết khó xác định chính xác. MariaDB có một số thông tin không hữu ích về chủ đề này.

Tôi đã sử dụng

# sudo grep -R bind-address /etc 

để xác định vị trí của những thứ chết tiệt.

Tôi cũng đã phải thiết lập các đặc quyền và máy chủ lưu trữ trong mysql như mọi người ở trên đã chỉ ra.

Và cũng có một thời gian vui vẻ khi mở cổng 3306 cho các kết nối từ xa đến Raspberry Pi của tôi - cuối cùng đã sử dụng iptables-kiên trì .

Tất cả các công trình tuyệt vời bây giờ.


1

nếu bạn có nhiều mạng được gắn với hệ điều hành của mình, bạn phải đặc biệt hóa một trong các mạng này trong tệp liên kết bổ sung từ tệp my.conf. một ví dụ:

[mysqld]
bind-address = 127.100.10.234

IP này là từ một cấu hình ethX.


1
Vui lòng thêm chi tiết. Trong tập tin hoặc khung nào mà cài đặt đó cần phải xảy ra? Xin hãy cụ thể hơn về cấu hình ethX.
BPS

1

Trong trường hợp của tôi, cài đặt "địa chỉ liên kết" là vấn đề. Nhận xét cài đặt my.cnfnày không giúp ích gì, vì trong trường hợp của tôi, mysql đã đặt mặc định thành 127.0.0.1 vì một số lý do.

Để xác minh cài đặt nào MySql hiện đang sử dụng, hãy mở dòng lệnh trên hộp cục bộ của bạn:

mysql -h localhost -u myname -pmypass mydb

Đọc các thiết lập hiện tại:

Show variables where variable_name like "bind%"

Bạn sẽ thấy 0.0.0.0 tại đây nếu bạn muốn cho phép truy cập từ tất cả các máy chủ. Nếu đây không phải là trường hợp, hãy chỉnh sửa /etc/mysql/my.cnfvà đặt địa chỉ liên kết trong phần [mysqld]:

bind-address=0.0.0.0

Cuối cùng khởi động lại máy chủ MySql của bạn để chọn cài đặt mới:

sudo service mysql restart

Hãy thử lại và kiểm tra xem cài đặt mới đã được chọn chưa.


-2

mysql_update là những gì bạn cần.

Tôi không biết tại sao mọi người sẽ làm theo những cách phức tạp hơn để khắc phục vấn đề này, khi MySql đã xây dựng một công cụ đã thực hiện điều này ...

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.