dumpling 在 golang 1.22 版本下的 TLS 处理会导致备份MySQL 时候报错

在其他程序封装 dumpling 时候发现在 Go 1.22 下 dumpling 直接备份 MySQL 5.7 会报错,而备份TiDB 或者 MySQL 8.0 则不会报错,估计是跟 TLS 1.0 被废弃有关系,报错内容如下:

Release version: v8.4.0-alpha-293-g9435af1b6c-dev
Git commit hash: 9435af1b6c82fbc6e19abfd116352b55d6ae93b7
Git branch:      master
Build timestamp: 2024-09-27 10:15:06Z
Go version:      go version go1.23.1 darwin/arm64

[2024/09/27 18:25:36.639 +08:00] [INFO] [versions.go:54] ["Welcome to dumpling"] ["Release Version"=v8.4.0-alpha-293-g9435af1b6c-dev] ["Git Commit Hash"=9435af1b6c82fbc6e19abfd116352b55d6ae93b7] ["Git Branch"=master] ["Build timestamp"="2024-09-27 10:15:06"] ["Go Version"="go version go1.23.1 darwin/arm64"]
[2024/09/27 18:25:36.650 +08:00] [WARN] [version.go:350] ["select tidb_version() failed, will fallback to 'select version();'"] [error="remote error: tls: handshake failure"]

create dumper failed: sql: SELECT version();: remote error: tls: handshake failure

涉及的代码在 tidb/dumpling/export/config.go at master · pingcap/tidb · GitHub
我手动将这块代码删掉是可以备份成功的。

1 个赞

尝试通过修改config.MinTLSVersion = tls.VersionTLS10,来修改支持的最小版本,一样会报错

建议后续如果 TiDB 要 升级 golang 到 1.22 以上版本时候,要多做下兼容性测试,尤其是老的客户端/Driver访问 TiDB,以及 DM、CDC、dumpling 这些要和老版本 MySQL 打交道的组件。

试了下,1.23版本下,在 go.mod 里加上GODEBUG 参数就可以,是跟golang废弃功能有关系

go 1.23
godebug (
    // tls10server=1
    tlsrsakex=1
)

image