You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

  1. 登录MySQL控制台:
mysql -u root -p
  1. 执行以下命令修改用户认证方式并刷新权限:
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

火山引擎 最新活动