mysql中1146提⽰_Mysql数据库的使⽤总结之mysql下载之后是个文件夹
ERROR1146(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下,建⽴⼀个你即将要拷贝的数据库(数据库名要⼀样,⾥⾯不需要建表),然后将所有的.frm⽂件拷贝到你建的数据库⽂件夹下,此时再次进⼊mysql,⽤show tables查看表是否已经建⽴起来了。然后停⽌你⾃⼰的mysql服务,发现在data⽂件下⾯已经有ib_logfile0、ib_logfile1和ibdata1三个⽂件了(免安装版解压后是没有的),之后停掉别⼈的mysql服务,只将ibdata1⽂件拷贝过来进⾏覆盖,最后启动你⾃⼰的mysql服务就可以对数据库进⾏正常操作了。
注:需要⼀个mysql innodb‘ 环境没有问题的 服务器 然后按照 红⾊字体写的,复制过去后,重新启动mysql 即可得到 正确 的表,然后到处sql⽂件,就可以随意使⽤了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论