您的位置 首页 数据库

利用表空间(ibd文件)迁移功能实现数据损坏恢复

利用表空间(ibd文件)迁移功能实现数据损坏恢复

案例02:利用表空间迁移功能实现数据损坏恢复

说明:操作系统突然断电了,启动完成后 / 变为只读了,fsck修复文件系统,系统再次重新启动后,mysql启动不了了

结果:造成confulence库在、jira库不见了(备份没有 日志也没开)

服务:jira(bug追踪)、confluence(内部知识库) 、mysql 5.6.33(innodb引擎 使用独立表空间) -- LNMT架构

硬件:联想服务器(8核 16G内存 500G存储空间 没有raid),centos 6.8系统

对话描述:

学生:这种情况怎么恢复?

老师:有备份吗?

学生:连二进制日志都没有,没有备份,没有主从

老师:jira数据库数据没什么办法了,只能进行硬盘数据恢复了

学生:jira数据库数据先不用关注,数据磁盘已经拉到中关村处理了

​         主要是confulence库还想使用,但将生成中的库目录,导入到其他主机上(var/lib/mysql),无法直接访问数据库中数据?

​         老师有没有工具能直接读取数据库目录中的ibd文件内容

老师:我查查,最后发现没有

​         我们可以尝试下独立表空间迁移

​         create table xx

​         alter table coufulence.t1 discard tablespace;

​         alter table coufulence.t1 import tablespace;

​         虚拟环境测试可行

问题:confulence库中总共有107张表

困惑:如何创建107张和原来一模一样的表

解决:学生环境中有2016年的历史库,让学生利用mysqldump命令备份confulence历史库

​         mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql    只获取所有表结构信息

​         如果是自研数据库,没有备份怎么办

​         mysql工具包中,拥有mysqlfrm工具也可以读取frm文件获取表结构

操作步骤一:备份历史数据库的所有表结构信息,并进行恢复

[root@baimeidashu-01 ~]# mysqldump -uroot -ppassw0rd -B confulence --no-date > test.sql 
mysql > create database confulence
mysql > source test.sql

操作步骤二:删除空表的独立表空间

select concat("alter table ",table_schema,".",table_name," discard tablespace;") from information_schema.tables where table_schema='confulence'; into outfile '/tmp/discard.sql';
source /tmp/discard.sql

实际执行过程发现,有20-30张表无法成功,主外键关系问题,如果一个表一个表分析表结构,处理外键关系很痛苦

set foreign_key_checks=0
-- 跳过外键检查,从而把有问题的20-30张表的独立表空间也删除了

操作步骤三:拷贝生成中confulence库下的所有表的ibd文件到准备好的环境中并加载识别

select concat("alter table ",table_schema,".",table_name," import tablespace;") from information_schema.tables where table_schema='confulence' into outfile '/tmp/import.sql';
source /tmp/import.sql

操作步骤四:进行数据信息验证

表都可以访问了,数据挽回了出现问题时刻的状态

案例03:mysql 5.7中误删除了ibdata1数据文件,导致数据库服务无法启动;(作业)

说明:如何恢复t100w表中数据,并且假设库中有100张表,而且表结构无法通过show create table获得;

提示:有可能是自研数据库,并且没有数据备份

思路:先获取表结构信息,然后重新建表,删除空表的独立表空间,导入表的数据文件,加载识别表数据信息

操作步骤一:mysql工具包中含有mysqlfrm工具,可以读取frm文件获得表结构;

[root@baimeidashu-01 ~]# ./mysqlfrm /data/3306/data/test/t100w.frm --diagnostic

操作步骤二:将新库中所有独立表空间进行删除

select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from informatin_schema.tables where table_schema='confluence' into outfile '/tmp/discard.sql';
source /tmp/discard.sql

 

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章