วิธีการอนุญาตให้เชื่อมต่อระยะไกลกับ mysql


362

ฉันได้ติดตั้ง MySQL Community Edition 5.5 บนเครื่องของฉันและฉันต้องการอนุญาตการเชื่อมต่อระยะไกลเพื่อให้ฉันสามารถเชื่อมต่อจากแหล่งภายนอก

ฉันจะทำสิ่งนั้นได้อย่างไร


1
เป็นไปได้ที่ซ้ำกันของการเปิดใช้งานการเชื่อมต่อ MySQL ระยะไกล
ผู้ใช้

1
หากคุณเกิดขึ้นกับการใช้ DigitalOcean sudo mysql_secure_installationคุณอาจพยายามที่จะใช้ FYI
Alan Dong

อย่าใช้การจัดรูปแบบรหัสสำหรับข้อความที่ไม่ใช่รหัส ปิดหัวข้อ
มาร์ควิสแห่ง Lorne

@EJP ทำไม คำถามที่ซื่อสัตย์ออกมาจากความอยากรู้อยากเห็น
René Roth

คำตอบ:


776

ที่ได้รับอนุญาตโดยค่าเริ่มต้นใน MySQL

สิ่งที่ถูกปิดใช้งานโดยค่าเริ่มต้นคือrootการเข้าถึงระยะไกล หากคุณต้องการเปิดใช้งานให้เรียกใช้คำสั่ง SQL นี้แบบโลคัล:

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

จากนั้นหาบรรทัดต่อไปนี้และคอมเม้นท์ในmy.cnfไฟล์ของคุณซึ่งโดยปกติแล้วจะอยู่/etc/mysql/my.cnfบนระบบ Unix / OSX ในบางกรณีตำแหน่งของไฟล์คือ /etc/mysql/mysql.conf.d/mysqld.cnf)

หากเป็นระบบ Windows คุณสามารถค้นหาได้ในไดเรกทอรีการติดตั้ง MySQL โดยปกติC:\Program Files\MySQL\MySQL Server 5.5\ แล้วชื่อไฟล์จะเป็นmy.iniเช่นนั้น

เปลี่ยนสาย

 bind-address = 127.0.0.1

ถึง

 #bind-address = 127.0.0.1

และรีสตาร์ทเซิร์ฟเวอร์ MySQL ( Unix / OSXและWindows ) เพื่อให้การเปลี่ยนแปลงมีผล


4
ตกลงดังนั้นฉันได้เพิ่ม binnd อยู่ = 127.0.0.1 ในตอนท้ายของไฟล์และผมได้พยายามที่จะเชื่อมต่อโดยใช้ Navicat จากโฮสต์ภายนอกและฉันได้รับข้อผิดพลาด 10060
สิงห์

7
อืมคุณไม่จำเป็นต้องเพิ่ม เช่นเดียวกับคำตอบของฉันกล่าวว่าคุณต้องแสดงความคิดเห็นไม่เพิ่ม มีหนึ่งในนั้นโดยค่าเริ่มต้นดังนั้นคุณจะต้องค้นหาและแสดงความคิดเห็นโดย prefixing ด้วย #
mjuarez

7
อืมใน \ MYsql Server 5.5 \ มีไฟล์ ini เพียง 1 ไฟล์ที่เรียกว่า my-default.ini และบรรทัดเดียวที่ไม่มี # คือ: sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES
Leo

2
คำตอบนี้ใช้ได้ผลสมบูรณ์ ขอบคุณ @mjuarez - ให้สิทธิ์ทั้งหมดบน ถึง 'รูท' @ '%' ที่ระบุด้วย 'รหัสผ่าน' ด้วยตัวเลือกแกรนต์
yadavr

66
สำหรับผู้ที่กำลังมองหาmy.cnfไฟล์และไม่พบbind-addressคำสั่งในนั้นโปรดทราบว่าในกรณีของฉัน (MySQL รุ่น 14.14 บน Ubuntu 16.04.2) ตำแหน่งของไฟล์คือ/etc/mysql/mysql.conf.d/mysqld.cnf
Ash Menon

49

หลังจากทำตามขั้นตอนทั้งหมดแล้วฉันยังไม่สามารถเข้าสู่ระบบได้rootจากระยะไกล แต่ Telnetting ไปยังพอร์ต3306ยืนยันว่าMySQLกำลังรับการเชื่อมต่อ

ฉันเริ่มดูผู้ใช้ใน MySQL และสังเกตเห็นว่ามีผู้ใช้รูทหลายคนด้วยรหัสผ่านที่แตกต่างกัน

select user, host, password from mysql.user;

ดังนั้นในการMySQLที่ผมตั้งรหัสผ่านทั้งหมดสำหรับรากrootอีกครั้งและในที่สุดผมก็สามารถเข้าสู่ระบบในระยะไกลเป็น

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

4
สิ่งนี้ถูกต้อง ในขณะที่ทำตามขั้นตอนในคำตอบอื่น ๆ บัญชีผู้ใช้ที่มีรหัสผ่านว่างเปล่าจะถูกสร้างขึ้น ดังนั้นคุณต้องเพิ่มรหัสผ่านสำหรับพวกเขา
chhantyal

1
ฉันต้องการรวมคำตอบที่ยอมรับกับคำตอบนี้เข้าด้วยกัน
James

8
SQL สำหรับ 5.7 ขึ้นไปupdate user set authentication_string=password('YOUR_PASSWORD') where user='root';
DalSoft

คำตอบที่ยอมรับตั้งรหัสผ่านและทำงานให้ฉัน
MikeKulls

1
ขอบคุณเช่น @James ฉันต้องรวมสิ่งนี้กับคำตอบที่ได้รับการยอมรับเพื่อแก้ไข
Ben Everard

39

เพียงบันทึกจากประสบการณ์ของฉันคุณสามารถค้นหาไฟล์การกำหนดค่าภายใต้เส้นทาง/etc/mysql/mysql.conf.d/mysqld.cnfนี้

(ฉันพยายามหาเวลาเส้นทางนี้)


1
สิ่งนี้ขึ้นอยู่กับการกระจายที่คุณใช้ วิธีที่ดีที่สุดคือเพียงค้นหามัน:sudo find /etc -iname 'mysql*.cnf'
Martin Konecny

ฉันซาบซึ้งกับคำสั่ง 'ค้นหา' ฉันใหม่กับบรรทัดคำสั่งดังนั้นจึงมีประโยชน์มาก ขอบคุณ!
Heres2u

ฉันใช้เวลาหลายชั่วโมงในการแก้ไข /etc/mysq/conf.d/mysql.cnf จนกว่าฉันจะพบว่าไม่แน่ใจ
Gayan Kavirathne

26

ในกรณีของฉันฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ mysql ระยะไกลบนระบบปฏิบัติการเซน หลังจากผ่านการแก้ปัญหาจำนวนมาก (การให้สิทธิ์ทั้งหมดการลบการเชื่อมโยง IP การเปิดใช้งานเครือข่าย) ปัญหายังคงไม่ได้รับการแก้ไข

เมื่อมันปรากฏออกมาในขณะที่มองหาวิธีการแก้ปัญหาต่าง ๆ ฉันพบ iptables ซึ่งทำให้ฉันรู้ว่าพอร์ต mysql 3306 ไม่ยอมรับการเชื่อมต่อ

นี่เป็นบันทึกเล็ก ๆ เกี่ยวกับวิธีการตรวจสอบและแก้ไขปัญหานี้

  • ตรวจสอบว่าพอร์ตยอมรับการเชื่อมต่อหรือไม่:
telnet (ip เซิร์ฟเวอร์ mysql) [พอร์ตไม่]
  • การเพิ่มกฎตาราง ip เพื่ออนุญาตการเชื่อมต่อบนพอร์ต:
iptables -A อินพุต -i eth0 -p tcp -m tcp - พอร์ต 3306 -j ยอมรับ
  • จะไม่แนะนำสิ่งนี้สำหรับสภาพแวดล้อมการผลิต แต่ถ้า iptables ของคุณไม่ได้รับการกำหนดค่าอย่างถูกต้องการเพิ่มกฎอาจยังไม่สามารถแก้ไขปัญหาได้ ในกรณีดังต่อไปนี้ควรจะทำ:
บริการ iptables หยุด

หวังว่านี่จะช่วยได้


17

โปรดทำตามขั้นตอนที่กล่าวถึงด้านล่าง inorder เพื่อตั้งค่า wildcard remote access สำหรับ MySQL User

(1) เปิด cmd

(2) นำทางไปยังเส้นทาง C: \ Program Files \ MySQL \ MySQL Server 5.X \ bin และเรียกใช้คำสั่งนี้

mysql -u root -p

(3) ป้อนรหัสผ่านรูท

(4) ดำเนินการคำสั่งต่อไปนี้เพื่อให้สิทธิ์

ให้สิทธิ์ทั้งหมดในวันที่ *. * เป็น 'USERNAME' @ 'IP' ที่ระบุด้วย 'รหัสผ่าน';

USERNAME: ชื่อผู้ใช้ที่คุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ MySQL

IP: ที่อยู่ IP สาธารณะที่คุณต้องการอนุญาตให้เข้าถึงเซิร์ฟเวอร์ MySQL

PASSWORD: รหัสผ่านของชื่อผู้ใช้ที่ใช้

IP สามารถแทนที่ด้วย% เพื่อให้ผู้ใช้สามารถเชื่อมต่อจากที่อยู่ IP ใด ๆ

(5) ล้าง previleges โดยทำตามคำสั่งและออก

สิทธิในการชำระล้าง

ออกจาก; หรือ\ q

ป้อนคำอธิบายรูปภาพที่นี่


3
หลังจากทำแล้วรูทของฉันยังคงถูกปฏิเสธการเข้าถึง ฉันพลาดอะไรไป
teapeng

คุณสามารถลองกับที่อยู่ IP ระบบในระบบของคุณแทน% ในขั้นตอนที่ 4 มันควรจะทำงาน % หมายถึงที่อยู่ IP ใด ๆ
Hiren Parghi

6

หากกระบวนการเซิร์ฟเวอร์ MySQL ของคุณกำลังรับฟังบน 127.0.0.1 หรือ :: 1 เท่านั้นคุณจะไม่สามารถเชื่อมต่อจากระยะไกลได้ หากคุณมีการbind-addressตั้งค่าใน/etc/my.cnfสิ่งนี้อาจเป็นสาเหตุของปัญหา

คุณจะต้องเพิ่มสิทธิพิเศษสำหรับผู้ที่ไม่ใช่localhostผู้ใช้ด้วย


แปลกเซิร์ฟเวอร์ของคุณจะ "ฟัง" ใน IP อื่นได้127.0.0.1อย่างไร
Pacerier

2
@Pacerier 127.0.0.1 เชื่อมโยงกับส่วนต่อประสานย้อนกลับเท่านั้น การเชื่อมต่อภายนอกจะไม่ทำงาน ระบบมักจะมีเครือข่ายอินเทอร์เฟซหลายที่แต่ละแห่งจะต้องผูกพันกับโดยเฉพาะหรือคุณสามารถใช้ที่อยู่ bind-all 0.0.0.0
tadman

6

หากคุณติดตั้ง MySQL จากbrewมันจะฟังเฉพาะในอินเตอร์เฟซท้องถิ่นโดยค่าเริ่มต้น หากต้องการแก้ไขที่คุณต้องแก้ไข/usr/local/etc/my.cnfและเปลี่ยนbind-addressจาก127.0.0.1เป็น*การ

brew services restart mysqlจากนั้นเรียก


1
สำหรับเซิร์ฟเวอร์ ubuntu 16.04.4 ของฉันการตั้งค่า bind-address อยู่ใน /etc/mysql/mysql.conf.d/mysqld.cnf
Frank

นี่ไม่ได้เป็นเพียงการใช้การชง แต่อย่างใด MySQL จะมีการตั้งค่าเริ่มต้นนี้เพื่ออนุญาตเฉพาะการเชื่อมต่อท้องถิ่น
nivs1978

6

กระบวนการทั้งหมดสำหรับการเข้าสู่ระบบระยะไกล การเข้าสู่ระบบจากระยะไกลถูกปิดใช้งานโดยค่าเริ่มต้นคุณต้องเปิดด้วยตนเองสำหรับทุก ip .. เพื่อให้สามารถเข้าถึงได้ทุก ip

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

IP เฉพาะ

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

แล้วก็

flush privileges;

คุณสามารถตรวจสอบโฮสต์ผู้ใช้และรหัสผ่านของคุณ

SELECT host,user,authentication_string FROM mysql.user;

ตอนนี้หน้าที่ของคุณคือการเปลี่ยนแปลงสิ่งนี้

bind-address = 127.0.0.1

คุณสามารถค้นหาสิ่งนี้ได้

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

หากคุณไม่พบสิ่งนี้ลองทำสิ่งนี้

sudo nano /etc/mysql/my.cnf

แสดงความคิดเห็นในนี้

#bind-address = 127.0.0.1

จากนั้นเริ่ม Mysql ใหม่

sudo service mysql restart

ตอนนี้สนุกกับการเข้าสู่ระบบจากระยะไกล


3

เพียงแค่ FYI ฉันดึงผมออกมาด้วยปัญหานี้นานหลายชั่วโมง .. ในที่สุดฉันก็โทรหาผู้ให้บริการโฮสติ้งของฉันและพบว่าในกรณีของฉันใช้เซิร์ฟเวอร์คลาวด์ที่แผงควบคุมสำหรับ 1 และ 1 พวกเขามีไฟร์วอลล์สำรองที่คุณต้องโคลนและเพิ่มพอร์ต 3306 เมื่อเพิ่มฉันได้ตรงค่ะ


สิ่งนี้ฟังดูเฉพาะกับสถานการณ์ของคุณมาก ฉันไม่ใช่แหล่งความรู้เกี่ยวกับเครือข่ายที่ไม่รู้จบ แต่คุณแน่ใจหรือไม่ว่าโซลูชันนี้สามารถนำไปใช้กับปัญหานี้ได้ดี?
Sandy Gifford

2
ฉันมีปัญหานี้เช่นกัน ทั่วไปกับเซิร์ฟเวอร์ที่โฮสต์บนคลาวด์
Matthew Lock

2

สำหรับผู้ที่ต้องการตรวจสอบพอร์ตไฟร์วอลล์ 3306 เปิดเช่นกันหากบริการไฟร์วอลล์ของคุณกำลังทำงานอยู่



1

และสำหรับคนที่ใช้ OS X โปรดทราบว่าโดยทั่วไปแล้วพารามิเตอร์ bind-address จะถูกตั้งค่าไว้ในโปรแกรมเรียกใช้งานระบบและไม่อยู่ในไฟล์ my.ini ดังนั้นในกรณีของฉันฉันออกจาก<string>--bind-address=127.0.0.1</string>/Library/LaunchDaemons/homebrew.mxcl.mariadb.plist


ตำแหน่งอื่น ๆ สำหรับไฟล์ plist:~/Library/LaunchAgents
Dylan Nissley

1

หากmysqldมีการกำหนดที่อยู่ผูกเป็นลูปแบ็ค / ที่อยู่ท้องถิ่น (เช่น127.0.0.1 ) เซิร์ฟเวอร์จะไม่สามารถเข้าถึงได้จากโฮสต์ระยะไกลเพราะอินเตอร์เฟซย้อนกลับไม่สามารถเข้าถึงได้จากโฮสต์ระยะไกลใด ๆ

ตั้งค่าตัวเลือกนี้เป็น0.0.0.0(::สำหรับ IPv4 + 6) เพื่อยอมรับการเชื่อมต่อจากโฮสต์ใด ๆ หรือไปยังที่อยู่อื่นที่เข้าถึงได้จากภายนอกหากคุณต้องการอนุญาตการเชื่อมต่อในอินเทอร์เฟซเดียวเท่านั้น

แหล่ง


0

บางครั้งจำเป็นต้องใช้ชื่อพีซีบน windows

ขั้นตอนแรก)ใส่ในไฟล์ config ของ mysql:

mysqld.cnf ตลาดหลักทรัพย์ผูกที่อยู่ = 0.0.0.0

(เพื่อให้การเชื่อมต่อ recibe ผ่าน tcp / ip)

ขั้นตอนที่สอง)สร้างผู้ใช้ใน mysql ผู้ใช้งานตารางโดยใช้ชื่อ pc บน windows propierties ไม่ใช่ ip

ป้อนคำอธิบายรูปภาพที่นี่


0

การเปิดใช้งานการเข้าถึงรูทระยะไกลอาจเป็นอันตรายได้ มันจะดีกว่าถ้าคุณจะตั้งค่าบัญชีผู้ใช้ที่มีสิทธิ์ จำกัด มากขึ้น สามขั้นตอนต่อไปนี้ควรทำ

  1. ตรวจสอบให้แน่ใจว่าบรรทัดที่ขึ้นต้นด้วยbind-address ...อย่างน้อยมีความเห็นในไฟล์ my.ini หรือ my.cnf ของคุณ หากไม่มีอยู่ให้ไปต่อ คุณสามารถค้นหาไฟล์นี้ในC:\ProgramData\MySQL\MySQL Server 8.0Windows

  2. หลังจากนั้นให้ตรวจสอบว่าบัญชีผู้ใช้ที่คุณกำลังสร้างการเชื่อมต่อนั้นไม่มีlocalhostอยู่ในฟิลด์การจับคู่โฮสต์ จำกัด แม้ว่าจะไม่แนะนำ แต่คุณสามารถใส่%ในช่องนั้นเพื่อการทดสอบได้ คุณสามารถทำได้โดยเปิดการเชื่อมต่อท้องถิ่นไปยังเซิร์ฟเวอร์ด้วย MySQL Workbench จากนั้นไปที่เซิร์ฟเวอร์> ผู้ใช้และสิทธิ์จากแถบเมนูและค้นหาบัญชีผู้ใช้ที่คุณต้องการเชื่อมต่อด้วย

ฟิลด์ "การจับคู่กับโฮสต์ จำกัด " เป็นสิ่งที่ทำให้คุณไม่สามารถเชื่อมต่อกับผู้อื่นได้ นั่นคือ จำกัด การเชื่อมต่อที่ยอมรับไปยังรูปแบบที่อยู่ IP เป็นการดีที่คุณควรเข้าถึงเซิร์ฟเวอร์ MySQL จากที่อยู่ IP หรือซับเน็ตแบบคงที่เพื่อให้คุณสามารถ จำกัด ได้มากที่สุด

  1. เห็นได้ชัดว่าไฟร์วอลล์ของคุณควรอนุญาตให้แอปพลิเคชันเซิร์ฟเวอร์ MySQL สื่อสารผ่านพอร์ตที่คุณต้องการ อุปกรณ์เครือข่ายทางกายภาพระหว่างคุณและเซิร์ฟเวอร์ของคุณควรอนุญาตการสื่อสารบนพอร์ตที่คุณต้องการเชื่อมต่อด้วย (พอร์ต 3306 โดยทั่วไป)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.