如何从ibd文件中恢复数据
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。
1. check table 和 repair table
登陆mysql 终端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:
myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。
需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)
有两种方法,一种方法使用mysql的check table和repair table 的sql语句,另一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。 1. check table 和 repair table 登陆mysql 终端: mysql -uxxx...
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据.
#创建表
CREATE TABLE `ibdtest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fid` int(11) NOT NULL COMMENT '表b中的id',
`content` char(255) NOT NULL COMMENT '操作内容,系统生成',
`mark` char(255) NOT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
#添加数据
INSERT ibdtest (fid,content,mark) VALUES (1,'1','1'),(2,'2','2');
SELECT * FROM ibdtest;
关闭MySQL将ibdtest.ibd copy出来,放到其他数据库中来模拟灾难.
[root@localhost ~]#/opt/soft/mysql/bin/mysqladmin -p123456 shutdown
120130 18:31:50 mysqld_safe mysqld from pidfile /opt/soft/mysql/60137.localdomain.pid ended
[1]+ Done /opt/soft/mysql/bin/mysqld_safe--defaults-file=/opt/soft/mysql/config/my.cnf --user=mysql
[root@localhost ~]# cd /home/soft/mysql/data/test/
[root@localhost test]# ll
total 1296
-rw-rw----. 1 mysql mysql 8612 Jan 18 00:06 a.frm
-rw-rw----. 1 mysql mysql 98304 Jan 18 00:24 a.ibd
-rw-rw----. 1 mysql mysql 8624 Jan 30 08:34 area.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 08:36 area.ibd
-rw-rw----. 1 mysql mysql 8642 Jan 18 00:05 b.frm
-rw-rw----. 1 mysql mysql 98304 Jan 18 00:08 b.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 18:27 ibdtest.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 18:28 ibdtest.ibd
-rw-rw----. 1 mysql mysql 8728 Jan 6 16:23 testa.frm
-rw-rw----. 1 mysql mysql 98304 Jan 10 04:10 testa.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 14:30 testmc.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 14:30 testmc.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 13:54 testme.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 13:55 testme.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 14:40 testmm.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 14:45 testmm.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 13:40 testmu.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 13:40 testmu.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 11:08 testmv.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 11:10 testmv.ibd
-rw-rw----. 1 mysql mysql 8694 Jan 4 21:55 testuser.frm
-rw-rw----. 1 mysql mysql 98304 Jan 4 22:04 testuser.ibd
-rw-rw----. 1 mysql mysql 8644 Jan 14 21:55 user.frm
-rw-rw----. 1 mysql mysql 98304 Jan 14 21:55 user.ibd
[root@localhost test]# cp ibdtest.ibd /home/download/
[root@localhost test]# cd /home/download/
#vim打开ibd,使用16进制查看
[root@localhost download]# vim -b ibdtest.ibd
:%!xxd
从下图中能看到 此表在 当前mysql数据库中的id为0x10,即16.
此时,我们假设灾难发生,ibdata损坏…
只剩下了ibdtest.ibd文,我们跳转到另一个mysql服务器上,用同样的建表语句创建ibdtest表.
这时我们打开这个mysql服务器下的ibdtest.ibd看看:
这个表的id为0x16,即为22,那么,我们只需将原有的ibdtest.ibd表id修改为0x16即可.
出保存的时候一定要记得使用:%!xxd -r
退出保存.
并将修改好的文件覆盖掉新的ibdtest.ibd即可,
此mysql服务器会认为该表损毁,无法打开,没关系,修改innodb_force_recovery = 6,
重启mysql服务:
Select下,就知道数据是否恢复了没有:
此时,无法执行写操作,应尽快将数据dump出来,修改innodb_force_recovery = 0,重启服务,创建新表后,把数据倒回去就ok了.恢复数据就不演示了.
创建已经丢失的表结构
导入旧的数据文件
导入完成后检查表
先要安装 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中由于某种原因保存有ibd文件,但是表已经被删除或者frm文件损坏亦或者ibdata文件损坏/丢失等。本文模拟在这种情况下,通过mysql自身技术即可完成ibd文件恢复.
测试环境mysql版本
mysql主要参数
mysql> show variables like 'innodb_file_per_table';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_file_per_table | ON |+-----------------------+-------+1 row in set (0.00 sec)mysql> show variables like 'innodb_force_recovery';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_force_recovery | 0 |+-----------------------+-------+1 row in set (0.00 sec)
innodb_file_per_table这个参数为on才能够实现每个表存储单独的ibd文件.innodb_force_recovery参数默认范围0
测试表情况
备份ibd文件
C:\Users\XIFENFEI>dir D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei 的目录 2016-12-02 20:07 98,304 user_login.ibd 1 个文件 98,304 字节 0 个目录 78,789,591,040 可用字节C:\Users\XIFENFEI>cp D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd d:/C:\Users\XIFENFEI>dir d:\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 d:\ 的目录 2016-12-25 23:15 98,304 user_login.ibd 1 个文件 98,304 字节 0 个目录 78,789,591,040 可用字节
模拟删除表(ibd文件也被删除)
mysql> drop table xifenfei.user_login;Query OK, 0 rows affected (0.03 sec) C:\Users\XIFENFEI>dir D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei 的目录 找不到文件
创建新表
mysql> CREATE TABLE `user_login` ( -> `ID` varchar(255) NOT NULL, -> `ACCOUNT` varchar(255) DEFAULT NULL, -> `LifeCycle` int(11) DEFAULT NULL, -> `Name` varchar(255) DEFAULT NULL, -> `Password` varchar(255) DEFAULT NULL, -> `Role` varchar(255) DEFAULT NULL, -> `UTime` varchar(255) DEFAULT NULL, -> `UserID` varchar(255) DEFAULT NULL, -> `UserName` varchar(255) DEFAULT NULL, -> `UserStatus` int(11) DEFAULT NULL, -> PRIMARY KEY (`ID`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.03 sec) C:\Users\XIFENFEI>dir D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei 的目录 2016-12-25 23:19 98,304 user_login.ibd 1 个文件 98,304 字节 0 个目录 78,789,591,040 可用字节 mysql> select count(*) from xifenfei.user_login;+----------+| count(*) |+----------+| 0 |+----------+1 row in set (0.00 sec)
停掉mysql,替换user_login.ibd
C:\Users\XIFENFEI>dir D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei 的目录 2016-12-25 23:22 98,304 user_login.ibd 1 个文件 98,304 字节 0 个目录 78,787,141,632 可用字节 C:\Users\XIFENFEI>cp d:\user_login.ibd D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibdC:\Users\XIFENFEI>dir D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei\user_login.ibd 驱动器 D 中的卷没有标签。 卷的序列号是 4215-1F18 D:\xifenfei\mysql-5.6.25-winx64\data\xifenfei 的目录 2016-12-02 20:07 98,304 user_login.ibd 1 个文件 98,304 字节 0 个目录 78,787,141,632 可用字节
启动mysql 服务,查询数据库
mysql> select count(*) from xifenfei.user_login;ERROR 2013 (HY000): Lost connection to MySQL server during querymysql> exitBye C:\Users\XIFENFEI>mysql -urootERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
mysql 日志报错
2016-12-25 23:31:07 11632 [Note] MySQL: ready for connections.Version: '5.6.25' socket: '' port: 3306 MySQL Community Server (GPL)InnoDB: Error: tablespace id is 56 in the data dictionaryInnoDB: but in file .\xifenfei\user_login.ibd it is 47!2016-12-25 23:31:31 2eb8 InnoDB: Assertion failure in thread 11960 in file fil0fil.cc line 796InnoDB: We intentionally generate a memory trap.InnoDB: Submit a detailed bug report to http://bugs.mysql.com.InnoDB: If you get repeated assertion failures or crashes, evenInnoDB: immediately after the mysqld startup, there may be
很明显由于替换的ibd文件和现在数据库记录的ibd文件的page的字典信息不匹配,因为数据库无法正常查询该数据,而且mysql为了安全直接把实例给crash了.
恢复操作
通过mysql自带的discard tablespace和import tablespace操作后,表数据已经可以完成查询了.
mysql日志
mysql日志依旧报了page字典信息不匹配.但是数据已经可以访问,通过mysqldump导出重新创建表即可.如果由于ibd损坏使用该方法无法恢复,请参考:MySQL drop database恢复(恢复方法同样适用MySQL drop table,delete,truncate table)
mysql数据库突然变慢 数据库变慢是什么原因
MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。 MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表...
mysql重启之后首次查询很慢,求问是什么原因引起的
MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性,如果 MySQL 中包含了大量表,这个校验过程就会比较耗时。 MySQL 下崩溃恢复确实和表数量有关,表总数越大,崩溃恢复时间越长。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低,因此面对大量的表...
xampp中的MySQL启动不了 日志在此 不过看不懂
日志里面告诉你解决方法了。1,确认basedir的权限问题 2,重新恢复数据库 3,配置文件中 加上 innodb_force_recovery = 4 一般情况下是解决方法3
我用联想天逸100-14ibd.误删了系统,后重装了专业版,电脑激活码应去哪...
重装系统就可以解决了,系统U盘制作及重装系统的操作步骤为:1.制作启动U盘:到实体店买个4-8G的U盘(可以要求老板帮忙制作成系统U盘即可省略以下步骤),上网搜索下载装机员U盘启动PE制作工具,将U盘插入电脑运行此软件制作成启动U盘。2.复制系统文件:上网到装机员论坛下载WINXP或WIN7等操作系统的GHO文件...
联想天逸100-15ibd能换成xp系统吗?
如果以前刚装机时进行过一键备份,则能恢复到备份时的状态。另外,如果能够进入现在的系统或开机时按F8能够进入命令行模式,可搜索WINDOWS版或DOS版的GHOST.exe程序和WINXP的GHO系统文件,然后手工运行GHOST程序装载系统GHO文件也能重装系统。2.U盘安装:如果没有一键还原,则使用系统U盘重装系统。系统U盘制作...
mysql5.5.25数据库软件,恢复其中一个备份sql文件时丢失数据,求修复方 ...
sql文件如果是完整的话,去MYSQL命令行 use 库名;source sql文件绝对路径,这样试试.注意,这样是执行整个SQL文件的,如果你只是要恢复某一部分的话,估计你要打开SQL文件,把那部分复制出来重新存放一个文件
mysql数据文件大小超过5GB,如何用mysqldump备份,或者其它方式?
看来你机器的性能不是一般的烂啊。。。第一:做个定时的Job放到crontab里面,晚上跑 第二:在丛库上做备份 第三:你要搞清楚什么叫冷备?你上面的备份方式是完全错误的。。。停服务备份叫冷备,你这个叫热备 如果你用的是myisam,你网站打不开的原因并不是因为性能,而是因为备份把表锁了,如果是...
双击打不开磁盘~
2、在文件类型中重新设置打开方式(以XP为例)打开 我的电脑--工具--文件夹选项--文件类型,找到“驱动器”或“文件夹”(具体选哪个根据你所遇问题,若属于双击打不开驱动器则选择“驱动器”,打不开文件夹则选择“文件夹”)。点下方的“高级”,在“编辑文件类型”对话框里的“新建”,...
数据库中怎样存储视频?
数据库主要特点:编辑 (1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。(2)减少数据的冗余度。同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的...
xtrabackup能同时备份myisam和innodb吗
Xtrabackup有两个主要的工具:xtrabackup、innobackupex 1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 2、innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的f、\/etc\/mysql\/myf、~\/f,并读取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir...
仲矩甲氧: 1、找回表结构,如果表结构没有丢失直接到下一步 a、先创建一个数据库,这个数据库必须是没有表和任何操作的.b、创建一个表结构,和要恢复的表名是一样的.表里的字段无所谓.一定要是innodb引擎的.CREATE TABLE `weibo_qq0`( `...
越城区18481907751: mysql 数据库备份文件只有ibd和frm文件怎么恢复 - ?
仲矩甲氧: 您好,我来为您解答:楼主为什么不用导入导出功能,直接复制的话,只是支持myisam引擎的表,innodb的表是无法直接复制的.表的元数据在ibdata文件上 所以你需要拷贝整个datadir目录.如果我的回答没能帮助您,请继续追问.
越城区18481907751: ibd文件坏了怎么办 - ?
仲矩甲氧: 在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相...
越城区18481907751: 如何恢复mysql表中清除的数据 - ?
仲矩甲氧: 1、第一步,查询语句:select* from table_name;或select * from table_name where [条件]2、第二步,增加语句或插入数据insert into table_name (clus...) values(values...)实例如图:3、修改数据:update tablename set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;4、第四步, 删除语句delete table_name where 条件实例如图:
越城区18481907751: sd卡中的lost.dir文件夹里的文件如何回复 - ?
仲矩甲氧: 如果文件是被删除的可以通过使用数据恢复方式来找回丢失的文件. 1. 在电脑中安装恢复软件 2. 然后将SD通过读卡器与电脑连接,然后运行恢复软件 3. 根据数据丢失原因选择数据恢复模块,并选择SD卡开始扫描 4. 扫描完成后,勾选需要恢复的照片,然后将这些文件复制保存到电脑中
越城区18481907751: U盘数据恢复,详细教您如何恢复U盘数据 - ?
仲矩甲氧: 有些不能...应该说需要动手能力很强还需要一个好的U盘.来解决U盘无法识别的问题.一般考虑方法也就是使用软件修复.这些已经是最低等级的修复.这些不行还是考虑花钱解决问题吧.电脑城里面有数据恢复的地方.
越城区18481907751: 电脑文件(回收站也清空了)误删怎么恢复? - ?
仲矩甲氧: 上网下载一个EasyRecovery EasyRecovery是一个威力非常强大的硬盘数据恢复工具,能够帮你恢复丢失的数据以及重建文件系统.下面我们就以EasyRecovery为例,介绍删除软件恢复的过程. 一、回收站里被删除文件 首先我们启动...
越城区18481907751: oracle数据库恢复方法 - ?
仲矩甲氧: 第一种:<br>首先,备份数据库(X:\oracle\oradata)下的数据文件,重新命名即可(否则装数据库的时候会提示sid已存在).重新安装数据库,当然数据库的名字就是你要恢复的名字.安装完成后,打开控制面板,停止oracle的服务.把(X:\...
越城区18481907751: 误装将D盘格式化,如何恢复数据 - ?
仲矩甲氧: 威力非常强大的硬盘数据恢复工具.能够帮你恢复丢失的数据以及重建文件系统.EasyRecovery 不会向你的原始驱动器写入任何东东,它主要是在内存中重建文件分区表使数据能够安全地传输到其他驱动器中.你可以从被病毒破坏或是已经格...
越城区18481907751: 如何恢复已重新分区、格式化的硬盘中的数据? - ?
仲矩甲氧: 插入U盘,打开FinalData v2.0中文企业版(因为选用的是绿色版,所以不需要安装,当然就不会向硬盘中写入数据,这一点很重要!),单击“文件—打开”,在弹出的对话框中选择“物理驱动器—硬盘1”,单击“确定”,开始查找分区.经...