Bash脚本连接MySQL报ERROR 1043 (08S01) Bad handshake如何解决
报错核心原因
ERROR 1043 (08S01): Bad handshake 本质是MySQL客户端与服务端版本跨度过大导致连接握手协议不兼容:
- 执行脚本的本地服务器使用的是MySQL 8.0.26版本客户端,默认采用
caching_sha2_password认证插件、强制要求高版本TLS/SSL加密连接规则 - 目标数据库是早期停止维护的MySQL 5.1.73版本,仅支持旧版
mysql_native_password认证、默认不支持高版本SSL加密规则,无法识别8.0客户端发来的握手请求,直接抛错。
另外原脚本存在一处参数笔误:--user=user1--password=testpw两个参数之间缺少空格,会被客户端识别为用户名是user1--password=testpw,也会导致连接异常。
分步解决方法
- 第一步:修正脚本参数笔误,同时补上
local-infile启用参数(LOAD DATA LOCAL操作需要客户端、服务端同时开启该参数才可以执行),基础脚本修正为如下格式:
quary1="load data local infile '$file1' ignore INTO TABLE modifyvalues fields terminated by ',' LINES TERMINATED BY '\n' ignore 1 lines;" mysql --host=10.32.90.33 --user=user1 --password=testpw --local-infile=1 --execute "$quary1"
- 第二步:给连接命令追加兼容旧版本的参数,强制使用5.1版本支持的握手规则:
- 加
--skip-secure-auth参数:跳过8.0版本默认的高版本安全认证校验,兼容旧版密码认证逻辑 - 加
--ssl-mode=DISABLED参数:关闭SSL加密连接尝试,适配5.1版本默认无SSL的配置
调整后完整可执行命令:
- 加
mysql --host=10.32.90.33 --user=user1 --password=testpw --skip-secure-auth --ssl-mode=DISABLED --local-infile=1 --execute "$quary1"
- 第三步:如果加完上述参数仍报握手错误,直接在本地服务器安装MySQL 5.x系列的客户端程序,使用与服务端大版本匹配的客户端连接即可彻底规避版本兼容问题。安装完成后调用时写全旧版客户端的二进制路径即可,无需卸载自带的8.0版本客户端。
额外校验项
- 脚本执行用户需要对
$file1指向的CSV文件有可读权限,否则会触发文件读取报错 - 目标MySQL 5.1服务端需要开启
local_infile配置,可在连接成功后执行show variables like 'local_infile';确认参数值为ON,否则导入操作会被服务端拒绝。
内容的提问来源于stack exchange,提问作者Codec737
相关产品推荐
相关产品推荐

