MySQL主从复制因SSL证书过期中断的处理方法
在主从复制场景中,SSL 证书一旦过期,往往是导致复制中断的高频原因。常见表现也比较典型:IO 线程持续停留在 Connecting,或者直接报出 certificate verify failed。此时需要使用 openssl 检查 ca.pem 等证书的 Not After 到期时间,并逐项确认
在主从复制场景中,SSL 证书一旦过期,往往是导致复制中断的高频原因。常见表现也比较典型:IO 线程持续停留在 Connecting,或者直接报出 certificate verify failed。此时需要使用 openssl 检查 ca.pem 等证书的 Not After 到期时间,并逐项确认书路径、文件权限、subjectAltName 以及 TLS 重载等配置是否正确。

如果主从复制因 SSL 证书过期而中断,问题通常出在主库或从库正在使用的证书文件本身,而不是配置写错或网络不通,也就是 ca.pem 或 server-cert.pem 已经失效过期。MySQL 一般不会直接提示“证书过期”,更常见的现象是卡在 IO 线程建立连接阶段,通常会看到 Slave_IO_Running: Connecting,或者直接报出 SSL connection error: certificate verify failed。
如何确认是证书过期而不是其他原因
先不要修改配置,也不要反复重试连接,应先登录主库或从库,确认启用 SSL 的一侧证书有效期:
- 执行
openssl x509 -in /var/lib/mysql/ca.pem -text -noout | grep -E "(Not Before|Not After)",如果Not After早于2026-07-02,则说明证书已经过期 - 主库和从库可能使用不同证书:主库查看
ssl_ca和ssl_cert所指向的路径;从库查看MASTER_SSL_CA和MASTER_SSL_CERT参数值 - MySQL 8.0.29 及以上版本可执行
SHOW VARIABLES LIKE 'ssl_cert_expire_date';,如果返回为空或显示旧日期,也说明证书可能已失效 - 云数据库如 RDS、AWS、腾讯云通常无法直接访问证书文件,可在控制台“SSL 设置”页面查看
ValidTill字段
为什么更换新证书后从库仍然无法连接主库
常见问题通常不在证书内容本身,而是在加载过程中被静默跳过:
ssl-ca必须配置在[mysqld]段中(主库),或写入从库的CHANGE MASTER TO语句中;如果放在[client]段则不会生效- 证书路径必须使用绝对路径,例如
/etc/mysql/ssl/ca.pem;./ca.pem或~/ssl/ca.pem这类写法无效 - 文件权限应为
600,属主应为mysql用户;如果权限为644或属主为root,MySQL 启动时可能不会加载证书,此时have_ssl会显示为DISABLED - 新证书必须包含
subjectAltName:如果使用localhost连接,则需要添加DNS:localhost;如果使用10.0.1.5连接,则需要添加IP:10.0.1.5;否则在 MySQL 8.0 及以上版本中可能被直接忽略 - 自签名证书如果缺少
keyUsage=digitalSignature,keyEncipherment和extendedKeyUsage=serverAuth,也可能导致握手失败
更新证书后必须执行的关键操作
仅替换证书文件还不够,MySQL 进程和客户端上下文都需要刷新:
- 主库执行
ALTER INSTANCE RELOAD TLS;(适用于 MySQL 5.7.36+ / 8.0.16+),通常比重启mysqld更快;旧版本则只能执行service mysql restart - 从库需要重新执行
CHANGE MASTER TO,显式传入新的MASTER_SSL_CA路径,不能依赖旧配置缓存 - Java 应用通常需要重启 JVM,因为 truststore 会在启动时加载;如果 Python 代码中硬编码了
ssl_ca路径,则需要同步修改代码或环境变量 - 命令行测试建议使用
mysql --ssl-mode=VERIFY_CA --ssl-ca=/path/to/new-ca.pem -u repl -h master_ip -p,避免误用系统默认 CA 路径
最容易被忽略的通常是证书文件权限和 subjectAltName 的覆盖范围。即使证书有效期足够长,只要权限不正确,或缺少 IP:127.0.0.1 等必要项,MySQL 也可能将其视为无效,最终表现为静默降级为非 SSL 连接,或者直接连接失败。
