mysql怎么通过frm和ibd文件还原数据?

作者&投稿:爰德 (若有异议请与网页底部的电邮联系)
mysql怎么通过frm和ibd文件还原数据~

在 InnoDB 中,用户定义的表及其对应的索引数据存储在扩展名为 .ibd 的文件中。表空间有两种类型,常规(或共享)表空间和每表独立表空间。对于共享表空间,来自许多不同表及其对应索引的数据可以驻留在单个 .ibd 文件中。而对于每表独立表空间,单个表的数据及其索引位于一个 .ibd 文件中。. IBD 文件这些文件通常位于数据目录中。让我们尝试创建一个表 test.t1。
mysql>CREATE TABLE test.t1 (c INT) engine=InnoDB;
$ cd /test
$ ls
t1.ibd
上面是独立表空间文件,即与表 t1 相关的表和索引数据将驻留在此文件中。

有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。 1. check table 和 repair table 登陆mysql 终端: mysql -uxxx...

1、找回表结构,如果表结构没有丢失直接到下一步

a、先创建一个数据库,这个数据库必须是没有表和任何操作的。

b、创建一个表结构,和要恢复的表名是一样的。表里的字段无所谓。一定要是innodb引擎的。CREATE TABLE `weibo_qq0`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

c、关闭mysql, service mysqld stop;

d、用需要恢复的frm文件覆盖刚新建的frm文件;

e、修改my.ini 里 innodb_force_recovery=1 , 如果不成修改为 2,3,4,5,6。

f、 启动mysql,service mysqld start;show create table weibo_qq0 就能li到表结构信息了。

2、找回数据。记得上面把 innodb_force_recovery改掉了,需要注释掉,不然恢复模式不好操作。 这里有个关键的问题,就是innodb里的任何数据操作都是一个日志的记录点。也就是如果我们需要数据恢复,必须把之前的表的数据的日志记录点添加到一致。

a、建立一个数据库,根据上面导出的创建表的sql执行创建表。

b、找到记录点。先要把当前数据库的表空间废弃掉,使当前ibd的数据文件和frm分离。 ALTER TABLE weibo_qq0 DISCARD TABLESPACE;

c、把之前要恢复的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm发生关系。ALTER TABLE weibo_qq0 IMPORT TABLESPACE; 结果不出意外肯定会报错。就和我们开展数据开始说的那样,数据记录点不一致。我们看看之前ibd记录的点在什么位置。开始执行 import tablespace,报错 ERROR 1030 (HY000): Got error -1 from storage engine。找到mysql的错误日志,InnoDB: Error: tablespace id in file ‘.testweibo_qq0.ibd’ is 112, but in the InnoDB InnoDB: data dictionary it is 1. 因为 weibo_qq0 之前的记录点在112,当前的表只创建一次,所以记录点是1.

d、那怎么从1记录到112。for ($1=1; $i<=111; $1++) {CREATE TABLE t# (id int) ENGINE=InnoDB;} 也许很奇怪,为什么是循环111,不是112。因为在a执行创建表结构的时候已经记录增加了一次。

e、修改表结构 alter table weibo_qq0 discard tablespace;使当前的表结构和ibd脱离关系。复制.ibd到当前的目录结构。

f、使原来数据的ibd和当前frm建立关系。 ALTER TABLE product IMPORT TABLESPACE; 这个时候没有错误,说明已经建立好了。但是查询数据还是查不出来。

g、相比这里大家已经知道为什么了,这个模式也不是说改了数据库就可以在生产环境使用。更改 innodb_force_recovery=1 , 如果不成修改为 2,3,4,5,6。直到可以 查询出数据为止,然后dump出来。数据就备份出来了。

h、把所有数据导出后,在新的数据库导入。所有数据就生成了。

扩展问题,很多时候我们是分表表结构怎么批量操作,提高速度呢。用循环!循环把表的空间废弃掉。

for i in `seq 0 111`; do mysql -uroot -P33061 -h127.0.0.1 -Dtestdd -e “CREATE TABLE inv_crawl_weibo_qq$i (id bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)) ENGINE=innodb “; done

ALTER TABLE inv_crawl_weibo_qq0 DISCARD TABLESPACE;

从备份数据把ibd复制cp到dd数据库下,注意复制过来的文件权限。

循环导入表空间。

ALTER TABLE inv_crawl_weibo_qq0 IMPORT TABLESPACE;

没有报错就导入成功了

  • 创建已经丢失的表结构

  • 先要安装 mysql-utilities。

    // RedHatyum -y install mysql-server mysql-utilities// Debianapt install mysql-utilities

    使用 mysqlfrm 从 .frm 文件里面找回建表语句。

    // 分析一个 .frm 文件生成建表的语句mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm// 分析一个目录下的全部.frm文件生成建表语句root@username:~# mysqlfrm --diagnostic /var/lib/mysql/my_db/bk/ >createtb.sqlroot@username:~# grep "^CREATE TABLE" createtb.sql |wc -l124

    可以看到一共生成了 124 个建表语句。

    有很多时候也可以从其它库里面生成建表语句,如同一个应用的其它数据库或不同的测试环境,采用下面的 mysqldump 生成建表语句:

    mysqldump --no-data --compact my_db>createtb.sql

    登录 MySQL 生成表。

    mysql> create database my_db;mysql> use my_dbDatabase changedmysql> source createtb.sqlQuery OK, 0 rows affected (0.07 sec)......

  • 导入旧的数据文件

  • 将新建的没有包括数据的 .ibd 文件抛弃

    root@username:/var/lib/mysql/my_db# ll *.ibd|wc12411167941root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \| grep -v  Tables_in_my_db  \| while read a; do mysql -e "ALTER TABLE my_db.$a DISCARD TABLESPACE"; doneroot@username:/var/lib/mysql/my_db# ll *.ibd|wcls: cannot access '*.ibd': No such file or directory000

    可以看到所有的 .idb 文件都已经被抛弃了。然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。

    root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \| grep -v  Tables_in_my_db  \| while read a; \do mysql -e "ALTER TABLE my_db.$a import TABLESPACE"; done

  • 导入完成后检查表

  • 使用 mysqlcheck 对数据库 my_db 下的所有表进行检查:

    root@username:/var/lib/mysql/my_db# mysqlcheck -c my_dbmy_db.cdp_backup_point                             OK......

    所有的表都导入成功。




mysql 有几种索引
WHILE i < f_cnt DO SET i = i + 1; IF j = 100 THEN SET j = 0; COMMIT; END IF; SET j = j + 1; INSERT INTO f1 (f1,f2) SELECT CEIL(RAND()*100),CEIL(RAND()*100); END WHILE; COMMIT; SET @@autocommit=1; END$$ DELIMITER ; 生成1W条记录 mysql> call sp_generate_data_...

mysql怎么进入mysql怎么进入某一个库
MySQL如何使用?解压MySQL(F:ProgramFilesMySQL)MySQL安装目录二新建my.ini在F:ProgramFilesMySQL下建立my.ini文件,内容为my.ini#设置mysql的安装目录basedir=F:ProgramFilesMySQL#设置mysql数据库的数据的存放目录,必须是data,或者是xxx-datadatadir=F:ProgramFilesMySQLdata#设置mysql服务器的字符集,默...

mysql 如何查找带有\\符号的记录
由于 \\ 在mysql中是转义字符,所以你的查询条件要多个 \\,这样转义之后就还有一个\\ select * from Table1 where 文件路径='F:\\\\test.md'

MySQL数据库中建表字段性别(sex)的类型
CREATE TABLE t_user (id INT(11) NOT NULL AUTO_INCREMENT,sex CHAR(2) NULL,PRIMARY KEY (id),CONSTRAINT sex CHECK (sex in('男','女')));

mysql怎么通过frm和ibd文件还原数据
c、关闭mysql, service mysqld stop;d、用需要恢复的frm文件覆盖刚新建的frm文件;e、修改my.ini 里 innodb_force_recovery=1 , 如果不成修改为 2,3,4,5,6。f、 启动mysql,service mysqld start;show create table weibo_qq0 就能li到表结构信息了。2、找回数据。记得上面把 innodb_force_...

navicat for mysql 函数f和p的区别是什么
函数就是必须有返回值的,定义的时候强制指定,p就是存储过程,可以输出参数,也可以不输出参数。这就是二者的区别

如何导入导出MySQL数据库_MySQL
式mysqldump -u用户名 -p 数据库名 > 数据库名.sql范例:mysqldump -uroot -p abc > abc.sql(导出数据库abc到abc.sql文件)提示输入密码时,输入该数据库用户名的密码。2.2. 创建空的数据库通过主控界面\/控制面板,创建一个数据库。假设数据库名为abc,数据库全权用户为abc_f。2.3....

mysql创建数据库的时候如何设置性别列只能为男或女默认男
2. 在创建MySQL数据库时,性别列可以使用TINYINT类型,并且设置为枚举值,例如'M'代表男性,'F'代表女性。这样,性别列的值只能是预定义的男性或女性。3. 您还可以使用CHECK约束来确保性别列的值只能是'M'或'F'。在创建表时,通过添加CONSTRAINT约束来实现这一点,例如:CREATE TABLE Users (... ...

怎么给mysql用户File权限
查看MySQL用户权限:show grants for 你的用户比如:show grants for root@'localhost';Grant 用法GRANT USAGE ON *.* TO 'discuz'@'localhost' IDENTIFIED BY PASSWORD '*C242DDD213BE9C6F8DA28D49245BF69FC79A86EB';GRANT ALL PRIVILEGES ON `discuz`.* TO 'discuz'@'localhost';我先按我的...

mysql导入数据库命令
通过主控界面\/控制面板,创建一个数据库。假设数据库名为abc,数据库全权用户为abc_f。2.3. 将SQL脚本导入执行 同样是两种方法,一种用phpMyAdmin(mysql数据库管理)工具,或者mysql命令行。2.3.1 用phpMyAdmin工具 从控制面板,选择创建的空数据库,点“管理”,进入管理工具页面。在"SQL"菜单中,...

芮城县15347536483: mysql怎么通过frm和ibd文件还原数据 -
古览干彼: 有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具.前者使用起来比较简便.推荐使用. 1. check table 和 repair table 登陆mysql

芮城县15347536483: 如何将frm文件导入MySql数据库 -
古览干彼: 只要在mysql的安装文件中找到data文件夹,然后在里面建立一个文件夹,比如test.这个test其实就对应着数据库的名称,所以,你想要起什么样的数据库名称就把文件夹起什么名字. 然后把.frm文件导进去.注意还要在data目录下加入ib_...

芮城县15347536483: 如何导入空间商备份的.frm,.myd,.myi格式mysql数据 -
古览干彼: 怎么会是这样呢,经过查看网上后,感觉挺简单的,下面我们先学习一下mysql的数据备份文件.一、MySQL数据库文件介绍 MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,MySQL数据库文件包括MySQL所建数据库文件和...

芮城县15347536483: 数据库是.frm,.myd,myi备份如何导入mysql -
古览干彼: 今天找了个案例,琢磨了半天,才分析大概出来,数据库是.frm,.myd,myi备份,不会导入mysql,到网上找了些资料,导入成功.把mysql数据库的*.frm,*.myd,*.myi,文件导到数据的方法1、最简单就是,直接拷贝到数据库的的data下的数据库文件...

芮城县15347536483: MYSQL怎么样能读取.ibd文件中的数据 -
古览干彼: 有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具.前者使用起来比较简便.推荐使用.1. check table 和 repair table 登陆mysql 终端:mysql -...

芮城县15347536483: frm 文件怎么导入到mysql里面去 -
古览干彼: 确保一个表三个源文件都有 复制到一个新建的数据库就可以看到

芮城县15347536483: 如何把mysql数据库导出.frm格式 -
古览干彼: 直接找到mysql的数据库存放路径,复制出来就行了,不用导出

芮城县15347536483: 如何 根据ibdata和frm文件 恢复数据库 -
古览干彼: 因为磁盘空间不足,我的一个虚拟机服务器崩溃了.结果数据库服务器进程无法启动,数据也就无法导出.只能想办法从数据库原始文件 ibdata 和 frm 文件中恢复数据库.因为没有经验,好不容易才找到了恢复方法.特此记录,以备后用....

芮城县15347536483: 如何将后缀为.frm,opt,myi,myd的mysql数据文件导入到mysql数据库中 -
古览干彼: 在你的MYSQL的数据文件夹下(往往可能是MYSQL安装文件夹的DATA下)新建立一个文件夹作为数据库名,然后把这些文件拷贝到那个数据库文件夹下就可以了.MYSQL里面使用MYISAM数据引擎的情况下,DATA文件夹下一个数据库就是一个文件夹,例如你建立了文件夹DATA\abc,就表示有一个叫做abc的数据库.一个表对应三个文件,你上面的文件拷贝到DATA\abc下,就有了admin、bbs_main、bbs_ref几个表.

芮城县15347536483: 怎么将.frm .myd .myi导入mysql数据库 -
古览干彼: .frm格式就直接放到MYSQL的安装目录下的DATA文件夹中

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网