求助:Talend 6.1与HeidiSQL无法连接Vagrant环境下的MySQL服务器
我之前也碰到过类似的Vagrant+MySQL权限连接坑,结合你的环境(Ubuntu 16.04宿主、Vagrant 2.0.0、Talend 6.1+Java 8+mysql-connector-java-5.1.30),给你梳理几个实打实的排查和解决步骤:
1. 先搞定MySQL用户的权限范围
Access denied 90%都是用户权限没覆盖到连接来源IP。先通过Vagrant SSH进虚拟机,登录MySQL执行:
SELECT user, host FROM mysql.user WHERE user = 'user';
如果结果里host列是localhost或者某个特定IP,那你的宿主IP肯定不在允许列表里。这时候要更新权限:
-- 测试阶段可以先允许任意IP连接(生产环境一定要改回指定IP) GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY '你的密码'; -- 或者精准指定宿主IP(Vagrant NAT模式下宿主默认IP是10.0.2.2) GRANT ALL PRIVILEGES ON *.* TO 'user'@'10.0.2.2' IDENTIFIED BY '你的密码'; -- 别忘了刷新权限 FLUSH PRIVILEGES;
要是用TCP/IP over SSH方式,SSH隧道会把请求转发到虚拟机的localhost,这时候要确保用户允许localhost或者%连接。
2. 检查MySQL的绑定地址
默认MySQL可能只绑定127.0.0.1,宿主根本连不上虚拟机的MySQL。找到MySQL配置文件(通常是/etc/mysql/mysql.conf.d/mysqld.cnf),修改bind-address:
# 注释原绑定,改成允许所有IP访问 bind-address = 0.0.0.0
然后重启MySQL服务:
# Ubuntu 16.04用这个命令 sudo service mysql restart
3. Talend和HeidiSQL的配置细节
端口转发要对应
Vagrant用NAT模式的话,必须在Vagrantfile里做端口转发,比如:
config.vm.network "forwarded_port", guest: 3306, host: 33060
这时候Talend/HeidiSQL里要填宿主的33060端口,不是虚拟机的3306!
Talend驱动检查
虽然mysql-connector-java-5.1.30和Java 8兼容,但要确认Talend已经加载了这个驱动:
打开Talend的 Window > Preferences > Talend > Modules,搜索mysql驱动,没找到的话手动添加你本地的mysql-connector-java-5.1.30.jar。
SSH隧道配置
如果用TCP/IP over SSH,要确认:
- SSH用户名是
vagrant(默认),密码也是vagrant - 虚拟机IP可以通过
vagrant ssh-config命令查看 - 隧道转发目标是虚拟机的
127.0.0.1:3306
4. 防火墙和网络连通性测试
先排除防火墙干扰:
- 宿主Ubuntu:用
ufw status看防火墙状态,如果开启了,允许转发的端口:sudo ufw allow 33060/tcp - 虚拟机内部:可以暂时清空iptables测试:
sudo iptables -F
然后用命令行测试连通性,绕开图形工具:
- 直连测试:
mysql -h 127.0.0.1 -P 33060 -u user -p - SSH隧道测试:
# 先建立隧道 ssh -L 33061:127.0.0.1:3306 vagrant@<虚拟机IP> # 新开终端执行连接 mysql -h 127.0.0.1 -P 33061 -u user -p
如果命令行能连上,那问题肯定在Talend/HeidiSQL的配置细节上;连不上的话,回到前面的权限和MySQL绑定地址排查。
内容的提问来源于stack exchange,提问作者Raymond A

