如何通过直接复制frm文件以实现恢复/复制innodb数据表?
在MySQL5.0的使用过程中,经常会出现一些莫名奇妙的问题,导致服务无法启动,只好重新安装MySQL,但是这样原来的数据库就会丢失了。
听说MySQL的数据库文件直接复制便可以使用,但是根据查询,那是指原来的一种“MyISAM”类型的表。
我通常都是使用MySQL-Front直接创建表,默认是“InnoDB”类型,这种类型的一个表在磁盘上好像只对应一个“*.frm”文件,不像MyISAM那样还“*.MYD,*.MYI”文件。
MyISAM类型的表我试过,好像直接拷到另一个数据库就可以直接使用,但是InnoDB类型的表却不行。
在网上搜索了很多办法:
一种说同时拷贝“ibdata1”等等文件,但是这样却造成新的数据库无法启动。
一种好像说使用“truncate table 表名”这样的命令来恢复表结构,也不成功
还有说用什么“mysqldump.exe”,但是这种方法的前提好像需要数据库是好的,并且能够正常启动运行,而我现在是数据库坏掉了,只剩下表文件……被这个问题真是搅的头疼,希望有经验的高手能给出一个彻底的解决方法:
就是,我现在手头上只有InnoDB类型的frm表文件的话,如何能够将表恢复到一个新的数据库中?还有能恢复数据更好了!

解决方案 »

  1.   

    我以前MySQL坏了,重新安装之后,发现所有旧数据库都没有丢失阿,都可以用呢
    应该只有MySQL中的mysql数据库被重新覆盖了
      

  2.   

    把DATA目录下的MYSQL目录改名,然后重新安装MYSQL。之后你就知道怎么做了。
      

  3.   

    把重新安装的新Data文件夹删除掉
    之后再把原来的Data文件夹名改回来
    呵呵,没试过,应该可行
      

  4.   

    谢谢各位回复。
    大概找到一种解决方法了,就像我问题中提到的网上搜的第一种方法那样:
    同时拷贝innodb数据库表“*.frm”文件和innodb数据“ibdata1”文件到合适的位置。启动MySQL的Windows服务,如果不能成功的话,查看data文件夹中有个“*.err”错误日志文件,其中会对启动失败的原因有所描述的。比如我碰到过两种错误原因。
    一种是类似这样的错误信息:
    [code=INIFile]InnoDB: Error: log file .\ib_logfile0 is of different size 0 10485760 bytes
    InnoDB: than specified in the .cnf file 0 25165824 bytes![/code]
    这是因为在mysql配置文件中配置的日志文件大小与实际的不相符。
    解决方法是直接删掉旧的“ib_logfile0”等日志文件,重启MySQL后会自动生成新的日志文件的。
    另一中则是这样的错误信息
    [code=INIFile]InnoDB: Operating system error number 5 in a file operation.
    InnoDB: The error means mysqld does not have the access rights to
    InnoDB: the directory. It may also be you have created a subdirectory
    InnoDB: of the same name as a data file.
    InnoDB: File name .\ibdata1
    InnoDB: File operation call: 'open'.
    InnoDB: Cannot continue operation.[/code]
    经检查原来是“ibdata1”文件在复制的过程中不知怎的被加上只读属性了。
    解决方法是去掉“ibdata1”文件的只读属性便可。上面的方法好像只适用于把旧的innodb数据库拷到一个还没有innodb数据的新数据库中。
    如果目标数据库中已经存在含有数据的“ibdata1”等文件,不要用什么mysqldump的话,不知还有没有什么简便方法来合并新旧数据?
      

  5.   

    先留着你的 frm 文件不要动.在新的mysql里建一个数据库,然后分别手工建立你要的那些表,结构随便弄.这样在 mysql\data文件夹就有了一堆和你手头保存的frm对应文件.把你保留的文件覆盖这些新的frm 重启 mysql 服务 这样你保留的数据库结构就出来了.只有数据结构没有数据.
      

  6.   

    CaiKanXP 给的方法是对的,我也遇到了同样的问题,终于搞定了。将原来的frm文件拷贝到相应的data\db_name目录下,然后将原有的ibdata1放在data目录下覆盖,终于可以恢复了。myisamchk只能恢复myisam型数据库,对于innodb不起作用。