[MySQL 版本差异] 丢失frm文件之后drop database的不同结果分析

背景
 今天在讨论frm丢失后drop database失败的问题。简单复现如下。假设test库中有两个表t1, t2,执行如下脚本:

bin/mysql -uroot –socket=run/mysql.sock   -e ”
drop database if exists test2;
create database test2;
use test2;
create table t1 like test.t1;
create table t2 like test.t2;
”
rm -f data/test2/t1.frm;

bin/mysql -uroot –socket=run/mysql.sock   -e ”
flush tables;
drop database test2;
“

在5.1下会报一个错误
ERROR 1010 (HY000) at line 3: Error dropping database (can’t rmdir ‘./test2′, errno: 39)
并且在test2目录下留下一个t1.ibd。

分析
 MySQL执行drop database test2 的正常流程是这样如下:
1) 遍历 test2目录下的frm文件,依次调用对应表的drop table操作
2) 删掉目录data/test2
出现上面的这个现象的原因,是因为我们事先删掉了t1.frm,导致test2/t1这个表没有删除。这样遗留test2/t1.ibd. 对一个非空目录调用rmdir,就会报错。

5.5版本
 在5.5版本,执行上诉相同的操作,会发现drop database 操作正常完成。
 流程如下:
1) 遍历 test2目录下的frm文件,依次调用对应表的drop table操作
2) 调用innobase_drop_database, 再此期间会删掉test/t1.ibd
3) 删掉空目录 data/test2
由于在第二个步骤删掉了ibd文件,后续删除目录就能正常返回。

相关代码
但实际上在5.1版本的InnoDB中,就有这个接口innobase_drop_database, 会将那些没有frm的ibd文件也删除。(实际上InnoDB本身有字典,不需要通过遍历frm的方式)。
 但实现上代码如下:
    if ((deleted= mysql_rm_known_files(thd, dirp, db, path, 0,
                                       &dropped_tables)) >= 0)
    {   
      ha_drop_database(path);
      ……
    }
在 mysql_rm_known_files 会尝试删除data/test2/ , 但此时目录非空。又由于返回值问题导致ha_drop_database(path)不执行。

而5.5是先调用ha_drop_database再删目录。

可以认为是5.1 server层的一个bug。

数据库索引相关总结 索引是帮助mysql高效获取数据的排好序的数据结构。 阅读详情

相关推荐

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 339

mysql .frm文件丢失_【1.1】mysql frm文件丢失(ibd文件丢失)

【1】故障模拟准备环境这里以innodb为例【1.1】配置参数开启独立表空间innodb_file_per_table;【1.2】构建测试数据create databasetest;create table a(id int,num int);insert into a values(1,11),(2,12); 【2】故障模拟【2.1】在业务正在运行的情况下,手动删除 test库 下的 a.f...

weixin_33453301的博客 370

利用ArcGIS快速生成等高线边界,完成地形图拼图

地形图边界一般在CAD中手动绘制,然而,一幅边缘复杂的地形图边界的绘制需要花费大量时间和精力,为了减少重复性工作,提高效率,用ArcGIS软件可以自动生成实测地形图的边界

yl14774636230的博客 9070

mysql之数据库不能删除问题

linux上的mysql中,最近遇到表和库删不掉的情况,

貌似高手 1万+

通义万相Wan2.1模型Lora训练以及推理

使用DiffSynth-Studio进行通义万象Wan2.1的Lora训练和推理

qq_64858624的博客 4605

深入解析ROS 2 Control:从硬件抽象到实时控制的机器人框架实践

本文深入解析了ROS 2 Control机器人控制框架,阐述了其如何通过硬件抽象、控制器管理和实时性保障,解决机器人开发中硬件与软件紧耦合的痛点。文章详细剖析了其三层核心架构与数据流,并通过C++/Python代码示例演示了硬件接口的实现,最后提供了URDF配置、启动文件编写指南以及动态控制器管理、实时优化等高级应用与实战避坑技巧。

mqtt6iot的博客 621

MySQL备份与恢复(三)-逻辑备份

逻辑备份mysqldump及相关参数SELECT...INTO OUTFILE命令逻辑备份的恢复LOAD DATA INFIL命令mysqlimport mysqldump及相关参数 mysqldump备份工具最初由Igor Romanenko编写完成,通常用来完成转存(dump)数据库的备份及不同数据库之间的移植 如从MySQL低版本数据库升级到MySQL高版本数据库,又或者从MySQL数据库移植到Oracle、Microsoft SQL Server数据库等。 mysqldump的语法如下: mysql

星光之子的博客 308

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

通过mysql的*.frm和*ibd文件恢复原有数据

MySQL数据丢失,使用对应方法解决

weixin_45697805的博客 877

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 44

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2221

mysql frm 版本_[MySQL 版本差异] 丢失frm文件之后drop database的不同结果分析-阿里云开发者社区...

背景今天在讨论frm丢失后drop database失败的问题。简单复现如下。假设test库中有两个表t1, t2,执行如下脚本:bin/mysql -uroot –socket=run/mysql.sock -e ”drop database if exists test2;create database test2;use test2;create table t1 like test.t...

weixin_35147832的博客 206

微信小程序 - 下单账号和支付账号不一致,请核实后再支付(微信小程序或微信H5页面/微信公众号网页支付时报错:“下单账号和支付账号不一致,请核实后再支付”,买家微信支付时提示错误)详细排查和解决方案!

微信支付出现 “下单账号与支付账号不一致,请核实后再支付”微信小程序下单账号与支付账号不一致不让支付,微信公众号网页 微信H5页面JS-SDK支付时出现错误:下单账号和支付账号不一致,请核实后再支付,openId导致的微信中“下单账号和支付账号不一致”原因及解决办法,调用统一下单所传openId与实际支付用户的openId不一致,微信支付jssdk报错,检查了没有不一致依然报错怎么办,微信支付下单账号和支付账号不一致,请核实后再支付,微信支付功能用JSAPI支付,H5页面负责下单并支付jsapi,微信调起支

🏆 前端领域优质创作者 5336

[MySQL版本差异] 丢失frm文件之后drop database的不同结果分析

背景 今天在讨论frm丢失后drop database失败的问题。简单复现如下。假设test库中有两个表t1, t2,执行如下脚本: bin/mysql -uroot -socket=run/mysql.sock   -e ” drop database if exists test2; create database test2; use test2; create tabl

杨文海的专栏 1318

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql丢失frm文件原因_[MySQL 版本差异] 丢失frm文件之后drop database的不同结果分析...

背景今天在讨论frm丢失后drop database失败的问题。简单复现如下。假设test库中有两个表t1, t2,执行如下脚本:bin/mysql -uroot –socket=run/mysql.sock -e ”drop database if exists test2;create database test2;use test2;create table t1 like test.t...

weixin_34322238的博客 288

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MySQL仅从.frm和.ibd文件恢复数据

前言 MySQL的数据库其相关文件都会存放在安装目录下data文件夹下的同命文件夹中,不用的存储引擎创建的表其文件也不一样,下面来认识下这些数据库文件。 db.opt 用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。 .frm 与表相

真新镇的涅法雷姆 1万+

MySQL表结构丢失怎么办?详解frm文件解析与重建的3种方法

本文详细介绍了MySQL表结构丢失时的三种恢复方法,包括日志分析法、工具解析法和编程解析法,重点解析了frm文件的结构与重建技术。通过实战案例和技术原理,帮助DBA在紧急情况下快速恢复表结构,确保数据安全。

weixin_28683065的博客 232

mysql通过frm、idb文件恢复数据

db.opt 用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。 .frm 与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件。 .MYD和.MYI .MYD:MY Data,是MyISAM存储引擎专用的用于存放MyISAM表的数据; .MYI:MY Index,也是专属于MyISAM存

qq_41002340的博客 1047

MySQL数据恢复实战:仅凭frm和ibd文件如何救回你的表结构和数据?

本文详细介绍了在MySQL 5.6/5.7版本中,当核心数据文件丢失时,如何仅凭.frm和.ibd文件进行数据恢复的实战方法。文章深入解析了从.frm文件反编译表结构、利用innodb_force_recovery模式获取完整建表语句,到最终通过DISCARD/IMPORT TABLESPACE命令挂载.ibd数据文件的全流程,并提供了批量恢复脚本与常见问题解决方案,是DBA和开发者在紧急情况下的关键恢复指南。

weixin_29210727的博客 210

【MySQL 数据库】表的操作

本文系统讲解MySQL表的基础操作,包括创建、查看、修改和删除表。首先介绍创建表的语法,需指定字段名、数据类型等,不同存储引擎生成不同文件。通过DESC命令可查看表结构。重点讲解ALTERTABLE的5种操作:添加/修改/删除字段、重命名表和字段。最后说明DROPTABLE的删除操作及注意事项,强调数据不可恢复性。文章提供完整操作流程示例,并总结MySQL表操作四大核心命令,帮助开发者掌握90%的表结构管理需求,特别提醒ALTER操作需谨慎执行。

wuqingyigexiaoba的博客 1431

【MySQL】MySQL基础

本文介绍了数据库的基本概念、主流数据库类型、MySQL的基本操作及其架构。主要内容包括:1. 数据库的定义与作用,解释了为什么需要数据库来替代文件存储数据;2. 主流数据库产品(MySQL、Oracle等)的简要对比;3. MySQL的基本使用操作,包括连接/退出、创建/使用数据库、建表、插入和查询数据;4. MySQL的逻辑架构和SQL语句分类(DDL、DML、DCL等);5. MySQL存储引擎的详细介绍,重点对比了InnoDB和MyISAM的特性差异,并简要说明Memory、Archive等其他引擎的

wefg1的博客 261

MySQL存储引擎深度解析:MyISAM与InnoDB核心差异与选型指南

数据库存储引擎是数据库管理系统的核心组件,负责数据的存储、索引和事务处理。其工作原理决定了数据的组织方式、并发控制机制和事务支持能力。从技术价值看,存储引擎的选择直接影响系统的数据一致性、并发性能和数据安全性。在应用场景上,在线事务处理系统需要强事务支持和高并发能力,而分析型系统则更注重查询性能。本文聚焦MySQL中最经典的两种存储引擎——MyISAM和InnoDB,深入剖析它们在事务支持、锁机制、索引结构等核心维度的差异。通过对比表级锁与行级锁的实现原理,以及非聚簇索引与聚簇索引的设计哲学,帮助开发者理解

weixin_30550081的博客 311

Mysql数据库基础

数据最终存储在磁盘的扇区中。操作系统与磁盘交互的基本单位是数据块(通常为4KB),而非单个扇区,以减少I/O次数、降低对硬件的依赖。MySQL(InnoDB引擎)​ 与磁盘交互的基本单位是Page(页),大小为16KB。所有数据文件在磁盘中都以Page形式保存。MySQL在内存中申请​ 来缓存磁盘的Page数据,以减少实际的磁盘I/O操作。MySQL 与磁盘交互基本单位而MySQL作为一款应用软件,可以想象成一种特殊的文件系统。

2301_79176091的博客 610

MySQL 入门

本文全面介绍了MySQL数据库及其相关技术,内容涵盖: 数据库基础概念:包括数据库系统组成、关系型与非关系型数据库对比、MySQL核心特点等; MySQL操作管理:详细讲解了安装配置、SQL语句分类、数据类型、索引原理等核心内容; 高级特性:深入分析事务、锁机制、存储引擎、主从复制等关键特性; 扩展架构:系统介绍了读写分离、集群部署、分库分表等企业级解决方案; 开发集成:提供了JDBC连接、MyCat中间件等实践指南。 文章采用结构化组织方式,从基础到高级层层递进,包含了大量实用性强的代码示例和配置模板

weixin_51689532的博客 1243
上一篇: 量化InnoDB group commit的效果
下一篇: InnoDB中dict_update_statistics调用策略及问题
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值