mysql复制数据库的恢复



原文 http://jazka.blog.51cto.com/809003/330418 Mysql数据库的使用总结之ERROR 1146 (42S02)

在使用mysql数据库过程中,遇到了错误ERROR 1146 (42S02)

   Table doesn’t exist,经过了两天,终于解决了这个问题。引起该错误的原因不同,对应的解决方法也不同。

 这里只针对我的情况进行一下说明。可能写的比较乱,希望你慢慢看,下面是我整个从犯错误到解决问题的整个过程,有助于你    更好的了解相关知识。

     先说一下发生该错误的情形。我是将别人的数据库目录下的 data 文件夹直接复制过来的,里面有三个数据库 mysql test backupctrl ,主要想要 backupctrl 数据库,记住不是备份,是拷贝,而且 backupctrl 是使用 innodb 作为存储引擎的,这两方面综
合起来就导致了 1146 这个错误。
       因为要使用 innodb 做存储引擎,所以要对 my.ini 文件进行相应的修改。在 my.ini 文件中,你可以找到关于 innodb 的相关设置,但是被注释掉了。因为 mysql5.1 版本后, innodb 不在作为默认的设置了。首先将 skip-innodb 注释掉,然后需要设置正确 innodb 的相关参数。
       采用 innodb 存储引擎,关系到 data 文件夹下面的一些文件: ib_logfile0 ib_logfile1 ibdata1 ,另外还有一个就是数据库名下面的众多 .frm 文件。先对这几个文件作简要介绍。
      ib_logfile0 ib_logfile1 是关于数据库的一些日志文件;
      .frm 文件是数据库中很多的表的结构描述文件;
      ibdata1 文件时数据库的真实数据存放文件。
       在将别人的 data 文件夹整个复制过来后,你到 mysql 目录下的 bin 文件夹下运行命令:
      mysql  --console
       此时,你会发现很多的错误提示,该命令就是对环境进行测试的。如果你不理会这些错误,进入数据库,用 show tables ;命令发现数据库表存在,但是执行 select 等操作就会出现 1146 Table doesn’t exist 这个错误了。
     其实这是由 ibdata1 文件的错误引起的,这个应该在日志文件 ib_logfile0 ib_logfile1 中找到(这个本人没有验证),于是把 ibdata1 文件删除掉,再次执行该命令,发现没有提示错误了,但进入数据库以后,操作仍就导致 1146 这个错误。后来仔细一下,也是,你说你把 ibdata1 文件删除,相当于把数据库的真实数据删除了,这时你就会问为什么数据库表还存在呢,都能看到(其实我当初就是这么想的),因为数据库表结构的描述是在 .frm 的众多文件中的,所以能通过 show tables ;查看到。
       那么下一个问题就出来了: ibdata1 文件是从别人那里拷贝过来的,为什么在那边能用,到我这边就不能用了呢?这就是最核心的问题所在,因为 mysql 是采用缓冲方式来讲数据写入到 ibdata1 文件中的,这正是 fflush() 函数存在的理由。因此当别人的 mysql 在运行时,你对 data 文件夹进行拷贝,即对 ibdata1 进行拷贝肯定会导致该文件中的数据出错的(具体错误原因没有深入学习)。
       知道了上面的问题,解决就简单多了,呵呵。首先,将别人的 mysql 服务停止(这个就不用说了吧,我的前两篇博文中有,你可以参考),然后在拷贝 data 文件夹,替换到你的相应目录下。这样,你再按照我的博文http://jazka.blog.51cto.com/809003/329423中介绍的方法对数据库进行操作就可以了。
       网上查找解决办法时,发现也有不少人有这个问题,而按照停止服务再拷贝的方式还是不行(我刚开始也不行,不过后来就好了,怪了,不知道为什么)。所以这里再说一种方法。首先在自己的 mysql 下,建立一个你即将要拷贝的数据库(数据库名要一样,里面不需要建表),然后将所有的 .frm 文件拷贝到你建的数据库文件夹下,此时再次进入 mysql ,用 show tables 查看表是否已经建立起来了。然后停止你自己的 mysql 服务,发现在 data 文件下面已经有 ib_logfile0 ib_logfile1 ibdata1 三个文件了(免安装版解压后是没有的),之后停掉别人的 mysql 服务,只将 ibdata1 文件拷贝过来进行覆盖,最后启动你自己的 mysql 服务就可以对数据库进行正常操作了。
----------------------------------------------------------
ps:以上为全文,本人照着做了一下,确实有效,感谢原作者。

你可能感兴趣的:(MySQL)