somethings

任何技术都要找到适合的场景,都不是万能的。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql无法启动的情况下数据恢复

Posted on 2019-12-25 19:00  somethings  阅读(1375)  评论(0)    收藏  举报

背景:服务器在前一周到期关闭了,所有服务要重新启动,但mysql启动一直报错,尝试了各种方法都无法启动,项目原因决定重装mysql并尝试恢复数据。

 

前置准备:因为之前项目没有做过备份,所以需要把整个数据库文件下载到本地(可以到/ept/my.cnf查看数据库数据存放位置,data='位置'),包括ibdata1*、ib_logfile0、ib_logfile1

 

数据文件下载到本地后,重装Mysql,开始恢复数据(不同引擎恢复方式不同)

1. MyIASM

如果表使用的是MyIASM引擎,直接将数据文件拷到重装后的Mysql data目录下(my.cnf的data配置指向位置),重启数据库(命令service mysql restart),数据恢复。

 

2. InnoDB 

InnoDB恢复比较麻烦

InnoDB有2个文件,frm、ibd

.frm文件:保存了每个表的元数据,包括表结构的定义等;

.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。

1.关闭mysql (service mysql shop)

2.将要恢复的数据库文件拷到mysql的data目录下

3.到my.cnf配置文件中,添加innodb_force_recovery=6进入恢复模式,保存后退出

只有在紧急情况下将innodb_force_recovery设为大于0的值,你才能启动InnoDB并转储表。在进行此操作之前,确保你有数据库的备份副本,以备需要重建它。4及以上的值可以永久破坏数据文件。只有在数据库的独立物理副本的成功地测试了设置,才能在生产服务器实例使用4及以上的innodb_force_recovery设置。当强制InnoDB恢复,你应该总是以innodb_force_recovery=1启动,且仅在需要时增加值。

innodb_force_recovery默认为0(没有强制恢复的正常启动)。对于innodb_force_recovery允许的非零值是1至6。较大值包括较小值的功能。例如,为3的值包括所有的值1和2的功能。

如果你能以innodb_force_recovery为3或更低值转储你的表,那么你是比较安全的,只有在损坏的个人页的一些数据会丢失。4或更大的值被认为是危险的,因为数据文件可以被永久地损坏。值6被认为是严重的,数据库页被留在一个陈旧的状态,这反过来又可能带给B-trees和其它数据库结构更多的损坏。

作为一个安全措施,InnoDB 在innodb_force_recovery大于0时阻止INSERT,UPDATE或DELETE操作。对于MySQL5.6.15,将innodb_force_recovery设为4或更高会让InnoDB处于只读模式。

4.启动mysql(service mysql start),使用可视化工具查看,表结构已经恢复,但是点击表会报错

5.接下来恢复数据,关闭mysql,到my.cnf将innodb_force_recovery改为1

6.将下载的本地的ibdata1替换data下的ibdata1(ibdata用来储存文件的数据,而库名的文件夹里面的那些表文件只是结构而已),对数据库下的ibd文件授权给mysql(chown mysql 文件名)

7.启动mysql,数据已恢复

8.将my.cnf的innodb_force_recovery去掉,重启mysql就完成了。