升级MariaDB至10.1.30后系统频繁崩溃重启问题求助
老兄,这升级后的一堆问题确实闹心——随机崩溃、存储过程炸库、还丢了表,换谁都急。咱们一步步来捋,从最核心的问题开始排查:
MariaDB升级后系列故障的排查修复指南
一、先搞定InnoDB底层的崩溃与表丢失问题
你提到错误日志里有InnoDB表崩溃,还出现.frm文件凭空消失的情况,这十有八九是升级时InnoDB的系统表空间没同步好,或者引擎兼容性出了岔子:
- 强制修复InnoDB系统表空间:
- 先停掉MariaDB服务;
- 找到你的
my.cnf(Linux)或my.ini(Windows),添加一行innodb_force_recovery = 1(先从最低级别1试,不行再逐步升到6,但注意级别4及以上会丢数据,谨慎操作); - 启动服务,立刻用
mysqldump --all-databases > full_backup.sql导出全库备份; - 再次停服务,删掉刚才加的
innodb_force_recovery配置,同时删除ibdata1、ib_logfile0、ib_logfile1这几个InnoDB核心文件(备份好再删!); - 重启服务,导入刚才的全库备份,重建InnoDB系统表空间。
- 补做系统表升级:不管你是回滚到10.1还是升到10.2,都得跑一遍
mysql_upgrade -u root -p,这个命令会自动检查并更新MariaDB的系统表,很多升级后的诡异问题都是因为系统表没跟上版本导致的。
二、解决存储过程触发的崩溃与丢连接问题
存储过程一调用就丢连接还炸库,要么是你的存储过程代码和新版本不兼容,要么就是10.1.30这个版本本身有存储过程引擎的bug:
- 排查存储过程的兼容性问题:用
SHOW CREATE PROCEDURE 你的存储过程名;导出出问题的存储过程代码,对比你之前用的MariaDB版本,看看有没有用了新版本废弃的语法、函数行为变了的地方——比如涉及InnoDB事务的部分,有没有未正确提交/回滚的逻辑,或者用了OLD_PASSWORD()这类已淘汰的函数。 - 开详细日志抓崩溃细节:在
my.cnf里加这几行配置:
然后触发存储过程的错误,去日志里找崩溃的堆栈信息,要是能定位到具体是存储过程哪行代码的问题,直接改就行;要是确定是MariaDB本身的bug,建议降级到10.1分支的稳定版(比如10.1.48,这是10.1最后一个维护版),别直接跳10.2,大版本跨升级容易踩更多兼容性坑。log_error = /var/log/mariadb/detailed_error.log slow_query_log = 1 slow_query_log_file = /var/log/mariadb/slow_queries.log log_queries_not_using_indexes = 1
三、找回丢失的product_description表
OpenCart的这个表丢了.frm文件,先别慌,InnoDB的实际数据不一定丢了:
- 检查独立表空间文件:如果你的
innodb_file_per_table是开启状态(默认是开的),那应该有product_description.ibd文件,要是这个文件还在,就能这么恢复:- 先从OpenCart的安装脚本或者旧备份里导出这个表的结构,创建一个一模一样的空表;
- 停MariaDB服务,把空表的
.ibd文件删掉,把原来的product_description.ibd复制过来,改权限为mysql:mysql(Linux); - 启动服务,执行:
试试能不能恢复数据。ALTER TABLE product_description DISCARD TABLESPACE; ALTER TABLE product_description IMPORT TABLESPACE;
- 磁盘健康检查:
.frm文件平白无故丢了,也可能是磁盘出问题了,用fsck(Linux)或者Windows的磁盘检查工具扫一遍磁盘,看看有没有坏道或者文件系统损坏的情况。
四、调试存储过程导致其他系统故障的排查
调试存储过程时连累其他系统单元,大概率是MariaDB崩溃时占了太多系统资源,或者触发了系统的资源限制:
- 调整MariaDB资源参数:检查
my.cnf里的max_connections、innodb_buffer_pool_size、open_files_limit这些参数,升级后新版本的内存占用可能变了,比如innodb_buffer_pool_size别设超过物理内存的70%,不然容易OOM(内存不足)导致系统崩溃; - 看系统日志找线索:Linux下看
/var/log/messages或者dmesg,Windows看事件查看器,看看MariaDB崩溃时有没有内存不足、磁盘IO打满、进程被系统杀掉的记录,这些都可能影响其他系统单元。
最后再啰嗦一句:所有操作前一定要做全库备份!要是以上步骤都搞不定,把完整的错误日志、存储过程代码、my.cnf配置收集好,提交给MariaDB的官方bug系统,让他们帮忙排查。
内容的提问来源于stack exchange,提问作者LSG
相关产品推荐
相关产品推荐

