จะเชื่อมต่อกับเซิร์ฟเวอร์ Mysql ภายใน VirtualBox Vagrant ได้อย่างไร?


93

ฉันติดตั้ง VirtualBox Machine ใหม่กับ Vagrant และภายใน VM นั้นฉันติดตั้งเซิร์ฟเวอร์ Mysql ฉันจะเชื่อมต่อกับเซิร์ฟเวอร์นั้นนอก vm ได้อย่างไร ฉันส่งต่อพอร์ต 3306 ของ Vagrantfile แล้ว แต่เมื่อฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ mysql มันจะตอบสนองพร้อมกับข้อผิดพลาด: 'กำลังอ่านแพ็กเก็ตการสื่อสารเริ่มต้น'

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

คุณสามารถแบ่งปันการกำหนดค่าของคุณเพิ่มเติมโดยเฉพาะตัวเลือกระบบเครือข่าย (มีกี่ประเภท [bridged, NAT, ... ]) รวมทั้งภาพหน้าจอของพอร์ตที่ส่งต่อที่คุณทำ นอกจากนี้ยังอาจเป็นปัญหาเกี่ยวกับไฟร์วอลล์บน VM ของคุณ
Goyuix

คำตอบ:


126

ตรวจสอบให้แน่ใจว่า MySQL เชื่อมโยงกับ 0.0.0.0 และไม่ใช่ 127.0.0.1 มิฉะนั้นจะไม่สามารถเข้าถึงได้จากภายนอกเครื่อง

คุณสามารถมั่นใจได้โดยแก้ไขไฟล์ my.conf ของคุณและค้นหาbind-addressรายการ - คุณต้องการให้มีลักษณะเช่นbind-address = 0.0.0.0นี้ จากนั้นบันทึกสิ่งนี้และรีสตาร์ท mysql:

sudo service mysql restart

หากคุณกำลังทำสิ่งนี้บนเซิร์ฟเวอร์ที่ใช้งานจริงคุณต้องการทราบถึงผลกระทบด้านความปลอดภัยที่กล่าวถึงที่นี่: /server/257513/how-bad-is-setting-mysqls-bind-address-to -0-0-0-0


นี่เป็นกรณีของการติดตั้ง mysql 5.5 อย่างแน่นอน จากความคิดเห็นใน mysql.conf ฉันคิดว่ามันแตกต่างกันไปตามรุ่น - พวกเขาเคยมีการกำหนดค่าความคิดเห็นที่กล่าวถึงในคำตอบอื่น ๆ
mooreds

7
คุณสามารถทำขั้นตอนนี้โดยอัตโนมัติในไฟล์ bootstrap ด้วยคำสั่งต่อไปนี้ (ทดสอบบน CentOS):sed -i 's/symbolic-links=0/symbolic-links=0\nbind-address=0.0.0.0/g' /etc/my.cnf
ronan_mac

หรือแสดงความคิดเห็นทางbind-addressไลน์
xiaoyifang

9
Host '10.0.2.2' is not allowed to connect to this MySQL serverผมได้รับนี้ แต่แก้ไขด้วยserverfault.com/a/486716/147813
CMCDragonkai

2
นอกจากลิงก์ @CMCDragonkai serverfault แล้ว (ฉันไม่มีชื่อเสียงในการแสดงความคิดเห็น) คำสั่งนี้สามารถใช้ในบางอย่างเช่นสคริปต์ Ansible เพื่อให้สิทธิ์ผู้ใช้รูทโดยอัตโนมัติ:mysql -e "create user 'root'@'10.0.2.2' identified by 'vagrant'; grant all privileges on *.* to 'root'@'10.0.2.2' with grant option; flush privileges;"
KayakinKoder

49

ล็อกอินเข้าสู่กล่องของคุณด้วยssh vagrant@127.0.0.1 -p 2222(password vagrant)

จากนั้น: sudo nano /etc/mysql/my.cnfและแสดงความคิดเห็นในบรรทัดต่อไปนี้ด้วย #

#skip-external-locking 
#bind-address

บันทึกและออก

แล้ว: sudo service mysql restart

จากนั้นคุณสามารถเชื่อมต่อผ่าน SSH ไปยังเซิร์ฟเวอร์ MySQL ของคุณ


10
ฉันแสดงความคิดเห็นโดยใช้ "#" แทน ";"
Jay

3
ฉันต้องผูกที่อยู่และเรียกใช้สิ่งนี้: GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
อันเหงียน

ขอบคุณสิ่งนี้ทำให้ฉันหนักใจมานานแล้ว # skip-external-lockingแก้ได้!
แจ็ค

18

ฉันเจอปัญหานี้เมื่อไม่นานมานี้ ฉันใช้ PuPHPet เพื่อสร้าง config

ในการเชื่อมต่อกับ MySQL ผ่าน SSH รหัสผ่าน "คนจรจัด" ใช้ไม่ได้สำหรับฉันฉันต้องตรวจสอบสิทธิ์ผ่านไฟล์คีย์ SSH แทน

เพื่อเชื่อมต่อกับ MySQL Workbench

วิธีการเชื่อมต่อ

TCP / IP มาตรฐานผ่าน SSH

สสส

Hostname: 127.0.0.1:2222 (forwarded SSH port)
Username: vagrant
Password: (do not use)
SSH Key File: C:\vagrantpath\puphpet\files\dot\ssh\insecure_private_key
              (Locate your insercure_private_key)

MySQL

Server Port: 3306
username: (root, or username)
password: (password)

ทดสอบการเชื่อมต่อ


โดยพื้นฐานแล้วฉันทำสิ่งเดียวกันกับการเชื่อมต่อกับฐานข้อมูลด้วย Phpstorm แต่แทนที่จะเป็น PuPHPet ฉันใช้ Protobox
null

17

สำหรับใครก็ตามที่พยายามทำสิ่งนี้โดยใช้ mysql workbench หรือ sequel pro สิ่งเหล่านี้คืออินพุต:

Mysql Host: 192.168.56.101 (or ip that you choose for it)
username: root (or mysql username u created)
password: **** (your mysql password)
database: optional
port: optional (unless you chose another port, defaults to 3306)

ssh host: 192.168.56.101 (or ip that you choose for this vm, like above)
ssh user: vagrant (vagrants default username)
ssh password: vagrant (vagrants default password)
ssh port: optional (unless you chose another)

แหล่งที่มา: https://coderwall.com/p/yzwqvg


1
สิ่งนี้มีประโยชน์มาก! ฉันไม่ต้องปรับเปลี่ยนที่อยู่การผูกเลยโดยใช้กล่องเสมือนและการส่งต่อตัวแทน ssh
kasakka

1
ตรวจสอบให้แน่ใจว่าคุณได้ลบพับลิกคีย์ออกจากไฟล์ known_hosts ของเครื่องโฮสต์ที่ใช้สำหรับโฮสต์เดียวกัน (ที่อยู่ IP) สิ่งนี้จะเกิดขึ้นหากคุณใช้ Vagrant VM อื่นที่มีที่อยู่ IP เดียวกัน
Jon Hudson

คุณยังสามารถรับค่ากำหนดค่า SSH จากvagrant ssh-configคำสั่ง
Tayler

13

ดีเนื่องจากค่าการตอบรับช่วยให้ฉันผมมองมากขึ้นและพบว่าวิธีการแก้ปัญหาในการนี้บทความ

และคำตอบโดยสรุปมีดังต่อไปนี้:

การเชื่อมต่อกับ MySQL โดยใช้ MySQL Workbench

Connection Method: Standard TCP/IP over SSH
SSH Hostname: <Local VM IP Address (set in PuPHPet)>
SSH Username: vagrant (the default username)
SSH Password: vagrant (the default password)
MySQL Hostname: 127.0.0.1
MySQL Server Port: 3306
Username: root
Password: <MySQL Root Password (set in PuPHPet)>

ด้วยวิธีการที่กำหนดฉันสามารถเชื่อมต่อกับฐานข้อมูล mysql ในคนจรจัดจากเครื่องโฮสต์ Ubuntu โดยใช้ MySQL Workbench และใช้ Valentina Studio


ฉันใช้ Valentina ซึ่งโดยพื้นฐานแล้วเป็น MySQL Workbench ในแง่ของการเชื่อมต่อกับเซิร์ฟเวอร์แขกของ Vagrant จากคำตอบทั้งหมดอันนี้ตรงนี้ทำให้มันได้ผล PuPHPet เป็นผู้จัดการสิ่งอื่น ๆ ทั้งหมดดังนั้นสิ่งที่กำหนดค่า Vagrant น่าจะมีมากกว่าสำหรับผู้ที่ต้องการกำหนดค่า Vagrantfiles ด้วยตนเอง สำหรับชาว PuPHPet นี่คือคำตอบ
unrivaledcreations

ฉันต้องระบุพา ธ ไฟล์คีย์ SSH ไปยังไฟล์คีย์ส่วนตัวสำหรับกล่อง vagrant: $HOME/project/.vagrant/machines/default/virtualbox/private_keyใน Ubuntu 14.04
Francisco Quintero

คุณยังสามารถรับค่ากำหนดค่า SSH จากvagrant ssh-configคำสั่ง
Tayler

2

นี่คือขั้นตอนที่ใช้ได้ผลสำหรับฉันหลังจากเข้าสู่ระบบ:

ค้นหาไฟล์การกำหนดค่า MySQL:

$ mysql --help | grep -A 1 "Default options"

Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

บน Ubuntu 16 โดยทั่วไปเส้นทางจะเป็น /etc/mysql/mysql.conf.d/mysqld.cnf

เปลี่ยนไฟล์การกำหนดค่าสำหรับที่อยู่ผูก:

หากมีอยู่ให้เปลี่ยนค่าดังนี้ หากไม่มีให้เพิ่มที่ใดก็ได้ในส่วน [mysqld]

bind-address = 0.0.0.0

บันทึกการเปลี่ยนแปลงของคุณลงในไฟล์กำหนดค่าและเริ่มบริการ MySQL ใหม่

service mysql restart

สร้าง / ให้สิทธิ์การเข้าถึงผู้ใช้ฐานข้อมูล:

เชื่อมต่อกับฐานข้อมูล MySQL ในฐานะผู้ใช้รูทและรันคำสั่ง SQL ต่อไปนี้:

mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';

mysql> GRANT ALL PRIVILEGES ON mydb.* TO 'username'@'%';

1

สิ่งนี้ใช้ได้ผลสำหรับฉัน: เชื่อมต่อกับ MySQL ใน Vagrant

username: vagrant password: vagrant

sudo apt-get update sudo apt-get install build-essential zlib1g-dev
git-core sqlite3 libsqlite3-dev sudo aptitude install mysql-server
mysql-client


sudo nano /etc/mysql/my.cnf change: bind-address            = 0.0.0.0


mysql -u root -p

use mysql GRANT ALL ON *.* to root@'33.33.33.1' IDENTIFIED BY
'jarvis'; FLUSH PRIVILEGES; exit


sudo /etc/init.d/mysql restart




# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant::Config.run do |config|

  config.vm.box = "lucid32"

  config.vm.box_url = "http://files.vagrantup.com/lucid32.box"

  #config.vm.boot_mode = :gui

  # Assign this VM to a host-only network IP, allowing you to access
it   # via the IP. Host-only networks can talk to the host machine as
well as   # any other machines on the same network, but cannot be
accessed (through this   # network interface) by any external
networks.   # config.vm.network :hostonly, "192.168.33.10"

  # Assign this VM to a bridged network, allowing you to connect
directly to a   # network using the host's network device. This makes
the VM appear as another   # physical device on your network.   #
config.vm.network :bridged

  # Forward a port from the guest to the host, which allows for
outside   # computers to access the VM, whereas host only networking
does not.   # config.vm.forward_port 80, 8080

  config.vm.forward_port 3306, 3306

  config.vm.network :hostonly, "33.33.33.10"


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