mysql 数据库坏表修复
萝卜白菜,各有所爱,能干活、能修复表才是王道!!!
修复之前谨记:先备份数据库 (备份完成后再进行以下修复操作)
可以mysqldump -A > all.sql 进行全库备份 (mysqldump导出错误的时候可以省略错误的表进行导出其他的数据添加选项 --ignore-table=table_name ) 也可以进入到/usr/local/shell/ 执行 mysql_backup.sh进行备份数据库 以上两种方式都不可以备份 可以进入到/data/mysql/3306目录里面将以下所有文件信息copy一份
针对MyIsam表进行修复方法
1.描述:
在数据库可以进入 mysql程序正常,只有日志中抛有tables错误的时候使用以下修复:
mysql> REPAIR TABLE 表名
3.描述:
在数据库不能进入、数据库程序不能够正常启动的时候使用
mysqlcheck -Aor (此命令在数据库外执行,针对所有myisam的数据库表进行修复 -A=所有all、-o, --optimize 进行对索引优化【重新整理索引】-r, --repair 修复 )
shell# mysqlcheck -Aor 执行的时候会抛出错误(凡是innodb表都会抛错误)
在知道是那个表错误的情况下可以使用以下命令进行修复 (后续可以添加-f选项 force 强制修复,慎用此选项操作)
shell# myisamchk -oar tables.MYI
针对Innodb表修复方法
1.描述:
数据库可以进入 mysql程序正常,只有日志中抛有tables错误的时候使用以下修复:
1、通过mysqldump将错误的表进行导出(仅导出数据即可),确定导出没有问题!
2、进入mysql truncate table 表名
3、通过mysql命令将刚才导出的数据库数据灌入即可搞定
2.描述:
可参考 http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
数据库无法正常启动,日志中存在表错误,index错误信息 修复:
1、在my.cnf文件里面添加
[mysqld]
innodb_force_recovery = 1 (1级别最低通常只是作为跳过表错误正常启动mysql服务)
级别越高,修复难度越大、 (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):不执行前滚的操作。
2、能够正常启动mysql后,上层应用不用启动、防止写入数据出现错误
进入mysql 进行更改错误表的信息
mysql> alter table table_name ENGINE=myisam;
修改完成后使用Myisam的修复方式进行修复
修复完成之后将表更改为innodb 、my.cnf 文件的innodb_force_recovery = 1 注释掉之后重新启动mysql注意观察日志是否抛错
3、通过数据库备份加binlog日志进行恢复,步骤过多,不予写出
仍然可以参考 http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
进行恢复