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

 

posted @ 2016-08-12 09:14  zhjh256  阅读(2342)  评论(0编辑  收藏  举报