mysqldump 连接 ssl 数据库必须显式指定证书参数,否则默认非加密连接会报错;mysqlpump ssl 控制粒度粗,不支持低层参数;mysqlbinlog 远程拉取需同样配置 ssl 参数;证书路径须绝对、权限 600、避免硬编码。

mysqldump 连接 SSL 数据库时必须显式指定证书参数
不加证书参数,mysqldump 默认走非加密连接,即使服务器强制 SSL 也会报错 SSL connection error: protocol version mismatch 或直接拒绝。MySQL 客户端工具不会自动读取服务器端配置的证书路径,必须由用户明确传入。
实操建议:
- 用
--ssl-mode=REQUIRED强制启用 SSL(MySQL 8.0+ 推荐),旧版本用--ssl=1 - 必须配齐三个证书文件:客户端公钥
--ssl-cert=/path/to/client-cert.pem、私钥--ssl-key=/path/to/client-key.pem、CA 证书--ssl-ca=/path/to/ca.pem - 若服务端 CA 用了自签名证书,且你信任它,可加
--ssl-verify-server-cert=FALSE避免主机名验证失败(但仅限内网可信环境) - 证书路径必须是 mysqldump 进程能读取的绝对路径,不能用
~或相对路径
mysqlpump 不支持 --ssl-cipher 等低层 SSL 参数
mysqlpump 是 MySQL 5.7+ 的并行逻辑备份工具,但它对 SSL 的控制粒度比 mysqldump 更粗。你无法像在 mysqldump 中那样指定 --ssl-cipher 或 --tls-version,一旦服务端只允许 TLSv1.2+,而客户端默认协商失败,就会卡在连接阶段,错误信息通常是 SSL connection error: unknown error number。
实操建议:
- 优先用
mysqldump备份 SSL 环境,尤其当服务端启用了严格 TLS 版本限制时 - 如果坚持用
mysqlpump,确保客户端 MySQL 库(libmysqlclient)版本 ≥ 服务端,否则 TLS 协商可能降级失败 - 可通过
mysql --ssl-mode=REQUIRED --ssl-ca=... -e "SELECT VERSION(), @@version_ssl_cipher;"先验证连通性和协商结果
使用 mysqlbinlog 备份 SSL 环境下的二进制日志需额外注意权限和路径
mysqlbinlog 本身不直连数据库,而是读取磁盘上的 binlog 文件;但如果要用 --read-from-remote-server 拉取远程 binlog,则必须走网络连接——此时它也依赖 MySQL 客户端协议,同样要提供 SSL 参数,且参数名与 mysqldump 一致。
常见错误现象:
- 错误提示
Failed to open file 'mysql-bin.000001' (Errcode: 13 - Permission denied):不是 SSL 问题,而是运行mysqlbinlog的用户无权读取 datadir 下的 binlog 文件(尤其容器或 systemd 启动时) - 远程拉取时提示
Access denied for user ''@'localhost':未指定--user和--password,或账号没REPLICATION CLIENT权限 - 证书路径写错或权限为 644 以外(如 600),
mysqlbinlog会静默忽略证书并退化为非 SSL 连接,导致被服务端拒绝
备份脚本里硬编码证书路径是最大安全隐患
很多运维把 --ssl-ca、--ssl-cert 路径直接写死在 shell 脚本里,甚至提交到 Git —— 这等于把信任链凭证公开。一旦证书泄露,攻击者可冒充合法客户端连接数据库,绕过网络隔离。
实操建议:
- 用
MYSQL_SSL_CA、MYSQL_SSL_CERT、MYSQL_SSL_KEY环境变量代替命令行参数,再通过mysql_config_editor或外部密钥管理器注入 - 证书文件权限必须设为
600,属主为运行备份的用户,禁止 world-readable - 避免在
ps aux可见的命令行中暴露证书路径(mysqldump --ssl-ca=/tmp/cert.pem会被其他用户看到),改用配置文件 +--defaults-extra-file
SSL 证书不是“开了就安全”,备份环节的证书加载方式、存储位置、权限控制,每一步都可能让整条信任链失效。最常被跳过的其实是证书文件本身的读取权限和进程环境隔离。










