Chinaunix首页 | 论坛 | 博客
  • 博客访问: 311544
  • 博文数量: 85
  • 博客积分: 1508
  • 博客等级: 上尉
  • 技术积分: 791
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-06 11:49
文章分类

全部博文(85)

文章存档

2013年(22)

2012年(63)

我的朋友

分类: Mysql/postgreSQL

2012-10-30 10:34:08

前几天,在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大概就是这么一个过程 ;

原文地址:

阅读(1799) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~