MySQL Operator升级前必须验证CRD兼容性,1. 检查kubectl get crd mysqlclusters.mysql.oracle.com -o yaml中spec.versions和spec.conversion是否支持原版本;2. 执行迁移脚本处理不兼容变更;3. 验证podDisruptionBudget、innodb_fast_shutdown、mysqlVersion匹配;4. 升级后测试备份恢复全流程及RBAC权限。

MySQL Operator升级前必须验证CRD兼容性
Operator升级不是单纯更新镜像,核心风险在CustomResourceDefinition(CRD)变更。新版本Operator可能修改mysqlclusters.mysql.oracle.com等资源结构,导致旧版CR实例无法被识别或字段丢失。
常见错误现象:kubectl get mysqlcluster返回空或报no matches for kind "MySQLCluster";已有集群状态卡在Pending且describe显示Invalid value: "v1alpha1": cannot convert to ...。
- 升级前先运行
kubectl get crd mysqlclusters.mysql.oracle.com -o yaml,比对新版CRD的spec.versions和spec.conversion字段是否支持原版本 - 官方Changelog中重点看
Breaking Changes和CRD Migration章节,不要只扫Features - 若CRD有不兼容变更,必须按文档执行迁移脚本(如
mysql-operator-migrate-crds),不能跳过
StatefulSet滚动升级时Pod重建会触发InnoDB恢复
Operator控制的MySQL Pod升级默认触发滚动重启,哪怕只是镜像变更。InnoDB在mysqld进程终止后会执行崩溃恢复(crash recovery),这在大表场景下可能耗时数分钟,期间连接拒绝、主从延迟飙升。
使用场景:生产环境升级时,若业务无法容忍秒级不可用,需主动干预Pod生命周期。
- 设置
spec.podDisruptionBudget防止多Pod同时驱逐 - 升级前手动执行
SET GLOBAL innodb_fast_shutdown=0,确保干净关闭(避免后续恢复耗时) - 检查
spec.mysqlVersion是否与Operator支持的MySQL镜像列表严格匹配,不支持的版本会导致Pod反复CrashLoopBackOff
升级后必须重新验证备份与恢复路径
Operator v0.5+将备份任务从mysqldump切换为mydumper,v1.0+又引入xtrabackup作为默认引擎。旧备份Job定义可能因API字段废弃而失败,且恢复逻辑依赖Operator内部的restore控制器行为。
容易踩的坑:备份Job成功但status.phase始终为Running;恢复后数据库为空或权限丢失。
- 升级后立即运行一次
backup和restore全流程测试,不要只看Job状态 - 检查
mysqlbackupjobs.mysql.oracle.comCR的spec.tool字段是否被Operator自动重写,必要时显式指定 - 确认
mysql-operator-backup-saServiceAccount的RBAC权限是否覆盖新CRD操作(尤其patch和updateverbs)
Operator v1.2+对MySQL 8.4+的认证插件处理更严格
新版Operator默认要求MySQL用户使用caching_sha2_password插件,且强制校验mysql_user CR中的passwordSecretRef存在性。旧版配置中若遗漏该字段或引用不存在的Secret,Pod会卡在Init:0/1状态。
错误日志典型提示:failed to create user: error 1819 (HY000): Your password does not satisfy the current policy requirements 或 secret "mysql-root-secret" not found。
- 升级前检查所有
mysqluserCR,确保spec.passwordSecretRef.name指向真实存在的Secret - 若MySQL实例已启用
validate_password插件,需同步更新mysqlcluster.spec.mysqlConfig中的validate_password.*参数 - Operator v1.2.3起,
mysqlcluster.spec.users中未声明plugin字段的用户会被拒绝创建,必须显式设为caching_sha2_password或mysql_native_password
最易被忽略的是Operator升级后CRD版本残留——旧版本CRD未清理会导致新Operator无法注册资源,现象是kubectl命令无响应或超时。务必在升级后执行kubectl get crd | grep mysql,确认仅剩目标版本CRD。


















