Làm thế nào để cho phép kết nối từ xa đến mysql


362

Tôi đã cài đặt MySQL Community Edition 5.5 trên máy cục bộ của mình và tôi muốn cho phép các kết nối từ xa để tôi có thể kết nối từ nguồn bên ngoài.

Làm thế nào tôi có thể làm điều đó?


1
có thể trùng lặp kích hoạt kết nối MySQL từ xa
người dùng

1
Nếu bạn tình cờ sử dụng DigitalOcean, bạn có thể thử sử dụng sudo mysql_secure_installation. FYI.
Alan Dong

Không sử dụng định dạng mã cho văn bản không phải là mã. Đề ra.
Hầu tước Lorne

@EJP tại sao? câu hỏi trung thực vì tò mò
René Roth

Câu trả lời:


776

Điều đó được cho phép theo mặc định trên MySQL.

Những gì bị tắt theo mặc định là roottruy cập từ xa . Nếu bạn muốn kích hoạt điều đó, hãy chạy lệnh SQL này cục bộ:

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

Và sau đó tìm dòng sau và nhận xét nó trong my.cnftệp của bạn , thường xuất hiện /etc/mysql/my.cnftrên các hệ thống Unix / OSX. Trong một số trường hợp, vị trí của tệp là /etc/mysql/mysql.conf.d/mysqld.cnf).

Nếu đó là một hệ thống Windows, bạn có thể tìm thấy nó trong thư mục cài đặt MySQL, thường là một cái gì đó giống như C:\Program Files\MySQL\MySQL Server 5.5\ và tên tệp sẽ là my.ini.

Thay đổi dòng

 bind-address = 127.0.0.1

đến

 #bind-address = 127.0.0.1

Và khởi động lại máy chủ MySQL ( Unix / OSXWindows ) để những thay đổi có hiệu lực.


4
Ok vì vậy tôi đã thêm binnd-address = 127.0.0.1 vào cuối tệp và tôi đã thử kết nối bằng cách sử dụng navicat từ máy chủ bên ngoài và tôi gặp lỗi 10060
Leo

7
Hmm, bạn không cần phải thêm nó. Giống như câu trả lời của tôi đã nói, bạn cần bình luận, không thêm nó. Theo mặc định, có một cái ở đó, vì vậy bạn cần tìm ra nó và nhận xét nó bằng cách thêm tiền tố vào #
mjuarez

7
Hmm, trong \ MYsql Server 5.5 \ chỉ có 1 tệp ini được gọi là my-default.ini và dòng duy nhất không có # là đây: sql_mode = NO_ENGINE_SUBSTITNING, STRICT_TRANS_TABLES
Leo

2
Câu trả lời này hoạt động hoàn hảo. thnx @mjuarez - CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN . ĐẾN 'root' @ '%' được xác định bởi 'mật khẩu' VỚI TÙY CHỌN TỐT;
yadavr

66
Đối với những người tìm kiếm my.cnftệp và không tìm thấy bind-addresschỉ thị trong đó, hãy lưu ý rằng trong trường hợp của tôi (phiên bản MySQL 14,14 trên Ubuntu 16.04.2), vị trí của tệp là/etc/mysql/mysql.conf.d/mysqld.cnf
Ash Menon

49

Sau khi thực hiện tất cả các thao tác trên, tôi vẫn không thể đăng nhập roottừ xa, nhưng Telnetting đến cổng 3306đã xác nhận rằng đó MySQLlà chấp nhận kết nối.

Tôi bắt đầu nhìn vào người dùng trong MySQL và nhận thấy có nhiều người dùng root với các mật khẩu khác nhau.

select user, host, password from mysql.user;

Vì vậy, trong MySQLtôi đặt lại tất cả mật khẩu cho root và cuối cùng tôi có thể đăng nhập từ xa root.

use mysql;
update user set password=PASSWORD('NEWPASSWORD') where User='root';
flush privileges;

4
Chính xác. Trong khi làm theo các bước trong câu trả lời khác, tài khoản người dùng có mật khẩu trống dường như được tạo. Vì vậy, bạn cần thêm mật khẩu cho họ.
chhantyal

1
Tôi cần kết hợp câu trả lời được chấp nhận với câu trả lời này và sau đó mọi thứ hoạt động tốt.
James

8
SQL cho 5.7 trở lênupdate user set authentication_string=password('YOUR_PASSWORD') where user='root';
DalSoft

Câu trả lời được chấp nhận đặt mật khẩu và làm việc cho tôi.
MikeKulls

1
Cảm ơn bạn, giống như @James, tôi đã kết hợp câu trả lời này với câu trả lời được chấp nhận để khắc phục.
Ben Everard

39

Chỉ cần một lưu ý từ kinh nghiệm của tôi, bạn có thể tìm thấy tệp cấu hình theo đường dẫn này /etc/mysql/mysql.conf.d/mysqld.cnf.

(Tôi đã vật lộn một thời gian để tìm thấy con đường này)


1
Điều này phụ thuộc nhiều vào phân phối bạn đang sử dụng. Cách tốt nhất là chỉ tìm kiếm nó:sudo find /etc -iname 'mysql*.cnf'
Martin Konecny

Tôi đánh giá cao lệnh 'tìm'. Tôi mới sử dụng dòng lệnh, vì vậy nó rất hữu ích. Cảm ơn!
Heres2u

Tôi đã vật lộn hàng giờ để chỉnh sửa /etc/mysq/conf.d/mysql.cnf cho đến khi tôi tìm thấy thông báo này.
Gayan Kavirathne

26

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.


17

Vui lòng làm theo các bước được đề cập dưới đây để đặt quyền truy cập từ xa ký tự đại diện cho Người dùng MySQL.

(1) Mở cmd.

(2) điều hướng đến đường dẫn C: \ Program Files \ MySQL \ MySQL Server 5.X \ bin và chạy lệnh này.

gốc mys -u -p

(3) Nhập mật khẩu gốc.

(4) Thực hiện lệnh sau để cung cấp sự cho phép.

CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN *. * ĐẾN 'USERNAME' @ 'IP' được xác định bởi 'PASSWORD';

USERNAME: Tên người dùng bạn muốn kết nối với máy chủ MySQL.

IP: Địa chỉ IP công cộng từ nơi bạn muốn cho phép truy cập vào máy chủ MySQL.

PASSWORD: Mật khẩu của tên người dùng được sử dụng.

IP có thể được thay thế bằng% để cho phép người dùng kết nối từ bất kỳ địa chỉ IP nào.

(5) Xóa sạch các ưu tiên bằng cách thực hiện theo lệnh và thoát.

QUYỀN RIÊNG TƯ;

lối ra; hoặc \ q

nhập mô tả hình ảnh ở đây


3
Sau khi làm điều đó, root của tôi vẫn có quyền truy cập bị từ chối. Tôi đã bỏ lỡ những gì?
teapeng

Bạn có thể thử với Địa chỉ IP hệ thống cục bộ của bạn thay vì% trong bước 4. Nó nên hoạt động. % có nghĩa là bất kỳ Địa chỉ IP nào.
Hiren Parghi

6

Nếu quy trình máy chủ MySQL của bạn chỉ nghe trên 127.0.0.1 hoặc :: 1 thì bạn sẽ không thể kết nối từ xa. Nếu bạn có một bind-addressthiết lập trong/etc/my.cnf đây có thể là nguồn gốc của vấn đề.

Bạn cũng sẽ phải thêm đặc quyền cho một localhostngười không sử dụng.


Thật kỳ lạ, làm thế nào máy chủ của bạn có thể "lắng nghe" trên một IP khác bên cạnh 127.0.0.1?
Pacerier

2
@Pacerier 127.0.0.1 chỉ bị ràng buộc với giao diện loopback. Kết nối bên ngoài sẽ không hoạt động. Một hệ thống thường sẽ có nhiều giao diện mạng, mỗi giao diện cần được ràng buộc cụ thể hoặc bạn có thể sử dụng địa chỉ bind-all 0.0.0.0.
tadman

6

Nếu bạn đã cài đặt MySQL từ brewnó thì thực sự chỉ nghe trên giao diện cục bộ. Để khắc phục rằng bạn cần chỉnh sửa /usr/local/etc/my.cnfvà thay đổi bind-addresstừ 127.0.0.1thành *.

Sau đó chạy brew services restart mysql.


1
Đối với máy chủ Ubuntu 16.04.4 của tôi, cài đặt địa chỉ liên kết nằm trong /etc/mysql/mysql.conf.d/mysqld.cnf
Frank

Đây không chỉ là sử dụng brew, bất kỳ MySQL nào cũng sẽ có cài đặt mặc định này, chỉ cho phép kết nối cục bộ.
nivs1978

6

Tất cả quá trình đăng nhập từ xa. Đăng nhập từ xa bị tắt theo mặc định. Bạn cần mở thủ công cho tất cả ip..để cấp quyền truy cập tất cả ip

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

Ip cụ thể

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

sau đó

flush privileges;

Bạn có thể kiểm tra máy chủ và mật khẩu người dùng của bạn

SELECT host,user,authentication_string FROM mysql.user;

Bây giờ nhiệm vụ của bạn là thay đổi điều này

bind-address = 127.0.0.1

Bạn có thể tìm thấy cái này trên

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

nếu bạn không tìm thấy cái này ở đó thì hãy thử cái này

sudo nano /etc/mysql/my.cnf

bình luận trong này

#bind-address = 127.0.0.1

Sau đó khởi động lại Mysql

sudo service mysql restart

Bây giờ hãy tận hưởng đăng nhập từ xa


3

Chỉ cần FYI tôi đã giải quyết vấn đề này trong nhiều giờ .. cuối cùng tôi đã gọi cho nhà cung cấp dịch vụ lưu trữ của mình và thấy rằng trong trường hợp của tôi sử dụng máy chủ đám mây trong bảng điều khiển cho 1and1, họ có một tường lửa thứ cấp mà bạn phải sao chép và thêm cổng 3306. Sau khi thêm tôi đã vào thẳng ..


Điều này nghe có vẻ rất cụ thể cho tình huống của bạn. Tôi không phải là nguồn kiến ​​thức vô tận trên mạng, nhưng bạn có chắc giải pháp này áp dụng tốt cho vấn đề này không?
Sandy Gifford

2
Tôi cũng có vấn đề này. Phổ biến với các máy chủ được lưu trữ trên đám mây,
Matthew Lock

2

Đối với những người cần nó, hãy kiểm tra cổng tường lửa 3306 cũng đang mở, nếu dịch vụ tường lửa của bạn đang chạy.



1

Và đối với những người dùng OS X, hãy lưu ý rằng tham số địa chỉ liên kết thường được đặt trong danh sách khởi chạy chứ không phải trong tệp my.ini. Vì vậy, trong trường hợp của tôi, tôi loại bỏ <string>--bind-address=127.0.0.1</string>khỏi /Library/LaunchDaemons/homebrew.mxcl.mariadb.plist.


Vị trí thay thế cho tệp plist:~/Library/LaunchAgents
Dylan Nissley

1

Nếu mysqldcó một địa chỉ liên kết được đặt thành loopback / địa chỉ cục bộ (ví dụ 127.0.0.1), máy chủ sẽ không thể truy cập được từ các máy chủ từ xa, vì không thể truy cập giao diện loopback từ bất kỳ máy chủ từ xa nào.

Đặt tùy chọn này thành 0.0.0.0( ::cho IPv4 + 6) để chấp nhận kết nối từ bất kỳ máy chủ nào hoặc đến một địa chỉ có thể truy cập bên ngoài khác nếu bạn muốn chỉ cho phép kết nối trên một giao diện.

Nguồn


0

đôi khi cần sử dụng tên của pc trên windows

Bước đầu tiên) đặt tập tin cấu hình của mysql:

mysqld.cnf SET bind-address = 0.0.0.0

(để cho phép kết nối lại qua tcp / ip)

Bước thứ hai) làm cho người dùng trong mysql, người dùng bảng, với tên của pc trên các giá trị của windows , KHÔNG ip

nhập mô tả hình ảnh ở đây


0

Cho phép truy cập root từ xa có thể nguy hiểm. Sẽ tốt hơn nếu bạn thiết lập tài khoản người dùng với nhiều quyền hạn chế hơn. Ba bước sau đây nên làm điều đó.

  1. Đảm bảo rằng dòng bắt đầu bằng bind-address ...ít nhất được nhận xét trong tệp my.ini hoặc my.cnf của bạn. Nếu nó không tồn tại, di chuyển trên. Bạn có thể tìm thấy tệp này trong C:\ProgramData\MySQL\MySQL Server 8.0Windows.

  2. Sau đó, kiểm tra xem tài khoản người dùng mà bạn đang thiết lập kết nối không có localhosttrong trường Giới hạn đối sánh máy chủ. Mặc dù không được khuyến nghị, thay vào đó, bạn có thể đưa %vào trường đó cho mục đích thử nghiệm. Bạn có thể thực hiện việc này bằng cách mở kết nối cục bộ đến máy chủ bằng MySQL Workbench, sau đó truy cập Máy chủ> Người dùng và Đặc quyền từ thanh menu và tìm tài khoản người dùng bạn muốn kết nối.

Trường "Giới hạn đối sánh máy chủ" là trường không cho phép bạn kết nối không cục bộ. Tức là nó giới hạn các kết nối được chấp nhận cho một mẫu địa chỉ IP. Tốt nhất, bạn nên truy cập máy chủ MySQL từ một địa chỉ IP tĩnh hoặc mạng con, để bạn có thể hạn chế nhất có thể.

  1. Rõ ràng, tường lửa của bạn sẽ cho phép ứng dụng MySQL Server giao tiếp qua cổng bạn muốn. Thiết bị mạng vật lý ở giữa bạn và máy chủ của bạn sẽ cho phép liên lạc trên cổng mà bạn muốn kết nối. (cổng 3306 thường)
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.