`

MySQL对 DROP TABLE 处理过程(转自老金)

阅读更多

原文http://www.mysqlops.com/2011/02/18/mysql-drop-table-%E5%A4%84%E7%90%86%E8%BF%87%E7%A8%8B.html

前几天,在DROP TABLE的时候,所有进程不管是DDL还是DML都被HANG起;直到DROP结束才继续执行;
对这个现象甚其不解;
今天研究了一个 MYSQL 源代码,看其对DROP TABLE 的内部处理过程 ;

当用户发出 DROP TABLE 命令后:

############# MYSQL SERVER 处理删除一个表 ##################
/* Sql_table.cc delete (drop) tables. */
bool mysql_rm_table( )

/* Execute the drop of a normal or temporary table */
int mysql_rm_table_part2 ()

/* Remove matching tables from the HANDLER’s hash table. */
void mysql_ha_rm_tables ()

/* Mark all entries with the table as deleted to force an reopen of the table */
remove_table_from_cache()

/* remove engine files */ LINE 2024
int handler::ha_delete_table(const char *name)
file->ha_delete_table(path) line 1991
int handler::delete_table(const char *name) //删除物理表文件;
/* 这里INNODB继承了父类handler ,
实际调用的是这个 int ha_innobase::delete_table
转到下面: #### INNODB 处理删除一个表 ####
如果是其他引擎,则直接删除数据文件,往下走*/
int mysys::my_delete_with_symlink(const char *name, myf MyFlags)
int mysys::my_delete(const char *name, myf MyFlags)

/* Delete the table definition file */ LINE 2042
int mysys::my_delete()

/* clear query cache*/
query_cache_invalidate3

/* writes to BINLOG */
############# INNODB 处理删除一个表 ##################
/* Drops a table from an InnoDB database. */
int ha_innobase::delete_table( const char*name) ; // 从INNODB删除表
int row_drop_table_for_mysql()
/* 外键关联检查 */
/* 锁住数据字典(独占锁)*/
/* Serialize data dictionary operations with dictionary mutex:
row_mysql_lock_data_dictionary(trx);

/* 更新数字字典(MEMDB,information_schema), line 3178 */
que_eval_sql(info, “PROCEDURE DROP_TABLE_PROC () IS\n”
/*这里是通过一个PROCEDURE来处理的*/

/* 更新数字字典(CACHE) */
void dict_table_remove_from_cache(dict_table_t*table))

/* 删除数据文件
/* Deletes a single-table tablespace */
ibool fil_delete_tablespace()

/* Frees a space object from the tablespace memory cache*/
ibool fil_space_free ()

/* Deletes a file. The file has to be closed before calling this. */
ibool os_file_delete ()
unlink((const char*)name);

/* 释放锁 */
row_mysql_unlock_data_dictionary(trx);

DROP TABLE大概就是这么一个过程 ;

分享到:
评论

相关推荐

    MySQL异常恢复-drop表恢复.docx

    MySQL 异常恢复-drop 表恢复 MySQL 异常恢复是指在 MySQL 数据库出现异常情况时,恢复数据库的操作。drop 表恢复是指在 MySQL 数据库中删除表后,恢复被删除的表的操作。undrop-for-innodb 是一种恢复被删除的表的...

    drop table - by 姜少华1

    在MySQL 8.0中,`DROP TABLE`的实现略有不同,增加了对XID状态、日志记录格式、以及临时表删除的检查,并且在删除过程中涉及到了更多的锁管理和缓存管理操作。例如,`mysql_rm_table_no_locks`函数用于执行删除,`...

    oracle数据库学习笔记总结

    MySQL的: drop table if exists 表名; SQL Server的: IF EXISTS (SELECT name FROM sysobjects WHERE name = '表名' AND type = 'U') DROP TABLE 表名; Oracle的: create or replace table 表名 ...; -- 直接写...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    标题提到的"‘Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql’"是一个处理这种转换的工具或过程。 首先,让我们理解这个过程的一般步骤: 1. **数据迁移需求分析**:在开始转换之前,了解源MySQL表的结构...

    Mysql转oracle工具

    MySQL到Oracle转换是一个常见的任务,特别是在企业级应用迁移或整合过程中。这个工具专注于将MySQL的数据库结构和数据转换为Oracle数据库兼容的格式。下面将详细解释这个过程涉及的知识点。 1. **SQL语言的差异**:...

    MySQL thread_cache和table_cache详解

    THREAD_CACHE MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建...

    MySQL定义异常和异常处理详解

    MySQL中的异常处理是数据库编程中不可或缺的一部分,它允许开发者预设对可能出现的错误或异常的响应,从而确保程序的稳定性和健壮性。在MySQL中,异常定义和处理主要是通过`DECLARE`语句来实现的。 1. **异常定义**...

    Oracle的表结构转成Mysql的表结构

    ### Oracle的表结构转成MySQL的表结构 #### 功能概述 本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数...

    linux下mysql的操作与存储过程

    5. 数据库管理:在MySQL客户端,可以使用`CREATE DATABASE`、`USE`、`DROP DATABASE`等命令创建、切换和删除数据库。 二、MySQL存储过程 存储过程是预编译的SQL语句集合,可在需要时重复调用,提高效率并简化复杂...

    Oracle Sql语句转换成Mysql Sql语句

    同时,转换后还需要对生成的MySQL SQL进行测试,确保在目标数据库环境中能正常执行。 总的来说,这个工具对于那些需要在Oracle和MySQL之间迁移数据库应用的开发者来说,是一个非常实用的资源。它通过自动化处理减少...

    mysql锁表解表

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...

    MySQL存储过程经典教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一组SQL语句并封装成一个可重复使用的对象。这个经典教程旨在深入探讨存储过程的各个方面,帮助读者掌握这一强大的数据库编程工具。 1. **存储...

    AAA.rar_MYSQL_Table_delphi mysql

    描述 "Copy One Table from mySQL to MS SQL" 明确指出这是一个关于从MySQL数据库中复制一个表到Microsoft SQL Server的过程。标签 "mysql table delphi_mysql" 进一步确认了这个项目涉及到Delphi编程和MySQL数据库...

    oracle 到mysql转换工具

    这款工具通常适用于那些需要从Oracle数据库迁移到MySQL数据库的企业或个人,可以有效地降低迁移过程中的复杂性和工作量。 首先,我们来详细了解Oracle数据库。Oracle是全球领先的商业级关系型数据库管理系统,广泛...

    mysql启动提示mysql.host 不存在,启动失败的解决方法

    error 日志当中的记录: [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 从发了帖子,只有人看,没有人回复,看到这种情况只能自己解决问题了,自己动手...

    mysql实现自动创建与删除分区

    MySQL数据库在大数据处理中扮演着重要角色,而分区技术是其优化查询性能的关键特性之一。本文将深入探讨如何实现MySQL的自动创建与删除分区,主要关注时间分区,并介绍相关存储过程和事件的设置。 首先,我们需要...

    恢复数据库_把后缀.frm,.myd,myi转换为.sql导入mysql数据库

    `--add-drop-table`则会在每个CREATE TABLE语句前添加DROP TABLE语句,以便于导入新数据库时能正确创建表。 - 对于.frm 文件,可以使用`mysqlfrm`工具来恢复表结构: ```bash mysqlfrm --host=localhost --user=...

    mysql常用命令集锦--初级DBA

    mysql> drop table 表名; mysql> alter table 旧表名 rename as 新表名; //修改表名 MySQL权限控制包括 FILE、PROCESS、RELOAD、SHUTDOWN 等权限,以及数据库/数据表/数据列权限,如ALTER、CREATE、DELETE、DROP、...

    MySQL存储过程系统学习资料

    在"MySQL存储过程.doc.doc"文档中,可能会详细讲解这些概念,并通过实例来展示如何创建、调用和管理存储过程,包括如何处理各种异常情况,以及如何利用存储过程提高数据库应用的效率和安全性。深入理解并熟练运用...

Global site tag (gtag.js) - Google Analytics