MySQL Plugin 'InnoDB' init function returned error一例
早上上班后,测试说演示环境挂了,维护上去看了下,启动报错了:
XXXXXX08:30:47 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
XXXXXX08:30:50 [Warning] The syntax '--log-slow-queries' is deprecated and will be removed in a future release. Please use '--slow-query-log'/'--slow-query-log-file' instead.
XXXXXX08:30:50 [Note] Plugin 'FEDERATED' is disabled.
XXXXXX08:30:51 InnoDB: The InnoDB memory heap is disabled
XXXXXX08:30:51 InnoDB: Mutexes and rw_locks use InnoDB's own implementation
XXXXXX08:30:51 InnoDB: Compressed tables use zlib 1.2.3
XXXXXX08:30:51 InnoDB: Using Linux native AIO
XXXXXX08:30:51 InnoDB: Initializing buffer pool, size = 16.0M
XXXXXX08:30:51 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 104857600 bytes!
XXXXXX08:30:51 [ERROR] Plugin 'InnoDB' init function returned error.
XXXXXX08:30:51 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
XXXXXX08:30:51 [ERROR] Unknown/unsupported storage engine: InnoDB
XXXXXX08:30:51 [ERROR] Aborting
网上的说法是“没有正常关闭mysqld服务的情况下,对数据库参数进行改变导致的。因此重启后的服务器不支持InnoDB引擎。
解决方法是:删除MySQL目录下的ib_logfile0和ib_logfile1两个文件”。
其实这有个条件,就是block没有损坏,如果有block损坏了,这样还是无法启动的。
还有个帖子说的是删除mysql目录下的data中所有文件,这不等于完全初始化么?这要是DEMO库就算了,要是线上库、用了几个月的开发、测试库,那重新初始化的成本也太高昂了,况且老板也不允许这么个搞法。
没辙,只能先用innodb_force_recovery=1启动,把数据备份出来,再还原了。
启动后,mysqldump时发现一张表的PK有问题了,没发整个dump出来,是张归档表,直接drop了,其他到问题不大,都出来了。
最后删除所有mysql db数据,重新执行mysql_install_db初始化,最后source alldb.sql还原。
还是得规规矩矩启动和停止,kill db真心有风险。
发现大部分的公司存在的一种现象就是备份嫌烦、standby也嫌烦,然后就宕机了,block损坏了。一拨人干等着一个库。
早上shutdown不掉,kill了下mysqld,导致出现了下僵尸defunct进程,幸亏Kill ps -ef | grep defunct_process_pid父进程成功杀掉了。除了KILL信号外,INT、TERM都可能导致进程僵尸。
什么是defunct进程?
“僵尸”进程是一个早已 死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。每个Unix进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进 程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进 程终止后,但是父进程尚未读取这些数据之前。
defunct进程是不能直接kill -9杀掉的,否则就不叫僵尸进程了。
[zjh@lightdb1 tmp]$ kill -n INT 94935 [zjh@lightdb1 tmp]$ ps axu | grep cpp zjh 94916 0.0 0.0 4352 548 ? Ss 22:41 0:00 /home/zjh/cppdemo/cmake-build-debug/cppdemo zjh 94935 0.0 0.0 0 0 ? Z 22:41 0:00 [cppdemo] <defunct> zjh 94959 0.0 0.0 112784 948 pts/1 S+ 22:41 0:00 grep --color=auto cpp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!