现场是这样的。CentOS 7.9 上把 MariaDB 从 10.3 升到 10.6,systemctl start mariadb 之后直接失败,error log 里写着 Plugin 'InnoDB' init function returned error 和 Can't open shared library,数据目录还是老的。

中间走过弯路,把「插件目录路径变了,plugin_dir 指向的还是 10.3 的目录」当成主因,改完现象没变。

原因不止一个,得分开看。升级后没有执行 mysql_upgrade,系统表结构和新版对不上;旧版本的 innodb 参数在新版被移除,配置加载时就报错;SELinux 上下文没跟着更新,读取插件文件被拒。

动手时先看 error log 的第一条报错

tail -100 /var/log/mariadb/mariadb.log | grep -iE 'ERROR|Plugin'

再往下确认版本和插件目录

mysql --version && grep -nE 'plugin_dir|innodb' /etc/my.cnf.d/server.cnf

以最小配置启动再处理升级

mysqld_safe --skip-grant-tables --skip-networking &

等前面都确认过,再执行升级脚本并恢复上下文

mysql_upgrade -u root -p && restorecon -Rv /usr/lib64/mysql/plugin

那几天正好在做别的变更,先把时间线对齐才敢动手。

恢复的判定其实很直接。systemctl start mariadb 成功,mysql --version 显示 10.6,业务库里的表能正常读写,error log 没有 Plugin 相关报错。

这里还有个坑。大版本升级前先做全量备份并记录旧版本的参数,被移除的参数要一条条清掉;升级完用 mysqlcheck 把所有库过一遍。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189