今天打开数据库,准备做个实验,当插入数据的时候,报错了!
在添加数据的时候给我报了个错误,以为C盘满了,一打开不对,还有很多空间。到底为什么呢,直接查错误日志就行了。
log并没有直接吐出带error的信息,却是InnoDB底层引擎给我吐出了这些信息~
InnoDB: A new raw disk partition was initialized or
InnoDB: innodb_force_recovery is on: we do not allow
InnoDB: database modifications by the user. Shut down
InnoDB: mysqld and edit my.cnf so that newraw is replaced
InnoDB: with raw, and innodb_force_... is removed.
innodb_force_recovery 从文中找到了这个关键的参数,TA肯定有问题!咱们就去配置文件看看他到底是什么妖魔鬼怪!
在数据库的配置文件中找到它,信息都提示我们呢,先关闭mysql服务去找到按个参数然后删除它!不声明它的话,一般默认就为0,之后这种低级问题就不会出现!
想起来了,之前因为C盘空间大,我把mysql的数据文件ibdata1、转移到其他盘,以及把巨大的mysql的日志删除了!导致mysql死活都起不开!
因自从接触了mysql这么久,心想它是没有超过 200百兆的MySQL,一直没有把它放在眼里,心想这玩意有什么难的没有小编解决不了的,大不了求助资深DBA!
因为日志已经损坏或者没了,也没有全备,以及其他恢复机制,我只能采用非常规手段,首先修改innodb_force_recovery参数,使mysqld跳过恢复步骤,将mysqld 启动,将数据导出来然后重建数据库。
innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。
1. (SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2. (SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3. (SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4. (SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5. (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6. (SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。
注意
a 当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。
b 当innodb_purge_threads 和 innodb_force_recovery一起设置会出现一种loop现象:
建议这种非常规的做法,到最后奥如果没有办法了,且哪些坏掉的数据页,日志,和数据库done掉丢失的数据不重要,那就可以使用此参数跳过那些异常!这个参数也要遵循日志异常的级别从小开始,不要上来就直接设置6,要根据相应报错级别,来设置参数值!