问题:
启动mysql,报错误:无法启动mysql服务,错误1067。
在日志中可以查看到类似以下的错误:
Plugin 'FEDERATED' is disabled.
Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
Fatal error: mysql.user table is damaged or in unsupported 3.20 format.
解决方法:
1.如果数据不重要或已经有备份,只需要恢复mysql启动
进入mysql目录,一般是:/usr/local/var/mysql/
删除ib_logfile*
删除ibdata*
删除所有数据库物理目录(例如数据库为test_db,则执行rm -rf test_db)
重启动mysql
重新建立数据库或使用备份覆盖
2.如果数据很重要且没有备份
可以使用innodb_force_recovery参数,使mysqld跳过恢复步骤,启动mysqld,将数据导出然后重建数据库。
(1)、首先设置my.cnf中的参数,windows操作系统是my.ini文件,有时这个文件会在windows文件夹中也有一份,我是同时修改的。具体的修改内容为:
innodb_force_recovery = 6
innodb_purge_thread = 0
(2)、在终端使用命令带参数启动:
我在windows上使用的命令是:mysqld --defaults-file=../my.ini --user=mysql --skip-grant-tables
看到mysqld进程后,证明重启mysql成功
这时只可以执行select,create,drop操作,但不能执行insert,update,delete操作 ,这时可以在终端或者用Navicat等对数据库中的重要信息进行备份导出。
(3)、执行导出后,可以使用mysqlcheck进行检查和修复,如果能修复成功,就不用重装mysql了。如果修复不成功的话,就要重装mysql了,再把备份的数据库内容导入即可。
总结:
1、MySQL并没有那么脆弱,没必要在损坏的时候就通过备份恢复的方式执行还原,费时费力;
2、启动过程中,可以通过设置--skip-grant-tables或者设置innodb_force_recovery(这个参数要修改cnf文件)来让MySQL跳过一些检查,使实例成功启动;
3、启动之后,可以执行数据备份或者导出数据,并且尝试对实例做修复;
备忘,参数的详细内容:
1、innodb_force_recovery 可以设置为1-6,大的数字包含前面所有数字的影响
(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。
------------------------
2、mysqlcheck 常用选项
A, –all-databases 表示所有库
-a, –analyze 分析表
-o, –optimize 优化表
-r, –repair 修复表错误
-c, –check 检查表是否出错
–auto-repair 自动修复损坏的表
-B, –databases 选择多个库
-1, –all-in-1 Use one query per database with tables listed in a comma separated way
-C, –check-only-changed 检查表最后一次检查之后的变动
-g, –check-upgrade Check for version dependent changes in the tables
-F, –fast Check tables that are not closed properly
–fix-db-names Fix DB names
–fix-table-names Fix table names
-f, –force Continue even when there is an error
-e, –extended Perform extended check on a table. This will take a long time to execute.
-m, –medium-check Faster than extended check option, but does most checks
-q, –quick Faster than medium check option