mysql服务器硬盘损坏后的数据恢复

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 摘要:      在实际工作中遇到了mysql服务器硬盘挂掉的情况,并且无slave无备份。此时就只能去恢复硬盘的数据了。本文根据一次实战操作整理,分别用4种办法尝试修复数据。

摘要:

     在实际工作中遇到了mysql服务器硬盘挂掉的情况,并且无slave无备份。此时就只能去恢复硬盘的数据了。本文根据一次实战操作整理,分别用4种办法尝试修复数据。我们首先拿到了坏硬盘上的文件,在新服务器上安装同样版本的mysql准备恢复。

普通恢复:

此方式是把mysql的数据目录与my.cnf文件拷贝到新数据库目录,正常启动数据库。如果数据目录没有损坏,正常启动后应能正常读写数据,error日志无报错。
但是我们恢复时报了大量的错误,由此可见ibdata文件或redo日志已经被损坏,继续使用其他方式恢复。

附部分error信息:

InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 5.
InnoDB: You may have to recover from a backup.
InnoDB: See also http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.

InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Error: space id in fsp header 3221244024, but in the page header 268454008
InnoDB: Error: tablespace id 4294967295 in file .\game\area_element_table.ibd is not sensible
InnoDB: Cannot continue operation.
InnoDB: You can try to recover the database with the my.cnf
InnoDB: option:
InnoDB: innodb_force_recovery=6

InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.

innodb_force_recovery方式:

我们根据上面的error日志提供的信息,在my.cnf的[mysqld]里面加入参数innodb_force_recovery,使用1-6级逐步尝试恢复。参考链接:http://who0168.blog.51cto.com/253401/551068
这种方式对于常规的数据库崩溃或服务器崩溃是奏效的,可以绕过损坏的redo log。但我们实际操作时将级别提升至6仍无法启动,说明ibdata可能有损坏。继续下面的修复方式。

附部分error信息:

error日志和上面的差不多,这里仅贴出有差异的部分
InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on
InnoDB: Skipping log redo
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 7.

InnoDB: Error: trying to access page number 16766859 in space 0,
InnoDB: space name .\ibdata1,
InnoDB: which is outside the tablespace bounds.
InnoDB: Byte offset 0, len 16384, i/o type 10.
InnoDB: If you get this error at mysqld startup, please check that
InnoDB: your my.cnf matches the ibdata files that you have in the
InnoDB: MySQL server.

修复ibdata方式:

独立表空间模式下,ibdata的作用是存放内部数据字典和重作日志。 在ibdata文件丢失或损坏的情况下,利用frm和ibd文件,以及数据库的表结构,也可以尝试恢复数据。

1、DISCARD、IMPORT TABLESPACE方式:

    注:此方式未修复成功,仅供参考
   1)新建数据库,创建需要恢复的数据库的表结构。
   2)service mysqld stop,将需要恢复的frm文件覆盖刚刚新建的frm,并设置权限为mysql。service mysqld start,启动时加上参数innodb_force_recovery=6。
   3)ALTER TABLE xx DISCARD TABLESPACE; 复制ibd文件到数据目录。 service mysqld stop
   4)service mysqld start,启动时加上参数innodb_force_recovery=6。再ALTER TABLE xx IMPORT TABLESPACE;

2、修改ibd文件方式:

    注:此方式亲测可用
    1)新建数据库,创建需要恢复的数据库的表结构。
   2)
使用vim打开此表的ibd文件,16进制查看
        [root@localhost test]# vim -b tmp.ibd 
         :%!xxd 
        
    3)使用vim打开要恢复的ibd文件,16进制查看
        

     4)修改要恢复的ibd文件,将红方框中的值修改的和刚刚创建的新表的ibd文件一致。看到后面0000没,我们只需要修改文件头就可以了。00000c0以后的不用修改。
        [root@localhost test]# vim -b tmp.ibd 
         :%!xxd -r     #一定要先执行这一步
        :wq
     5)拿需要恢复的ibd文件覆盖刚刚创建的新表的ibd文件。修改文件权限为mysql用户。
     6)重启mysql,重启时加上参数innodb_force_recovery = 6。
    7)执行select操作,读取正常,但无法执行更新操作。将数据dump出来,重建表。找回数据成功。

mysqlbinlog方式:    

      在沟通的过程中我们了解到,在此前他们对数据库进行过一次清空操作。如果能找到当时清空数据库的时间点,利用mysqlbinlog进行一次日志回放,也是可行的。
     实际操作过程中对方无法提供清空数据库的准确时间点,回放binlog时错误不断,数据的准确性无法保证,最终作罢。
     此方式的适用场景:
     1)有此前的数据库备份及备份后的binlog
     2)能查到清空数据库的时间点
     

参考资料:

1.http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
2.http://who0168.blog.51cto.com/253401/551068
3.Mysql ibdata 丢失或损坏如何通过frm&ibd 恢复数据 http://www.lanceyan.com/tech/mysql/lost-ibdata-recover-data.html
4.MySQL:如何从ibd文件中恢复数据  http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7558.html



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
Oracle 关系型数据库 数据库
服务器数据恢复—服务器raid5阵列数据恢复案例
一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统,部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动,ORACLE数据库也无法启动。
40 17
|
17天前
|
运维 数据挖掘 Windows
服务器数据恢复—服务器硬盘指示灯亮黄灯的数据恢复案例
服务器硬盘指示灯闪烁黄灯是一种警示,意味着服务器硬盘出现故障即将下线。发现这种情况建议及时更换硬盘。 一旦服务器上有大量数据频繁读写,硬盘指示灯会快速闪烁。服务器上某个硬盘的指示灯只有黄灯亮着,而其他颜色的灯没有亮的话,通常表示这块硬盘出现故障,这时候更换新硬盘同步数据即可。 如果没有及时发现硬盘损坏或者更换硬盘失败导致服务器崩溃,应该如何恢复数据呢?下面通过一个真实案例讲解一下服务器硬盘指示灯亮黄色的数据恢复案例。
|
3天前
|
数据挖掘 数据库
服务器数据恢复—Zfs文件系统下误删除数据的恢复案例
服务器数据恢复环境&故障: 一台zfs文件系统的服务器,管理员误操作删除了服务器上的数据。
|
6天前
|
存储 数据挖掘 数据库
服务器数据恢复—EMC UNITY 400存储卷被误删除的数据恢复案例
EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组POOL上的部分数据卷。
|
13天前
|
存储 算法 数据挖掘
服务器数据恢复—nas中raid6阵列失效,存储无法访问的数据恢复案例
一台nas上共有14块硬盘组建了一组raid6磁盘阵列。 该nas在工作过程中,raid6阵列中硬盘出现故障离线,导致raid6阵列失效,nas无法正常访问。
|
20天前
|
存储 数据挖掘 数据库
服务器数据恢复—OceanStor存储数据恢复案例
华为OceanStor T系列某型号存储中有一组由24块机械硬盘组建的一组RAID5阵列。 运行过程中该存储设备RAID5阵列上多块硬盘出现故障离线,阵列失效,存储中数据无法访问。
|
26天前
|
SQL 存储 关系型数据库
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
77 12
|
18天前
|
存储 数据挖掘
服务器数据恢复—zfs文件系统服务器数据恢复案例
一台配有32块硬盘的服务器在运行过程中突然崩溃不可用。经过初步检测,基本上确定服务器硬件不存在物理故障。管理员重启服务器后问题依旧。需要恢复该服务器中的数据。
|
26天前
|
运维 数据挖掘 索引
服务器数据恢复—Lustre分布式文件系统服务器数据恢复案例
5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致这5台节点服务器进水,每台服务器都有至少2块硬盘出现故障。每台服务器中的RAID5阵列短时间内同时掉线2块或以上数量的硬盘,导致RAID崩溃,服务器中数据无法正常读取。
|
1月前
|
存储 数据挖掘
服务器数据恢复—V7000存储上多块Mdisk成员盘出现故障的数据恢复案例
服务器存储数据恢复环境: 一台V7000存储上共12块SAS机械硬盘(其中1块是热备盘),组建了2组Mdisk,创建了一个pool。挂载在小型机上作为逻辑盘使用,小型机上安装的AIX+Sybase。 服务器存储故障: V7000存储中磁盘出现故障,管理员发现问题后立即更换磁盘。新更换的硬盘在上线同步数据的时候,存储上另一块磁盘也出现问题,导致逻辑盘无法挂接在小型机上,业务暂时中断。V7000存储的管理界面上显示两块硬盘故障脱机。 pool无法加载,其中三个通用卷均无法挂载。

热门文章

最新文章