利用表空间(ibd文件)迁移功能实现数据损坏恢复
说明:操作系统突然断电了,启动完成后 / 变为只读了,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