การเชื่อมต่อระยะไกล Mysql Ubuntu


98

ด้วยเหตุผลบางประการฉันไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL จากระยะไกลได้ ฉันได้ลองทุกอย่างแล้วและยังคงได้รับข้อผิดพลาด

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

ตอนนี้ฉันได้ลองวิ่งแล้ว

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

และยังไม่มีอะไร! ฉันทำอะไรผิด?

แก้ไข : my.cnfได้แสดงความคิดเห็นเกี่ยวกับการผูก ip


คุณใช้ MySQL เวอร์ชันใด
Steve

เวอร์ชันเซิร์ฟเวอร์: 5.5.29-0ubuntu0.12.10.1 (Ubuntu)
Cristian Eduardo Lehuede Lyon

คำสั่งนี้ส่งคืนอะไร อูบุนตู ~ $ sudo lsof -i -P | grep: 3306
apesa

คำตอบ:


349

ในการเปิดเผย MySQL กับสิ่งอื่นนอกเหนือจาก localhost คุณจะต้องมีบรรทัดต่อไปนี้

สำหรับ mysql เวอร์ชัน 5.6 และต่ำกว่า

ไม่ใส่ความคิดเห็น/etc/mysql/my.cnfและกำหนดให้กับที่อยู่ IP คอมพิวเตอร์ของคุณและไม่ย้อนกลับ

สำหรับ mysql เวอร์ชัน 5.7 ขึ้นไป

ไม่ใส่ความคิดเห็น/etc/mysql/mysql.conf.d/mysqld.cnfและกำหนดให้กับที่อยู่ IP คอมพิวเตอร์ของคุณและไม่ย้อนกลับ

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

หรือเพิ่มไฟล์ bind-address = 0.0.0.0ถ้าคุณไม่ต้องการระบุ IP

จากนั้นหยุดและรีสตาร์ท MySQL ด้วยรายการ my.cnf ใหม่ เมื่อวิ่งไปที่เทอร์มินัลแล้วป้อนคำสั่งต่อไปนี้

lsof -i -P | grep :3306

นั่นควรจะกลับมาเป็นแบบนี้พร้อมกับ IP จริงของคุณใน xxx

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

หากข้อความข้างต้นส่งคืนอย่างถูกต้องคุณจะสามารถยอมรับผู้ใช้ระยะไกลได้ อย่างไรก็ตามสำหรับผู้ใช้ระยะไกลในการเชื่อมต่อกับ Priveleges ที่ถูกต้องคุณจะต้องให้ผู้ใช้นั้นสร้างขึ้นทั้งใน localhost และ '%' เช่นเดียวกับใน.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

จากนั้น

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

และในที่สุดก็,

FLUSH PRIVILEGES; 
EXIT;

หากคุณไม่มีผู้ใช้คนเดียวกันที่สร้างไว้ข้างต้นเมื่อคุณเข้าสู่ระบบภายในคุณอาจสืบทอดสิทธิ์ localhost พื้นฐานและมีปัญหาในการเข้าถึง หากคุณต้องการ จำกัด การเข้าถึง myuser คุณจะต้องอ่านไวยากรณ์คำสั่ง GRANT ที่นี่หากคุณทำสิ่งเหล่านี้ได้ทั้งหมดและยังคงมีปัญหาให้โพสต์ผลลัพธ์ข้อผิดพลาดเพิ่มเติมและบรรทัดที่เหมาะสม my.cnf

หมายเหตุ: หาก lsof ไม่ส่งคืนหรือไม่พบคุณสามารถติดตั้งได้ที่นี่ตามการกระจาย Linux ของคุณ คุณไม่จำเป็นต้องใช้ lsof ในการทำให้สิ่งต่างๆทำงานได้ แต่จะมีประโยชน์อย่างยิ่งเมื่อสิ่งต่างๆไม่เป็นไปตามที่คาดไว้


1
ขอบคุณแม้ว่าฉันจะทำตามขั้นตอนนี้อย่างถูกต้องในครั้งแรก แต่ฉันก็ทำอีกครั้งตามที่คุณโพสต์และทำงานได้อย่างมีเสน่ห์!
Cristian Eduardo Lehuede Lyon

15
สำหรับใครก็ตามที่กำลังดิ้นรนlsof -i -P | grep :3306มันใช้งานไม่ได้ แต่การเชื่อมต่อระยะไกลยังคงทำงานได้ดีหากไม่มีการยืนยันนั้นให้ไม่สนใจหากคุณไม่เห็นผลลัพธ์ที่เหมาะสม
Mike S

@Mike Slutsky ขอบคุณสำหรับบันทึกฉันแก้ไขคำตอบของฉัน คุณสามารถติดตั้ง lsof ได้หากยังไม่ได้ติดตั้ง
apesa

2
FWIW ในหลาย ๆ ระบบsudo lsof -i -Pจะมีประโยชน์มากกว่าlsof -i -P(สมมติว่าคุณเข้าสู่ระบบในฐานะผู้ใช้ที่ไม่มีสิทธิ์)
Dan Passaro

2
lsof -i -P | grep :3306ไม่คืนอะไร!
สีเขียว

39

เพิ่มคะแนนเล็กน้อยที่ด้านบนของโพสต์ที่ยอดเยี่ยมของ apesa:

1) คุณสามารถใช้คำสั่งด้านล่างเพื่อตรวจสอบที่อยู่ IP เซิร์ฟเวอร์ mysql กำลังฟังอยู่

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) ใช้FLUSH PRIVILEGESเพื่อบังคับให้โหลดตารางให้สิทธิ์หากด้วยเหตุผลบางประการการเปลี่ยนแปลงจะไม่มีผลในทันที

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

ผู้ใช้ == ผู้ใช้ที่คุณใช้เพื่อเชื่อมต่อกับ mysql ex.root
passwd == รหัสผ่านที่คุณใช้เพื่อเชื่อมต่อกับ mysql ด้วย

3) หากเปิดใช้งานไฟร์วอลล์ netfilter ( sudo ufw enable) บนเครื่องเซิร์ฟเวอร์ mysql ให้ทำดังต่อไปนี้เพื่อเปิดพอร์ต 3306 สำหรับการเข้าถึงระยะไกล:

sudo ufw allow 3306

ตรวจสอบสถานะโดยใช้

sudo ufw status

4) เมื่อสร้างการเชื่อมต่อระยะไกลแล้วสามารถตรวจสอบได้ในเครื่องไคลเอนต์หรือเซิร์ฟเวอร์โดยใช้คำสั่ง

netstat -an | grep 3306
netstat -an | grep -i established

3
นี่ช่วยทั้งวันของฉัน! ขอบคุณสำหรับsudo ufw status!!
Riddhiman Adib

netstat -nlt | grep 3306กลับว่างเปล่า
João Pimentel Ferreira

@ João Pimentel Ferreira ตรวจสอบให้แน่ใจว่า mysql ทำงานก่อนใช้คำสั่ง "/etc/init.d/mysql status" เพื่อตรวจสอบ
Jonathan L

8

MySQL ฟังเฉพาะ localhost หากเราต้องการเปิดใช้งานการเข้าถึงระยะไกลเราจำเป็นต้องทำการเปลี่ยนแปลงบางอย่างในไฟล์ my.cnf:

sudo nano /etc/mysql/my.cnf

เราจำเป็นต้องแสดงความคิดเห็นเกี่ยวกับที่อยู่ผูกและข้ามบรรทัดการล็อกภายนอก:

#bind-address = 127.0.0.1
# skip-external-locking

หลังจากทำการเปลี่ยนแปลงเหล่านี้เราจำเป็นต้องเริ่มบริการ mysql ใหม่:

sudo service mysql restart

1
อย่าลืมแสดงความคิดเห็นskip-external-locking
calebeaires

1
ฉันไม่ได้แสดงความคิดเห็นเกี่ยวกับการข้ามการล็อกภายนอกและยังใช้งานได้
Marcia Ong

ฉันต้องเปลี่ยนใน /etc/mysql/mysql.conf.d
Bartando

ของฉันคือสถานที่นี้:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
เลสเตอร์

1

หากทดสอบบน Windows อย่าลืมเปิดพอร์ต 3306


คุณเป็นอัจฉริยะนี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณใช้ระบบย่อย Windows สำหรับ Linux คุณต้องเปิดพอร์ต 3306 สำหรับการรับส่งข้อมูลขาเข้าผ่านไฟร์วอลล์ Windows และไม่มีสิ่งใดข้างต้นที่จะตรวจสอบว่า MySQL กำลังฟังอยู่หรือไม่ ระบบย่อย
Brian Leishman

1

คุณใช้ ubuntu 12 (ค่อนข้างเก่า)

ขั้นแรกเปิดไฟล์ /etc/mysql/mysql.conf.d/mysqld.cnf ( /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf ใน Ubuntu 14.04 และเวอร์ชันก่อนหน้า

ภายใต้ [mysqld] ค้นหา Line, bind-address = 127.0.0.1 และเปลี่ยนเป็น bind-address = 0.0.0.0 หรือแสดงความคิดเห็น

จากนั้นรีสตาร์ทเซิร์ฟเวอร์ Ubuntu MysQL systemctl restart mysql.service

ตอนนี้เซิร์ฟเวอร์ Ubuntu จะอนุญาตให้เข้าถึงเซิร์ฟเวอร์ MySQL จากระยะไกล แต่คุณยังต้องกำหนดค่าผู้ใช้ MySQL เพื่ออนุญาตการเข้าถึงจากโฮสต์ใด ๆ

ผู้ใช้ต้องเป็น 'username'@'%'ทุนที่จำเป็นทั้งหมด

เพื่อให้แน่ใจว่าเซิร์ฟเวอร์ MySQL รับฟังอินเตอร์เฟสทั้งหมดให้รันคำสั่ง netstat ดังต่อไปนี้

netstat -tulnp | grep mysql

หวังว่าจะได้ผล!

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