Mysql 的 Vagrant 端口转发
Vagrant port forwarding for Mysql
我试图在 Vagrantfile 中设置端口转发以从主机系统连接到来宾 mysqld,但出现 reading initial communication packet
错误。
主持人:Yosemite,嘉宾:Trusty, vagrant 1.7.4
Vagrantfile(主机):
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3306, host: 3309
my.ini(客人):
bind-address = 127.0.0.1
8080 转发非常有效。
来自访客的 mysql -h127.0.0.1 -uroot -p
也有效。
来自主机的 mysql -h127.0.0.1 -P 3309 -uroot -p
结果有 reading initial communication packet
错误。
当我从主机远程登录时,连接立即关闭:
$ telnet localhost 3309
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
当我从主机 ssh 到 vagrant box 时,端口转发工作:
$ssh vagrant@127.0.0.1 -p 2222 -L3308:localhost:3306
然后我可以从主机 mysql -h127.0.0.1 -P3308 -uroot -p
连接而不会出现问题,我将其用作临时解决方法。
终于能够让它工作了 -
编辑 /etc/mysql/my.cnf
文件并确保
- 你有
bind-address = 0.0.0.0
- 或者您注释行
#bind-address ...
您可能需要将其添加到 my.cnf 文件的 mysqld 部分:
[mysqld]
bind-address = 0.0.0.0
确保在更改后重新启动 mysql 服务器
$ sudo service mysql restart
然后你可以从你的主机连接 - 所以我首先遇到了类似
的错误
$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
ERROR 1130 (HY000): Host '172.16.42.2' is not allowed to connect to this MySQL server
所以我回来给客人做了
vagrant@precise64:~$ mysql -h127.0.0.1 -uroot -p
...
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.42.2' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
然后我从主机连接没有问题
$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.44-0ubuntu0.12.04.1 (Ubuntu)
第一个答案正确但不正确enough.when我连接MySQL,我得到一个错误:
Host '10.0.2.2' is not allowed to connect to this MySQL server
解决方案:
create user 'root'@'10.0.2.2' identified by 'password';
grant all privileges on . to 'root'@'10.0.2.2' with grant option;
flush privileges;
啊哈,所有问题都解决了,
就我个人而言,我不会为开发 Vagrant boxes 而修改 MySQL - 这既费时又难以在配置器中编写脚本,这意味着您每次 vagrany destroy
或一个新的开发者开始贡献。相反,我通过 SSH 隧道连接,使用 Vagrant 生成的 private_key
文件非常容易。无需额外的 post-install 调整。
按照以下步骤使用 SequelPro、MySql Workbench 或任何其他支持 SSH 连接的客户端建立 SSH 隧道:
- Choose SSH 连接选项
- SSH模式下的"Host"变成localhost或者具体的
127.0.0.1
(更可预测的cross-os)
- username/password 是数据库 username/password。对于开发,您可以只使用
root
并且密码是 defined/created 在供应商(见下面的片段)
- SSH 用户名是
Vagrant
- 没有 SSH 密码 - 只需为 Vagrant 机器使用
private_key
,位于 VM 项目根目录中的 .vagrant/machines/default/virtualbox
;注意在most OS的这个目录下,所有以.
开头的都是隐藏的
要自动安装和创建 root 密码,请将其添加到您的 Vagrant 配置脚本文件(Vagrantfile 中的 config.vm.provision
),通常命名为 provisioner.sh
:
debconf-set-selections <<< 'mysql-server mysql-server/root_password password SuperSecretPasswordHere'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password SuperSecretPasswordHere'
apt-get install -y mysql-server
希望这可以帮助其他人节省一些时间!
我试图在 Vagrantfile 中设置端口转发以从主机系统连接到来宾 mysqld,但出现 reading initial communication packet
错误。
主持人:Yosemite,嘉宾:Trusty, vagrant 1.7.4
Vagrantfile(主机):
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3306, host: 3309
my.ini(客人):
bind-address = 127.0.0.1
8080 转发非常有效。
来自访客的mysql -h127.0.0.1 -uroot -p
也有效。
mysql -h127.0.0.1 -P 3309 -uroot -p
结果有 reading initial communication packet
错误。
当我从主机远程登录时,连接立即关闭:
$ telnet localhost 3309
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
当我从主机 ssh 到 vagrant box 时,端口转发工作:
$ssh vagrant@127.0.0.1 -p 2222 -L3308:localhost:3306
然后我可以从主机 mysql -h127.0.0.1 -P3308 -uroot -p
连接而不会出现问题,我将其用作临时解决方法。
终于能够让它工作了 -
编辑 /etc/mysql/my.cnf
文件并确保
- 你有
bind-address = 0.0.0.0
- 或者您注释行
#bind-address ...
您可能需要将其添加到 my.cnf 文件的 mysqld 部分:
[mysqld]
bind-address = 0.0.0.0
确保在更改后重新启动 mysql 服务器
$ sudo service mysql restart
然后你可以从你的主机连接 - 所以我首先遇到了类似
的错误$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
ERROR 1130 (HY000): Host '172.16.42.2' is not allowed to connect to this MySQL server
所以我回来给客人做了
vagrant@precise64:~$ mysql -h127.0.0.1 -uroot -p
...
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.42.2' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
然后我从主机连接没有问题
$ mysql -h127.0.0.1 -P 3309 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.44-0ubuntu0.12.04.1 (Ubuntu)
第一个答案正确但不正确enough.when我连接MySQL,我得到一个错误:
Host '10.0.2.2' is not allowed to connect to this MySQL server
解决方案:
create user 'root'@'10.0.2.2' identified by 'password';
grant all privileges on . to 'root'@'10.0.2.2' with grant option;
flush privileges;
啊哈,所有问题都解决了,
就我个人而言,我不会为开发 Vagrant boxes 而修改 MySQL - 这既费时又难以在配置器中编写脚本,这意味着您每次 vagrany destroy
或一个新的开发者开始贡献。相反,我通过 SSH 隧道连接,使用 Vagrant 生成的 private_key
文件非常容易。无需额外的 post-install 调整。
按照以下步骤使用 SequelPro、MySql Workbench 或任何其他支持 SSH 连接的客户端建立 SSH 隧道:
- Choose SSH 连接选项
- SSH模式下的"Host"变成localhost或者具体的
127.0.0.1
(更可预测的cross-os) - username/password 是数据库 username/password。对于开发,您可以只使用
root
并且密码是 defined/created 在供应商(见下面的片段) - SSH 用户名是
Vagrant
- 没有 SSH 密码 - 只需为 Vagrant 机器使用
private_key
,位于 VM 项目根目录中的.vagrant/machines/default/virtualbox
;注意在most OS的这个目录下,所有以.
开头的都是隐藏的
要自动安装和创建 root 密码,请将其添加到您的 Vagrant 配置脚本文件(Vagrantfile 中的 config.vm.provision
),通常命名为 provisioner.sh
:
debconf-set-selections <<< 'mysql-server mysql-server/root_password password SuperSecretPasswordHere'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password SuperSecretPasswordHere'
apt-get install -y mysql-server
希望这可以帮助其他人节省一些时间!