Ownsight

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1440|回复: 1
打印 上一主题 下一主题

mysql ERROR 1146 (42S02)

[复制链接]

803

主题

903

帖子

3201

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3201
跳转到指定楼层
楼主
发表于 2015-7-1 09:03:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
转自:http://jazka.blog.51cto.com/809003/330418
  在使用mysql数据库过程中,遇到了错误ERROR 1146 (42S02)Table doesn’t exist,经过了两天,终于解决了这个问题。引起该错误的原因不同,对应的解决方法也不同。这里只针对我的情况进行一下说明。可能写的比较乱,希望你慢慢看,下面是我整个从犯错误到解决问题的整个过程,有助于你更好的了解相关知识。
     先说一下发生该错误的情形。我是将别人的数据库目录下的data文件夹直接复制过来的,里面有三个数据库mysqltestbackupctrl,主要想要backupctrl数据库,记住不是备份,是拷贝,而且backupctrl是使用innodb作为存储引擎的,这两方面综合起来就导致了1146这个错误。
       因为要使用innodb做存储引擎,所以要对my.ini文件进行相应的修改。在my.ini文件中,你可以找到关于innodb的相关设置,但是被注释掉了。因为mysql5.1版本后,innodb不在作为默认的设置了。首先将skip-innodb注释掉,然后需要设置正确innodb的相关参数。
       采用innodb存储引擎,关系到data文件夹下面的一些文件:ib_logfile0ib_logfile1ibdata1,另外还有一个就是数据库名下面的众多.frm文件。先对这几个文件作简要介绍。
       ib_logfile0ib_logfile1是关于数据库的一些日志文件;
       .frm文件是数据库中很多的表的结构描述文件;
       ibdata1文件时数据库的真实数据存放文件。
       在将别人的data文件夹整个复制过来后,你到mysql目录下的bin文件夹下运行命令:
       mysql  --console
       此时,你会发现很多的错误提示,该命令就是对环境进行测试的。如果你不理会这些错误,进入数据库,用show tables;命令发现数据库表存在,但是执行select等操作就会出现1146Table doesn’t exist这个错误了。
     其实这是由ibdata1文件的错误引起的,这个应该在日志文件ib_logfile0ib_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_logfile0ib_logfile1ibdata1三个文件了(免安装版解压后是没有的),之后停掉别人的mysql服务,只将ibdata1文件拷贝过来进行覆盖,最后启动你自己的mysql服务就可以对数据库进行正常操作了。

相关帖子

803

主题

903

帖子

3201

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3201
沙发
 楼主| 发表于 2015-7-1 09:06:58 | 只看该作者
这个错误的关键问题就是 不同引擎的数据库的备份方式不同导致的吧,需要进一步测试,暂推测innodb的复制必须把innodb对应数据目录下的ibdata1文件,而MYISAM 引擎的文件则是直接把数据存储在MYD MYI文件中。所以对于MYISAM 直接拷贝数据库目录就可以而innodb则需要拷贝innodb下的文件,而且需要停止mysql服务之后拷贝,避免缓存数据没有完全保存。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表