Mysql 使用ibd数据文件进行数据恢复 (以及数据移动) 1067的解决办法

时间:2023-01-11 06:24:03

使用过数据库的哥们都知道,最开始我们不小心把数据库安装到c盘,当时忘记设置了数据路径,导致数据默认也放在c盘,随着时间的推移,数据库数据越来越大,导致c盘空间不够了。

于是乎我们开始研究怎么样移动数据,当然简单的步骤莫过于下:

(1)停止mysql服务。(运行services.msc)

(2)打开my.ini文件,该文件有可能不在安装程序的目录下,而在数据目录下,不同的mysql版本大概不同吧。

比如我安装的5.7.3,默认在数据文件目录programData(该目录竟然是隐藏的!需要打开文件夹设置显示隐藏文件)中的mysql目录中。(该版本好像现在下载不到了,不知道是什么原因,如果你需要可以留个邮箱)

修改my.ini中的datadir="F:\mysql\data\"。修改成你需要移动数据到的位置。然后就把你原来数据文件中的整个data目录移动到目标位置。当然要和你设置的完全相同,切记要细心。

(3)保存my.ini之后启动mysql服务,应该就可以了。(该my.ini文件千万不要移动你新的数据位置,否则就是灾难的开始!!)


通过以上步骤,很容易让人觉得,mysql的数据文件就放在对应的数据库文件夹下,然后只需要复制移动数据文件,就可以完成数据的转移(如复制到另外一台机器)和数据恢复。可这样是完全不可以的。你移动了数据文件,在mysql中是可以表存在,可惜你就是打呀打不开,很是郁闷的。还会莫名的导致1067错误!!当然面对1067网上有很多种解决办法,靠谱的好像就一个,那就是删除那三个文件,ib_logfile0、ib_logfile1、ibdata1(记得先停止mysql服务),然后重新启动mysql。

当然,删除了这三个文件,也就意味着你已经删除了你数据库中所有的数据,不信?你可以在mysql中看到表存在,可惜,你就是打不开!面对这种情况,就应该使用ibd文件进行恢复了。当然你如果有数据库的批量插入语句备份就最好了。直接再导入一遍就可以(我指的是工具是SQLyog,里面有从外部sql文件中导入的功能。)

具体的方法我参考的是:http://www.linuxidc.com/Linux/2014-07/104434.htm

先将数据文件frm和ibd文件进行移动保存。

具体表结构的恢复好像不是很靠谱,其实可以直接用文本打开数据文件夹下的frm文件,里面有表结构的信息,直接复制出来,然后创建一个表就可以了。(创建时先把frm从目录中移动出来,否则你在创建的时候会提示该表已经存在),创建表的时候,他会自动的生成一个同名的frm和ibd文件。

最关键的就是ibd文件的使用。首先得把你需要用到的ibd文件进行复制备份到一个地方。(其实这一步应该在上一步之前)。

a、建立一个数据库,根据上面导出的创建表的sql执行创建表。(表已经创建好了就不用了)

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

test是你的表名

c、把之前要恢复的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm发生关系。ALTER TABLE test  IMPORT TABLESPACE;

(这个过程需要一点时间,就和数据导入是差不多,其实本质上就是那三个文件和你的数据发生某种关联,具体不知道,还望指点)

d、将恢复好的数据导出就行了(这一步相当关键,经过上述动作你是可以完整的看到数据了,但是第二天你再来看,你又会遇到1067,所以趁着可以用的机会,赶紧导出备份一次!!)


总的来说,ib_logfile0、ib_logfile1、ibdata1这三个文件和my.ini,以及你的数据文件是紧密联系在一起的,哪一个出现意外情况,导致不一致,就会出现1067,所以操作需谨慎!!不过你只要记得备份你的数据成sql语句,那什么都不用害怕了!