一、问题日志
2017-08-31 14:18:05 4122 [note] innodb: database was not shutdown normally!
2017-08-31 14:18:05 4122 [note] innodb: starting crash recovery.
2017-08-31 14:18:05 4122 [note] innodb: reading tablespace information from the .ibd files...
2017-08-31 14:18:05 4122 [error] innodb: attempted to open a previously opened tablespace. previous tablespace dev/tb_test uses spac
e id: 1 at filepath: ./dev/tb_test.ibd. cannot open tablespace mysql/innodb_table_stats which uses space id: 1 at filepath: ./mysql/
innodb_table_stats.ibd
2017-08-31 14:18:05 2ad861898590 innodb: operating system error number 2 in a file operation.
innodb: the error means the system cannot find the path specified.
innodb: if you are installing innodb, remember that you must create
innodb: directories yourself, innodb does not create them.
innodb: error: could not open single-table tablespace file ./mysql/innodb_table_stats.ibd
innodb: we do not continue the crash recovery, because the table may becomeinnodb: corrupt if we cannot apply the log records in the innodb log to it.
innodb: to fix the problem and start mysqld:
innodb: 1) if there is a permission problem in the file and mysqld cannot
innodb: open the file, you should modify the permissions.
innodb: 2) if the table is not needed, or you can restore it from a backup,
innodb: then you can remove the .ibd file, and innodb will do a normal
innodb: crash recovery and ignore that table.
innodb: 3) if the file system or the disk is broken, and you cannot remove
innodb: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
innodb: and force innodb to continue crash recovery here.
150126 14:18:06 mysqld_safe mysqld from pid file /home/mysql/mysql_app/dbdata/liuyazhuang136.pid ended
二、解决方案1.在my.cnf中添加如下参数在[mysqld]组中加入:
innodb_force_recovery=6
innodb_force_recovery参数解释:
innodb_force_recovery影响整个innodb存储引擎的恢复状况,默认值为0,表示当需要恢复时执行所有的恢复操作。
当不能进行有效的恢复操作时,mysql有可能无法启动,并记录下错误日志。
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):不执行前滚的操作。
2.备份数据库$mysqldump -h 192.168.209.136 -uroot -p dev > /home/mysql/dev.sql
3.删除数据库$mysql -h 192.168.209.136 -uroot -p
mysql> drop database dev;
error 1051 (42s02): unknown table 'dev.tb_test'
物理删除tb_test对应的frm和ibd文件
mysql> drop database dev;
query ok, 0 rows affected (0.00 sec)
4.创建数据库mysql> create database dev;
query ok, 1 row affected (0.03 sec)
5.去掉参数innodb_force_recovery
将之前设置的参数去掉后,重新启动数据库
##innodb_force_recovery=6
6.导入数据[mysql@liuyazhuang136 dev]$ mysql -h 192.168.209.136 -uroot -pmysql dev</home/mysql/dev.sql
warning: using a password on the command line interface can be insecure.
error 1050 (42s01) at line 25: table '`dev`.`tb_test`' already exists
提示表已经存在,这是因为将innodb_force_recovery参数去掉后,数据库会进行回滚操作,会生成相应的ibd文件,所有需要将该文件删除掉.
删除后重新导入
[mysql@liuyazhuang136 dev]$ mysql -h 192.168.209.136 -uroot -pmysql dev</home/mysql/dev.sql
以上就是mysql表数据文件损坏导致数据库无法启动详解的详细内容。