>>与软件开发有关的知识:操作系统,数据库,网络通信等 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19589 个阅读者 刷新本主题
 * 贴子主题:  Mysql数据库的使用总结之ERROR 1146 (42S02) 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-11 20:04:37     消息  查看  搜索  好友  邮件  复制  引用

       在使用 mysql 数据库过程中,遇到了错误 ERROR 1146 (42S02) : Table doesn’t exist ,经过了两天,终于解决了这个问题。引起该错误的原因不同,对应的解决方法也不同。这里只针对我的情况进行一下说明。可能写的比较乱,希望你慢慢看,下面是我整个从犯错误到解决问题的整个过程,有助于你更好的了解相关知识。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

         先说一下发生该错误的情形。我是将别人的数据库目录下的 data 文件夹直接复制过来的,里面有三个数据库 mysql 、 test 和 backupctrl ,主要想要 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 等操作就会出现 1146 : Table 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 服务就可以对数据库进行正常操作了。  


----------------------------
原文链接:https://blog.51cto.com/jazka/330418

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-13 11:19:37 重新编辑]
  Java面向对象编程-->集合(上)
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->Vue指令
  Vue3开发-->通过Axios访问服务器
  针对 MySQL IO 特点进行的存储优化揭秘
  DNS原理及其解析过程
  从原理到实战:如何通过布隆过滤器防止缓存击穿
  MongoDB高手进阶指南
  MySQL的所有函数的用法
  MySQL 安装
  SQL Server 和 MySQL 中的 Date 函数
  SQL ALTER TABLE 语句
  MySQL:如何用 SELECT 语句的 WHERE 子句过滤返回的数据
  CentOS7.5使用mysql_multi方式安装MySQL5.7.28多实例
  存储与虚拟主机管理
  程序员必须掌握的核心算法有哪些?
  TCP三次握手和四次挥手以及11种状态
  Mysql支持的数据类型(总结)
  为什么要分库分表?用过哪些分库分表中间件?
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。