数据库恢复不了? 不存在的!数据库

来源:互联网 / 作者:SKY / 2018-07-04 01:06 / 点击:
工作中大家经常会用到存储服务,比如mysql、mongo、redis等,有DBA的话还好,能帮我们管理维护,定期备份等,但是我们往往自己在开发工具平台时自己来搞数据库,

工作中大家经常会用到存储服务,比如mysql、mongo、redis等,有DBA的话还好,能帮我们管理维护,定期备份等,但是我们往往自己在开发工具平台时自己来搞数据库,就忽略了定时备份,留下了安全隐患。果不其然,最近收到了团队小伙伴的求助,服务器挂了,重启后mysql服务起不来了。关键是没有备份!!

数据库恢复不了? 不存在的!

经过一番折腾后将处理过程和踩的坑总结出来,供大家参考。MySQL crash 或者 MySQL 数据库服务器 crash 会导致各种各样的问题 ,比如日志损坏、数据文件损坏等等,本案例就是其中的一种,细心从日志中找的相关错误提示,逐步解决即可。首先在出现问题的A机器启动mysql,看下情况。

数据库恢复不了? 不存在的!

查看mysql错误日志,找找原因

数据库恢复不了? 不存在的!

从日志内容分析来看,数据库在机器crash 导致文件损坏,重启之后无法正常恢复,更无法正常对外提供服务。这里采用非常规手段,首先修改innodb_force_recovery参数,使mysqld跳过恢复步骤,再将mysqld 启动,把数据导出来,然后重新创建数据库。

先来普及一下知识点:

数据库恢复不了? 不存在的!

innodb_force_recovery可以设置为1-6,默认是0,大的数字包含前面所有数字的影响。

1. (SRV_FORCE_IGNORE_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):不执行前滚的操作。

注意当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update、 delete这类操作是不允许的。

将/etc/my.cnf下innodb_force_recovery值修改为4后,启动mysql成功

数据库恢复不了? 不存在的!

马上导出数据

/usr/local/mysql/bin/mysqldump -uroot -h localhost -P 3306  -p --default-character-set=latin1 --add-drop-database --lock-tables --single-transaction -q --triggers -A --result-file=/home/fuhaitao/3306.sql 

导出成功后找一台B机器,在mysql实例里导入这个sql文件。

mysql -uroot -p -S /tmp/mysql3333.sock --default-character-set=latin1 < 3306.sql 

大功告成,马上去看下数据是否正常

数据库恢复不了? 不存在的!

悲催。。。乱码,查看mysql编码方式

数据库恢复不了? 不存在的!

编码是utf8,可是我在A机器导出的时候指定了字符集为latin1,所以修改编码为Latin1看下

数据库恢复不了? 不存在的!

在查看下数据还是乱码么

数据库恢复不了? 不存在的!

不行,说明导入的数据编码与数据库的编码不一致,而且发现由于机器使用人员较多,每个数据库编码都不一致,有utf8的有latin1的,那么只能挨个库来导了。

回到A机器将刚才是乱码的database指定utf8编码导出

数据库恢复不了? 不存在的!

将sql文件传到B机器

数据库恢复不了? 不存在的!

在B机器上进行导入

数据库恢复不了? 不存在的!

执行后在查看下数据是否正常

数据库恢复不了? 不存在的!

欧耶,成功。再将A机器mysql停掉,修改/etc/my.cnf 里的innodb_force_recovery值改为0。经过一番折腾,终于把问题解决了,恢复了5年的数据。

数据库恢复不了? 不存在的!

最后给大家提几点建议:

1. 如果公司有DBA团队,尽量使用DBA团队的存储服务,他们能够提供专业的支持。

2. 数据库要做定时备份,避免特殊情况发生导致文件损坏,数据丢失。

3. 导入数据时要查看编码方式,保证数据库、数据文件、编辑器等编码方式统一。

【编辑推荐】

从删库到跑路or恢复,记一次MySQL数据库文件损坏恢复经历

数据库MySQL索引优化分析

分布式之Redis数据库复习精讲

7 月全球数据库排名:MongoDB 紧追 PostgreSQL

数据库管理系统:中国还在寻找“正确打开方式”

阅读延展

1
3