由于物理磁盘、内存故障、突然断电、强制关机、强制杀死MySQL进程等可能会造成数据坏页现象,数据库实例会不断重启。
错误日志内报如下错误:
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page
现根据以上现象,对该问题进行处理分析。本方案针对InnoDB引擎进行坏页修复。进行灾难恢复大概率会造成造成一部分数据的丢失。
本文档只介绍使用innodb_force_recovery参数进行数据库强制打开的方式。
关闭数据库实例,对数据目录进行冷备。
1 |
shell> tar –cvf data. tar data
|
查询错误日志路径
1 2 3 4 5 6 |
SQL> show variables like 'log_error' ;
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| log_error | . /test .err |
+---------------+------------+
|
注:该路径即为datadir目录下
1 |
shell> tail -3000f /var/lib/mysql/data/test .err
|
判断此时数据库是否已经无法正常运行
1 2 |
shell> vi /etc/my .cnf
innodb_force_recovery=1
|
注:
innodb_force_recovery = 2~6,依次启动服务器直至可以访问有问题的表。
innodb_force_recovery参数解析
innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。 当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。
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):不执行前滚的操作。
1 |
shell> mysqldump -uroot -pmysql --master-data=2 -E -R --all-databases > full.sql
|
1 |
shell> /usr/local/mysql/scripts/mysql_install_db --basedir= /usr/local/mysql --datadir= /var/lib/mysql --user=mysql
|
注:basedir/datadir根据实际情况修改
1 |
shell> mysql -uroot -p < full.sql
|