背景:服务器在前一周到期关闭了,所有服务要重新启动,但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就完成了。