Mysql数据库的使用总结之ERROR 1146 (42S02)

本文详细介绍了在使用MySQL数据库时遇到ERROR1146(42S02): Table doesn’t exist错误的原因及解决方案。错误由ibdata1文件损坏引起,文章提供了两种修复方法:一是确保源数据库关闭后再复制;二是创建空数据库并替换ibdata1。
在使用 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_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服务就可以对数据库进行正常操作了。
### MySQL ERROR 1146 (42S02) 的解决方案 MySQL 错误代码 `ERROR 1146 (42S02)` 表示尝试访问的表不存在。该错误通常发生在以下几种情况中:执行查询时,目标表未被创建;导入 `.sql` 文件时,表结构缺失或字符集不匹配;或者某些系统表(如 `general_log` 或 `slow_log`)未正确初始化。 以下是针对此问题的具体解决方法: #### 1. 检查表是否存在 确保目标数据库中确实存在所需的表。可以通过以下命令验证: ```sql SHOW TABLES; ``` 如果目标表未列出,则需要重新创建该表。例如,若报错涉及 `mysql.general_log` 表,可以使用以下语句创建[^1]: ```sql CREATE TABLE IF NOT EXISTS `mysql`.`general_log` ( `event_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `user_host` MEDIUMTEXT NOT NULL, `thread_id` BIGINT UNSIGNED NOT NULL, `server_id` INTEGER UNSIGNED NOT NULL, `command_type` VARCHAR(64) NOT NULL, `argument` MEDIUMBLOB NOT NULL ) ENGINE=CSV CHARACTER SET utf8 COMMENT='General log'; ``` #### 2. 导入 `.sql` 文件时的字符集问题 在使用工具(如 Navicat)导出和导入 `.sql` 文件时,字符集不一致可能导致表结构无法正确解析。为避免此类问题,需确保源数据库和目标数据库的字符集一致[^2]。 - **检查字符集**: 在 Navicat 中右键点击数据库,查看其字符集和排序规则。 - **设置目标数据库字符集**: 在 Linux 系统中,编辑 MySQL 配置文件 `/etc/my.cnf`,添加或修改以下内容: ```ini [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci ``` 保存后重启 MySQL 服务: ```bash systemctl restart mysql ``` #### 3. 创建缺失的系统表 如果错误与系统表(如 `mysql.slow_log` 或 `mysql.general_log`)相关,可能是因为这些表未被创建。可以通过以下方式解决[^3]: - **启用日志记录**: 修改 MySQL 配置文件 `/etc/my.cnf`,添加以下参数: ```ini [mysqld] general_log = 1 general_log_file = /var/log/mysql/general.log slow_query_log = 1 long_query_time = 2 log_output = TABLE ``` 然后创建相应的系统表: ```sql CREATE TABLE IF NOT EXISTS `mysql`.`slow_log` ( `start_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), `user_host` MEDIUMTEXT NOT NULL, `query_time` TIME(3) NOT NULL, `lock_time` TIME(3) NOT NULL, `rows_sent` INT UNSIGNED NOT NULL, `rows_examined` INT UNSIGNED NOT NULL, `db` VARCHAR(512) NOT NULL, `last_insert_id` INT UNSIGNED NOT NULL, `insert_id` INT UNSIGNED NOT NULL, `server_id` INT UNSIGNED NOT NULL, `sql_text` MEDIUMTEXT NOT NULL, `digest` VARCHAR(32) DEFAULT NULL ) ENGINE=CSV CHARACTER SET utf8 COMMENT='Slow log'; ``` #### 4. 检查二进制日志配置 在双主复制环境中,写入二进制日志可能会导致表冲突。因此,在临时创建系统表时,建议关闭二进制日志记录: ```sql SET sql_log_bin = 0; ``` 完成操作后,记得重新启用二进制日志: ```sql SET sql_log_bin = 1; ``` --- ### 注意事项 - 如果问题仍无法解决,可尝试手动检查 `.sql` 文件的内容,确保其中包含正确的表定义语句。 - 在生产环境中,谨慎修改系统表或配置文件,以免影响数据库性能或稳定性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值