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 条数据
注意事项
处理表空间的操作通常用于数据库备份、恢复和迁移的过程中,能够有效地管理表的表空间文件。需要注意的是,这些操作通常需要在数据库处于只读模式下执行,以确保数据的一致性和完整性。
热门推荐
几万人排队许愿,几百块的手串卖到脱销,北京这座庙到底什么来头
北塔:古寺繁华 风采更胜
科技与服装设计的融合:引领时尚的未来趋势
家装水管材料选择及管径大小的确定
西部创投之都,成都如何悄悄崛起
清东陵守陵人的前世今生:从皇家守护者到文化传承者
《博德之门3》守陵人使用攻略:功能详解与技巧分享
妙佑医疗国际:减压是控制高血压的关键
野鸭蛋的孵化方法,需保持适温前期要频繁翻蛋
蛋孵化的奥秘:关键因素与方法详解
北大研究证实:这种中国饮食模式降压效果堪比药物
《中国高血压防治指南》发布:健康生活方式是预防高血压的关键
岳阳五大特色小吃:品味湖湘美食的文化传承
岳阳名菜君山银针鸡片:茶香鸡嫩,千年传承
纪录片热映:红旗饭庄的津菜传奇
科技护航 让文物古建“长寿”又“长安”
排列五第25032期开奖:中奖号码39270,你中了吗?
3D打印技术在文化遗产保护中的应用
新版达摩出装技巧:轻松实现1v5!
新版达摩出装攻略:从新手到大神!
王者荣耀达摩最新攻略:出装、铭文与实战技巧详解
NASA联手蓝色起源:2029年揭秘“毁神星”
2029年阿波菲斯飞掠:一场科学探索与行星防御的双重盛宴
秋冬养生新宠:枳术汤调理肠胃
李东垣与张仲景的中医古方:枳术汤
苗银和纯银的区别,教你快速辨别苗银、足银和纯银!
足银和纯银的区别是什么?哪款价格更高?
鼠目寸光:一个成语背后的智慧
十二生肖陪你过个吉祥年!
数学揭示:彩票中奖概率到底有多低?