ERROR 1235 (42000): Cannot call SHOW INNODB STATUS because skip-innodb is defined
以上这个醒目错误提示,如果你是一个细心专业的DBA的话,可能这辈子你也遇到这样的问题,而我不是,毛躁马虎加上不专业,已经成了我的标签,所以,“幸运的”本人才遭遇到这个Error。究竟怎么一个动作导致出现这样的错误呢,下面简单描述下。
发现监控数据库的my.cnf中的关于Innodb的配置都保持默认状态,而之前只运行cacti倒是没有什么影响,它的表都是MyISAM的。因为前段采用了zabbix监控,而它的表都采用Innodb的表结构。其实,很多参数都可以在线调整,之后将变化的添加到my.cnf即可,无需修改my.cnf再重启mysqld,因为zabbix的信息收集量不小,导致binlog增长很快,磁盘容量报警,之前expire_log_days又设置为0。我觉得监控系统没必要开启binlog日志功能,所以想将log-bin注释掉不记录二进制日志,所以,必须要重启mysqld。在改动的这些参数里面,我调整了redo log的大小,将默认的10M增大到256M,也就是这么一改,重启后,扑哧让我惆怅了好一会。
当我执行show engine innodb status\G(现在我很喜欢看它的输出信息:-)之后,Error 1235就出现了,突然有点惊慌。刚开始我并没去查看error-log(这是一个非常不好的习惯,重启关闭mysqld是必须要tail -f error-log,确定正常关闭正常启动,是否有异常发生),而是跟着上面那个错误提示去找问题。风风火火的就去查看my.cnf里面是否有加skip-innodb,但是不可能呀,如果有那么之前zabbix的表也不会被创建为innodb类型的呀,后来查看error log才发现,是下面的原因导致的错误:
InnoDB: Error: log file /data/db/mysql/ib_logfile0 is of different size 0 10485760 bytes
InnoDB: than specified in the .cnf file 0 134217728 bytes!
这下明白了吧,接着我又执行show engines,发现Innodb的选项是disable的。怎么回事呢?我认为,当mysqld启动时,Innodb检查发现当前iblogfileX大小和配置文件中设置的不一致时,就会报错,但是mysqld仍然能够正常启动,但是Innodb会被自动skip掉。正常的操作应该是,首先正常关闭mysqld,然后将之前的iblogfile文件移走,最后在启动mysqld,初始化期间,如果发现iblogfile不存在会按照配置文件中指定大小重新创建一组新的。有时,以上这个错误的发生,不iblogfile的大小导致的,还可能是你的ibdata的大小问题导致的,Baron也遇到过上面的错误提示,就因为ibdata大小的设置问题。Innodb的加载是一个十分细致的过程,我们必须要谨慎小心。
这些都是不细心和操作不规范造成的;先想,记录,测试,线上,这才是一个专业负责任的做法,其实,这些田老师一开始就这么教给我,可我…都快一年了,还是没有养成这个良好的工作方式。
继续努力吧,我以不再年轻,差距还是很大。
恩 恩 技术改变生活 技术流忠诚粉丝飘过。。。