MySQL表显示"doesn't exist"错误?两种场景下的修复方案详解
创作时间:
作者:
@小白创作中心
MySQL表显示"doesn't exist"错误?两种场景下的修复方案详解
引用
CSDN
1.
https://blog.csdn.net/qq_34692500/article/details/139079271
上周有朋友反馈线上MySQL 5.7数据库查询 audit_log 表出现 "doesn't exist" 错误,查询不到任何数据,而其他表都正常。他不想删库重做,这种问题要怎么修复?
问题分析
查询 audit_log 表出现 "doesn't exist" 现象,通常是由于数据损坏导致的。首先排查了MySQL的数据目录,发现 audit_log 表的 .frm 文件丢失。接下来尝试了数据修复的 REPAIR TABLE 操作,但没有效果。最后只能通过处理表空间的操作来解决此问题。
为了模拟该问题,我从两个维度进行模拟:
- 丢失
.frm文件 - 将当前实例的
.frm和.ibd文件全部废弃,导入从备份文件恢复后的.frm和.ibd文件
表修复尝试
REPAIR TABLE audit_log;
.frm 文件丢失环境模拟
当前 audit_log 表查询一切正常,接下来手动删除 .frm 文件:
- 手动删除
.frm文件 - 查询开始报 "doesn't exist" 错误
场景一:恢复 .frm 文件
创建一个新库
vss_tmp,创建一个新的audit_log表,表结构要与故障表一致:mysql> create database vss_tmp; Query OK, 1 row affected (0.00 sec) mysql> use vss_tmp Database changed mysql> CREATE TABLE `audit_log` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `user_id` int(11) NOT NULL, -> `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, -> `user_display` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, -> `action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, -> `extra_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL, -> `action_time` datetime(6) NOT NULL, -> PRIMARY KEY (`id`) USING BTREE -> ) ENGINE = InnoDB AUTO_INCREMENT = 211 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; Query OK, 0 rows affected (0.01 sec)将新建的
vss_tmp库下的表结构拷贝到故障库vss中:1)拷贝前先执行
ALTER TABLE ... DISCARD TABLESPACE:```sql mysql> use vss Database changed mysql> show tables; Empty set (0.00 sec) mysql> select * from audit_log; ERROR 1146 (42S02): Table 'vss.audit_log' doesn't exist mysql> alter table audit_log discard tablespace; ERROR 1146 (42S02): Table 'vss.audit_log' doesn't exist ```2)执行
cp操作,记得授权:```bash bash-4.2# cd /var/lib/mysql/vss/ bash-4.2# ls audit_log.ibd db.opt bash-4.2# cd /var/lib/mysql/vss_tmp/ bash-4.2# ls audit_log.frm audit_log.ibd db.opt bash-4.2# cp audit_log.frm ../vss/ bash-4.2# cd ../vss bash-4.2# ls audit_log.frm audit_log.ibd db.opt [root@sql-audit-20230526 db1]# cd /var/lib/docker/volumes/5ad9cfe140f098b1352fad8dff1eea69e26ccf2dcab74ed0054de4c15302ae8a/_data/vss [root@sql-audit-20230526 vss]# ll -h total 112K -rw-r----- 1 root root 8.6K May 19 11:32 audit_log.frm -rw-r----- 1 systemd-coredump ssh_keys 96K May 19 10:58 audit_log.ibd -rw-r----- 1 systemd-coredump ssh_keys 65 May 19 10:56 db.opt [root@sql-audit-20230526 vss]# chown -R systemd-coredump:ssh_keys audit_log.frm ```3)执行
IMPORT TABLESPACE操作:```sql mysql> use vss mysql> ALTER TABLE audit_log IMPORT TABLESPACE; ERROR 1813 (HY000): Tablespace 'vss/audit_log' exists. ```4)重启 MySQL:
```bash [root@sql-audit-20230526 vss]# docker restart mysql5.7 mysql5.7 ```5)查询恢复正常
场景二:从备份恢复的新实例拷贝数据 .frm、.ibd 文件
环境准备
- 新实例:
vss_tmp库,audit_log表,9 条数据 - 故障实例:
vss库,数据文件都已清除,报 "doesn't exist"
操作步骤
1)拷贝前先执行 ALTER TABLE ... DISCARD TABLESPACE:
2)执行 cp 操作,记得授权:
```bash
bash-4.2# cd /var/lib/mysql/vss
bash-4.2# ls
db.opt
bash-4.2# cp /var/lib/mysql/vss_tmp/
audit_log.frm audit_log.ibd db.opt
bash-4.2# cp /var/lib/mysql/vss_tmp/audit_log.frm ./
bash-4.2# cp /var/lib/mysql/vss_tmp/audit_log.ibd ./
bash-4.2# ls
audit_log.frm audit_log.ibd db.opt
[root@sql-audit-20230526 vss]# cd /var/lib/docker/volumes/5ad9cfe140f098b1352fad8dff1eea69e26ccf2dcab74ed0054de4c15302ae8a/_data/vss
vss/ vss_tmp/
[root@sql-audit-20230526 vss]# cd /var/lib/docker/volumes/5ad9cfe140f098b1352fad8dff1eea69e26ccf2dcab74ed0054de4c15302ae8a/_data/vss
[root@sql-audit-20230526 vss]# ll -h
total 112K
-rw-r----- 1 root root 8.6K May 19 12:00 audit_log.frm
-rw-r----- 1 root root 96K May 19 12:01 audit_log.ibd
-rw-r----- 1 systemd-coredump ssh_keys 65 May 19 10:56 db.opt
[root@sql-audit-20230526 vss]# chown systemd-coredump:ssh_keys *
[root@sql-audit-20230526 vss]# ll -h
total 112K
-rw-r----- 1 systemd-coredump ssh_keys 8.6K May 19 12:00 audit_log.frm
-rw-r----- 1 systemd-coredump ssh_keys 96K May 19 12:01 audit_log.ibd
-rw-r----- 1 systemd-coredump ssh_keys 65 May 19 10:56 db.opt
```
3)执行 IMPORT TABLESPACE 操作:
```sql
mysql> use vss
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> ALTER TABLE audit_log IMPORT TABLESPACE;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
```
4)重启 MySQL:
```bash
[root@sql-audit-20230526 vss]# docker restart mysql5.7
mysql5.7
```
5)查询恢复正常,9 条数据
注意事项
处理表空间的操作通常用于数据库备份、恢复和迁移的过程中,能够有效地管理表的表空间文件。需要注意的是,这些操作通常需要在数据库处于只读模式下执行,以确保数据的一致性和完整性。
热门推荐
女性生育力下降:多重因素成“幕后黑手”
“白蛇传”申遗成功背后的蛇图腾文化
揭秘:经纪人的工资到底由谁支付?
南京浦口:低空经济发展的新高地
打卡珍珠泉&老山,解锁浦口最美秋景!
朱自清笔下的浦口火车站,你去过吗?
洗衣液、洗衣粉、洗衣凝珠效果对比
多宝鱼的六种做法,第一种鲜味十足,最后一种外表华丽又不失味道
多宝鱼和鲈鱼哪个高档?哪种好吃?
如何正确选择断路器与电缆电线的配合:安全用电指南
为何一般情况下宜采用Dyn11接线的配电变压器?
家居生活小常识:插座功率过载怎么办?
绿色发展视角下的东北林蛙产业与乡村振兴
李白与庐山:五次结缘,一世情缘
庐山最美打卡地:三叠泉瀑布
庐山摄影打卡地大揭秘!
庐山旅游避坑指南:牯岭镇不可错过!
农历公历轻松转换:从基本知识到在线工具使用指南
美式乡村风室内设计指南:打造温馨与自然的居家空间
秋摄大悟:湖北最美摄影指南
王者荣耀:韩信新皮肤“偷鲲时代”体验大揭秘!
退役军人优待证与军属优待证:功能、优惠与办理流程全解析
鄂伦春族南迁:文化碰撞下的生存之道
通古斯人的千年迁徙:从贝加尔湖到中原
从《婚礼进行曲》到完美婚礼:如何用音乐和文案打动人心
哈尔滨亚冬会:点燃东北振兴新引擎
刘德华版《结婚进行曲》:婚礼中的经典之选
唐代石榴裙:穿越千年的时尚传奇
杨贵妃的石榴裙:大唐时尚风向标与文化传奇
婴儿湿疹的家庭护理全攻略