在使用
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
下,创建一个你即将要拷贝的数据库(数据库名要同样,里面不须要建表),而后将全部的
.frm
文件拷贝到你建的数据库文件夹下,此时再次进入
mysql
,用
show tables
查看表是否已经创建起来了。而后中止你本身的
mysql
服务,发如今
data
文件下面已经有
ib_logfile0
、
ib_logfile1
和
ibdata1
三个文件了(免安装版解压后是没有的),以后停掉别人的
mysql
服务,只将
ibdata1
文件拷贝过来进行覆盖,最后启动你本身的
mysql
服务就能够对数据库进行正常操做了。