Sqoop连接MySQL时出现Bad Handshake错误求助
解决Sqoop连接MySQL时的Bad Handshake错误
我来帮你一步步排查这个Bad Handshake问题,这在Sqoop搭配MySQL时挺常见的,核心原因大多集中在驱动版本不匹配、MySQL认证方式冲突或者连接参数配置不当上,咱们逐个解决:
1. 先确认JDBC驱动版本与MySQL版本匹配
这是最容易踩的坑:
- 如果你的MySQL是5.x版本,必须用
mysql-connector-java-5.x.jar;如果是8.0+版本,一定要用mysql-connector-java-8.x.jar - 把对应版本的驱动包放到Sqoop的lib目录下(通常是
$SQOOP_HOME/lib),替换掉旧的、不匹配的驱动文件
2. 修正Sqoop连接命令的参数
你当前的连接字符串有两个小问题:
- 执行
list-databases时不需要指定具体数据库(/hadoop),应该指向MySQL服务本身 - 针对MySQL8.0+版本,默认的加密认证方式会导致握手失败,需要添加额外参数关闭SSL、允许公钥检索并指定时区
修正后的命令应该是这样:
sqoop list-databases --connect jdbc:mysql://localhost:3306/?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC --username hadoop -P
注意:如果你的MySQL端口不是默认的3306,记得改成你实际的端口号
3. 调整MySQL用户的认证方式
MySQL8.0+默认使用caching_sha2_password认证,而旧版本的Sqoop驱动不支持这种方式,需要把用户切换回mysql_native_password:
- 登录MySQL控制台:
mysql -u root -p
- 执行以下命令修改用户认证方式并刷新权限:
ALTER USER 'hadoop'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'localhost'; FLUSH PRIVILEGES;
4. 关于bind-address的疑问
你说找不到bind-address项,其实这个参数默认就是监听127.0.0.1(也就是localhost),所以不需要额外配置。如果要确认配置文件位置,不同系统的路径不一样:
- Ubuntu/Debian:
/etc/mysql/mysql.conf.d/mysqld.cnf - CentOS/RHEL:
/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf
不过这个参数和你当前的Bad Handshake问题关系不大,优先解决前面三个步骤。
内容的提问来源于stack exchange,提问作者Bharath KP




