通过.frm和.ibd恢复mysql数据
.frm文件:保存了每个表的元数据,包括表结构的定义等;
.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。
1、安装相同版本的mysql;
找回表结构
2、找回表结构(若有表结构,直接导入表即可)
- 建立同名的表(InnoDB),不知道列数的话随意一个字段即可(如果字段个数不一致会报错,去日志文件中查看有列数重复这些步骤)
- 关闭mysql服务
- 用需要恢复的.frm文件覆盖新生成的.frm文件。
- 修改my.ini配置innodb_force_recovery = 6进入恢复模式(只读)。
- 启动mysql服务。
- desc tble_name或者show create table tbl_name获取创建表结构语句。(直接查看表设计字段会导致数据库异常)
- 复制建表sql,删除表(不能直接删.frm和.ibd会导致新建时报已存在,如果直接删除文件,需要将frm文件拷贝回来,再drop表),执行sql创建表结构。(这个步骤要把innodb_force_recovery = 6注解掉或者回复为0,不然提示只读)。
这里会出现启动后没有表结构,这是需要查看mysql的日志文件
找到日志文件位置:
show variables like '%error%'
这里的.是相对于mysql的,windows可以根据快捷方式找到mysql位置然后再找.err错误文件
找到报错信息为
2018-12-18T08:52:30.314230Z 2 [Warning] InnoDB: Table bookkeeping/concategory contains 1 user defined columns in InnoDB, but 3 columns in MySQL.
意思是新建的有1列,但是复制过来的frm文件中含有3列。这时候知道列数,重做上述步骤。
恢复数据
删除新建的表空间
单个执行删除表空间语句
ALTER TABLE <table_name> DISCARD TABLESPACE;
批量删除空间,执行以下语句。
SELECT CONCAT('ALTER TABLE ', table_name, ' DISCARD TABLESPACE;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name';
获得每个表的删除表空间语句,直接全部选中复制(Navicat)
在前后加上外键约束检查关闭和开启执行
2.将待恢复的<table_name>.ibd文件copy到目标数据库文件夹下(这时候在navicat中看不到表名,不要慌!!!),并修改文件权限(chown u:g file),批量修改权限chown mysql:mysql /usr/mysql/data/db_name/*
导入表空间
单个执行导入表空间语句
ALTER TABLE <table_name> IMPORT TABLESPACE;
批量导入表空间
SELECT CONCAT('ALTER TABLE ', table_name, ' IMPORT TABLESPACE;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name';
这里和删除一样,不赘述,复制所选语句,加上关闭开启检查,执行
可能出现问题
1.mysql 1808错误:这是由于mysql 5.6的文件恢复到mysql 5.7版本导致的错误,需要在建表语句后面添加ROW_FORMAT=COMPACT
2.mysql 1812错误:copy的ibd文件没有赋权,用chown u:g file
3.mysql 1451错误: Cannot delete or update a parent row: a foreign
在前后加上
SET foreign_key_checks = 0; -- 先设置外键约束检查关闭
SET foreign_key_checks = 1; -- 开启外键约束检查,以保持表结构完整性
总结
1.建立表结构(有备份直接用,跳过第一步的找回表结构)
2.删除新建的表空间
3.拷贝.ibd数据文件覆盖新建的文件
4.导入表空间
以下内容和技术无关(身体是革命的本钱,不可用命换钱):
今日烹饪经验
土豆烧肉烧时,肉要顺着纹理切(不然容易碎),烧时可以多放生抽(提鲜),但是老抽千万不能超过半铲子(不然会变成碳),图就不放了,影响大家胃口。
通过.frm和.ibd恢复mysql数据的更多相关文章
- 利用.frm、.ibd恢复数据
我们知道启用innodb_file_per_table选项后,单个表(InnoDB引擎)的数据和索引放入单独的文件中(.ibd),建表语句保存在.frm文件中本文假设192.168.85.132,33 ...
- frm和ibd恢复sql文件的操作
情况:有mysql中data文件(仅仅一个数据库) 操作:frm和ibd恢复sql文件的操作 1.创建相同名字的库xxx 2.把ibdata1替换成原来的 3.把数据库xxx内内容全部替换为原来的 完 ...
- Centos7下Mysql通过.frm和.ibd恢复数据
通过.frm和.ibd文件恢复表结构和数据 这里以hue数据库中的desktop_document2表为例 分成两步骤,先去表结构,再取数据,最好在一个用完就可以删除的数据库中进行 取表结构篇: 1. ...
- .frm和.ibd恢复数据
昨日晚上开发告诉我不小心truncate两个表的数据,要求还原.结果在阿里云上找到了备份内容,结果是物理备份文件.frm..ibd.心中一万个草泥马啊..没办法,开始还原吧. 1.查看测试机Mysql ...
- 通过.ibd和.frm恢复mysql数据
背景:因为机器损坏,数据库的索引文件什么的都损坏了.只留下了一个mysql的data目录… 此方法恢复数据的前提:建表用的innodb索引 备注:如果mysql的目录还都在,可以先尝试,将mysq ...
- mysql InnoDB通过.frm和.ibd恢复表和数据
ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据.撤销记录.修改buffer和双写buffer.如果file-per-table选项打开的话,该文件则不一 ...
- Mysql ibd恢复(delete 数据)
转载:https://www.linuxidc.com/Linux/2017-05/143870.htm 首先呢,请各位注意Percona Data Recovery Tool for InnoDB工 ...
- MySQL--通过.frm和.ibd对mysql数据恢复
转载:http://bbs.csdn.net/topics/392114182 例如说 现在要恢复user表1.先建立和之前user表一样的表结构.就是执行create table user .... ...
- linux 通过scp 复制备份恢复mysql数据表
最近客户有个需求,小弟对于运维的东西也是半瓶醋,所以就果断的摸索了下.折磨了一个晚上终于算是搞定了.因为是两个不同的服务器,本来想用ftp,无奈小弟不是很熟悉,所以就用了scp,但是scp有个问题就是 ...
随机推荐
- uniGUI试用笔记(二)
前几天做的demo今天启动后,浏览器打开页面后死活不显示窗体,找了半天原因才发现是360浏览器启动了兼容模式,改成极速模式后就正常了.有点晕.... 今天简单测试了TUniGUIServerModul ...
- innerHTML和 innerText的区别
共同点:innerHTML和innerText都会把元素内内容替换掉.不同点:1,innerHTML: 也就是从对象的起始位置到终止位置的全部内容,包括Html标签. 上例中的test.innerHT ...
- class类的使用
我们在ES5中经常使用方法或者对象去模拟类的使用,虽然可以实现功能,但是代码并不优雅,ES6为我们提供了类的使用.需要注意的是我们在写类的时候和ES5中的对象和构造函数要区分开来,不要学混了. 类的声 ...
- BZOJ 4771 七彩树(可持久化线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4771 思路 和 HDU 3333 其实有点像,不过是把序列的问题放在了树上,多维护一个深度即 ...
- 【Hadoop 分布式部署 二:分布式环境预备工作(主机名 IP地址等设置)】
1.首先使用工具连接上 这三台虚拟主机 2.配置主机名 切换到 root 用户 第一种方式 可以使用命令 hostname [要更改的主机名] 但是这种更改主机名的方式 ...
- java web 工程更改名字
如图: 将工程名字struts2Project02更改为struts2Project03,步骤如下: 1. 右键工程名字,选中properties,如图 2.更改项目名字 3.第2步已经真正把项目名字 ...
- Sqlserver中分页,2012后支持offset + fetch,2012之前用rownum嵌套查询
今天发现原先用的sql offset fetch好用,换了一个DB就歇菜 歇菜截图 比较了一下,是数据库版本的问题 一个是13,一个是10 版本低的不支持用offset + fetch 进行分页,ms ...
- phpredis基本操作
字符串,用于存储变动少的信息 创建对象 $red = Red::create(); 设置值 $red->set('name','张三'); 设置有效期 $red->set('name',' ...
- art-template
art-template 输出 标准语法 {{value}} {{data.key}} {{data['key']}} {{a ? b : c}} {{a || b}} {{a + b}} 原始语法 ...
- JavaSE习题 第九章 输入输出流
问答题 1.如果准备读取一个文件的内容,应该使用FileInputStream还是FileOutputStream? FileInputStream 2.FileInputStream流的read() ...