`
丁林.tb
  • 浏览: 797226 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[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。

1
1
分享到:
评论

相关推荐

    通过frm idb数据库恢复.docx

    ### 通过 `.frm` 和 `.idb` 文件恢复 MySQL 数据库 #### 背景介绍 在日常工作中,由于各种原因(例如误操作、系统故障等),可能会导致数据库中的数据丢失。在这种情况下,掌握一种有效的数据恢复方法对于保证业务...

    mysql在linux下日常管理维护

    如果不能使用这个命令进行删除,需要将这个子目录下多余的文件进行手工删除,然后进行 drop database 命令继续删除。 3.3 查看已有数据库 mysql> show databases; 3.4 表、视图、触发器的文件表现方式 3.4.1 表...

    Mysql 常用的Mysql

    表会被保存为`.frm`(表定义)、`.MYD`(数据文件)和`.MYI`(索引文件)。 8. **复制表**:使用`CREATE TABLE`与`LIKE`关键字可以复制表的结构,例如`CREATE TABLE xtable LIKE student;`。 9. **删除表**:`...

    MYSQL权限不够解决办法

    MySQL使用基于角色的访问控制(RBAC)机制,通过定义不同的权限级别来管理用户的访问权限。这些权限级别包括全局级、数据库级、表级和列级。 - **全局级权限**:控制对整个MySQL服务器的操作,如启动、停止服务等。 -...

    MySQL安装创建和维护数据库.docx

    MySQL的数据库文件通常包括数据文件、日志文件、配置文件等,常见的扩展名有`.frm`(表结构文件)、`.MYD`(数据文件)、`.MYI`(索引文件)等。理解这些文件的作用有助于更好地管理和维护MySQL数据库。 【数据表的...

    实验1MySQL安装创建和维护数据库实验new.pdf

    - MySQL数据库文件主要包括数据文件和日志文件,常见的扩展名有`.frm`(表结构文件)、`.MYD`(数据文件)、`.MYI`(索引文件)以及`.ibd`(InnoDB存储引擎的表数据和索引)和`.log`(日志文件)等。 这个实验旨在...

    实验1MySQL安装创建和维护数据库实验new.docx

    5. **MySQL数据库文件类型**:MySQL数据库文件通常包括数据文件和日志文件,常见的扩展名有`.frm`(表结构文件)、`.MYD`(MyISAM数据文件)、`.MYI`(MyISAM索引文件)、`.ibd`(InnoDB数据和索引文件)、`.log`...

    mysql教程详细总结

    MySQL使用不同的文件来存储数据、日志及配置信息,理解这些文件的作用对于系统管理员来说非常重要。 #### MySQL C++ API MySQL提供了一套C++ API接口,允许开发者使用C++语言编写应用程序来访问MySQL数据库。 ####...

    Mysql学习笔记

    - `.frm`文件:表结构定义文件。 - `.MYD`文件:数据文件。 - `.MYI`文件:索引文件。 #### 六、数据库管理 1. **数据库管理工具**:可以使用Navicat Premium等图形化工具来管理MySQL数据库。 2. **字符集设置*...

    MySQL学习分享[整理].pdf

    - 存储方式:每个表由三个文件组成,`.frm`文件存储表结构,`.myd`文件存储数据,`.myi`文件存储索引。 - **InnoDB**: - 特性:支持事务处理,外键约束,行级锁定,提供了更高的并发控制。 - 存储方式:每个表...

    MYSQL大全下载

    - 默认表类型为`MyISAM`,并在`/var/lib/mysql/abc`目录下创建`student.frm`(表定义文件)、`student.MDY`(数据文件)和`student.MYI`(索引文件)。 **2. 复制表** - 使用`CREATE TABLE ... LIKE`命令复制一个...

    MySQL SQL编程零基础攻略

    数据表在磁盘上的文件包括表结构文件(*.frm),数据文件(*.MYD)和索引文件(*.MYI)等,它们分别以不同的存储引擎文件形式存储。 字符集的设置对数据库系统的国际化和数据存储格式有直接影响,通过`CREATE TABLE...

    MySQL的一些常用的SQL语句整理

    在MySQL 3.22及更高版本中,可以使用`IF EXISTS`选项避免因数据库不存在而产生的错误,例如:`CREATE DATABASE IF NOT EXISTS db_name;` 删除数据库则使用`DROP DATABASE`语句,如`DROP DATABASE db_name;`,这将...

    SQL简单基础

    每个 MyISAM 表都由三个文件组成:`.frm` 文件定义表结构,`.MYI` 文件保存索引结构,而 `.MYD` 文件则包含实际的数据。 - **ISAM**:这是一种较老的表类型,已经被 MyISAM 所取代。它同样支持快速读取,但不如 ...

    mysql 数据库基础原创

    - **特点**:存储为三个文件:frm(表结构)、myd(数据)、myi(索引)。 - **优点**:占用空间小、处理速度快。 - **缺点**:不支持事务和并发。 - **MEMORY 存储引擎** - **优点**:处理速度快。 - **缺点*...

    《数据库原理及应用》实验报告(1-21).doc

    **思考题**:MySQL的数据库文件主要有数据文件(`.frm`,定义表结构)、索引文件(`.MYI`,存储索引)和数据文件(`.MYD`,存储数据)。扩展名分别为`.frm`, `.MYI`, 和 `.MYD`。 **实验总结**:学生应反思在实验...

    《数据库原理及应用》实验报告(1-13)20225101020118韦娟.doc

    - MySQL数据库文件通常包含数据文件和日志文件,数据文件的扩展名通常是`.frm`(表结构)、`.MYD`(数据文件)和`.MYI`(索引文件)。 4. **表管理**: - 创建表,需要定义表的结构,包括字段名、数据类型、长度...

    虚拟主机MySQL数据库的备份与还原的方法

    其中,`user_name`是MySQL的用户名,`database_name`是你要备份的数据库名称,`path:/xxx.sql`是保存备份文件的路径和文件名。`–option`可以包含各种参数,如`–opt`(一组默认选项),`–add-drop-table`(在创建...

    整理比较全面的数据库基础知识

    本文将深入探讨MySQL数据库的基础知识,包括数据库操作、数据表操作、数据操作以及SQL语句的分类,同时也涉及到了数据表的文件结构。 1. **数据库操作**: - **创建数据库**:使用`CREATE DATABASE`语句创建新的...

Global site tag (gtag.js) - Google Analytics