MySQL多实例升级前必须确认的3个状态:一是各实例的--defaults-file、--datadir、--socket、--pid-file路径互不冲突;二是每个实例使用独立二进制路径,不可覆盖系统级mysqld;三是mysql_upgrade须按实例逐个执行,不可遗漏。

MySQL 多实例升级前必须确认的 3 个状态
多实例环境下,mysqld 进程不是只有一个,升级失败往往源于「实例间配置隔离不彻底」或「启动脚本混用同一套 binlog/sock/pid 路径」。先执行 ps aux | grep mysqld,逐个核对每个实例的 --defaults-file、--datadir、--socket 和 --pid-file 是否互不冲突。特别注意:不同实例若共用同一个 my.cnf(比如都读 /etc/my.cnf),升级后新版本可能因参数废弃(如 query_cache_type)直接拒绝启动。
升级时不要直接覆盖 /usr/bin/mysqld
多实例依赖各自指定的二进制路径,硬覆盖系统级 mysqld 会导致部分实例仍调用旧二进制、部分调用新二进制,极易引发元数据不一致。正确做法是为每个实例单独部署新版二进制:
- 下载 MySQL 官方 tar 包(如
mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz),解压到独立路径,例如/opt/mysql-8.0.33 - 修改每个实例的启动脚本(或 systemd service 文件),将
ExecStart中的mysqld显式指向新路径下的/opt/mysql-8.0.33/bin/mysqld - 确保
LD_LIBRARY_PATH或ldconfig不干扰——新版依赖的libstdc++.so.6版本可能更高,需提前验证
升级后 mysql_upgrade 必须按实例逐个执行
mysql_upgrade 不是全局命令,它只作用于连接的目标实例。跳过这步会导致 mysql.help_topic 等系统表结构陈旧,后续执行 CREATE USER 或权限操作报错(如 ERROR 1396 (HY000): Operation CREATE USER failed)。操作要点:
- 停掉目标实例:
mysqladmin -S /data/mysql3308/mysql.sock shutdown - 用新二进制启动该实例:
/opt/mysql-8.0.33/bin/mysqld --defaults-file=/etc/my3308.cnf & - 再运行:
/opt/mysql-8.0.33/bin/mysql_upgrade -S /data/mysql3308/mysql.sock -u root -p - 重复以上步骤,一个实例都不能漏——哪怕某个实例只跑测试库
systemd 管理多实例时 service 文件容易忽略的细节
很多团队用 mysqld@.service 模板管理多实例,但升级后常因 %i 解析错误或环境变量未重载导致启动失败。关键检查点:
- 确认
EnvironmentFile=-/etc/sysconfig/mysqld-%i存在且内容正确(尤其MYSQLD_BIN指向新版路径) - 检查
ExecStartPre中的mysqld --version是否还调用旧二进制,避免健康检查误判 - 升级后首次启动前,务必执行:
systemctl daemon-reload && systemctl reset-failed,否则 systemd 可能缓存旧的失败状态
最麻烦的情况是:多个实例共享一套 log-error 路径或 slow_query_log_file,升级后日志写入权限出问题,进程静默退出。这类问题不会报错,只会发现 ps 里没进程、但 systemctl status 显示 active(因为 exit code 被掩盖了)——得盯紧每个实例自己的 error log 文件头几行。











