大家好,又见面了,我是你们的朋友全栈君。
ERROR 1146 (42S02): Table ‘xxx’ doesn’t exist 可能是很多人都遇到的问题,尤其在数据库迁移或备份的时候
mysql数据目录结构
mysql数据目录下有如下几个重要文件:ibdata1
ib_logfile0
ib_logfile1
数据库xx 以及该目录下的一系列 .frm 文件
其中
ib_logfile0 和 ib_logfile1 是关于数据库的一些日志文件
数据库xx 是默认数据库和我们添加的数据库目录
ibdata1 存储了数据库的真实表数据
.frm 是存储了数据库表的结构描述说明
失误的操作过程
当我们把其他mysql下的目录,拷贝到我们新的mysql数据目录的时候,(仅仅是copy目录)
启动数据库,可以正常使用 show databases; 和 show tables;
但是在我们想继续查询表数据的时候 select * from video; ,报错了:
ERROR 1146 (42S02): Table ‘djangomysql.getvideo_video’ doesn’t exist1
2MariaDB [videos_db]> select * from video;
ERROR 1146 (42S02): Table ‘videos_db.video’ doesn’t exist
继续探索原因
因为数据库目录 和 表结构也是存储在 .frm 文件内,因此我们可以正常使用 show databases; 和 show tables;
为什么查询表数据的时候发生错误呢?
那是因为ibdata1 文件受影响了,表数据存储在ibdata1中
mysql是通过缓存的方式写入数据到ibdata1,当我们异常拷贝ibdata1的时候,可能缓存数据还没写入,导致有点出入,因此操作顺序很重要
解决方案
介于ibdata1数据被影响了,我们需要矫正下数据写入顺序,如下:
1、在新mysql数据目录下新建我们需要拷贝的数据库 mysql/videos, 同时把旧mysql中对应数据库下的文件全部拷贝过来
2、启动mysql,查询 show databases 和 show tables 确定无误后,退出mysql shell,停止mysql服务(比如 service mariadb stop)
3、然后把旧mysql中的ibdata1文件拷贝到新mysql数据目录下 mysql/ibdata1,这个时候我们会发现目录下有 ib_logfile0 ib_logfile1 和 ibdata1
4、再次启动新的mysql服务,然后验证,mysql服务正常了……
反思
数据库需要严格的备份流程、恢复流程,避免一些低级的操作方式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134399.html原文链接:https://javaforall.cn