首页 > 数据库 >MySQL DROP TABLE

MySQL DROP TABLE

时间:2023-05-10 10:12:02浏览次数:40  
标签:cc 32 DROP root sql mysql MySQL TABLE table

DROP TABLE的堆栈

#0  row_drop_table_from_cache (tablename=0x7f7d580295b0 "db/t", table=0x7f7d58008b20, trx=0x7f7e50c0b150) at /root/mysql-5.7.32/storage/innobase/row/row0mysql.cc:4179
#1  0x00000000019fdb12 in row_drop_table_for_mysql (name=0x7f7dff2a58e0 "db/t", trx=0x7f7e50c0b150, drop_db=false, nonatomic=true, handler=0x0) at /root/mysql-5.7.32/storage/innobase/row/row0mysql.cc:4783
#2  0x00000000018ad140 in ha_innobase::delete_table (this=0x7f7d58002ac8, name=0x7f7dff2a7000 "./db/t") at /root/mysql-5.7.32/storage/innobase/handler/ha_innodb.cc:12612
#3  0x0000000000f109ac in handler::ha_delete_table (this=0x7f7d58002ac8, name=0x7f7dff2a7000 "./db/t") at /root/mysql-5.7.32/sql/handler.cc:4973
#4  0x0000000000f0a430 in ha_delete_table (thd=0x7f7d58010450, table_type=0x2f2c440, path=0x7f7dff2a7000 "./db/t", db=0x7f7d580028d0 "db", alias=0x7f7d58002310 "t", generate_warning=true) at /root/mysql-5.7.32/sql/handler.cc:2602
#5  0x000000000159be90 in mysql_rm_table_no_locks (thd=0x7f7d58010450, tables=0x7f7d58002348, if_exists=false, drop_temporary=false, drop_view=false, dont_log_query=false) at /root/mysql-5.7.32/sql/sql_table.cc:2553
#6  0x000000000159b13d in mysql_rm_table (thd=0x7f7d58010450, tables=0x7f7d58002348, if_exists=0 '\000', drop_temporary=0 '\000') at /root/mysql-5.7.32/sql/sql_table.cc:2203
#7  0x0000000001517640 in mysql_execute_command (thd=0x7f7d58010450, first_level=true) at /root/mysql-5.7.32/sql/sql_parse.cc:3629
#8  0x000000000151cc5a in mysql_parse (thd=0x7f7d58010450, parser_state=0x7f7dff2a8550) at /root/mysql-5.7.32/sql/sql_parse.cc:5584
#9  0x0000000001512662 in dispatch_command (thd=0x7f7d58010450, com_data=0x7f7dff2a8cb0, command=COM_QUERY) at /root/mysql-5.7.32/sql/sql_parse.cc:1491
#10 0x000000000151159b in do_command (thd=0x7f7d58010450) at /root/mysql-5.7.32/sql/sql_parse.cc:1032
#11 0x0000000001643668 in handle_connection (arg=0x6e41250) at /root/mysql-5.7.32/sql/conn_handler/connection_handler_per_thread.cc:313
#12 0x0000000001ccf6ce in pfs_spawn_thread (arg=0x6e37410) at /root/mysql-5.7.32/storage/perfschema/pfs.cc:2197
#13 0x00007f7e5d5fbea5 in start_thread () from /lib64/libpthread.so.0
#14 0x00007f7e5bdecb0d in clone () from /lib64/libc.so.6

具体实现

|mysql_rm_table
    - 不允许DROP已启用的General Log Table或Slow Log Table
    - 获取MDL-EXCLUSIVE排他锁;获取tablespace name的IX MDL locks(MDL_INTENTION_EXCLUSIVE)
    - 清除table definition cache中的相关表信息
|----mysql_rm_table_no_locks
        - 准备将要写入到Binlog Log中的Drop 语句
        - 检查是否已经获取了待删除表的MDL_EXCLUSIVE锁
        - 进行InnoDB存储引擎层的删除操作
|--------ha_delete_table
|------------handler::ha_delete_table
|----------------ha_innobase::delete_table // 具体实现InnoDB层的删除逻辑
                     - 分配一个ddl事务
|--------------------row_drop_table_for_mysql
                              - 获取dict_sys->mutex
                              - 删除InnoDB Symbolic Link (ISL)
                              - 停止搜集并删除表的统计信息
                              - 将表从table open cache的LRU区域移动到non-LRU区域
                              - 外键检查
                              - 在数据字典中失效索引
                              - 拼接SQL语句在系统表中删除数据字典
|------------------------row_drop_single_table_tablespace // 删除表空间
|----------------------------fil_delete_tablespace
|--------------------------------buf_LRU_flush_or_remove_pages
|------------------------row_drop_table_from_cache // 清理LRU
                                  - Remove the indexes from the data directory cache
                                  - Remove table from the hash tables of tables
                                  - Remove table from LRU or non-LRU list
                                  - Free virtual column template if any
                              - 释放dict_sys->mutex
                      - 引擎层提交事务
        - 如果成功进行了存储引擎层的删除,则删除表定义FRM文件、和表相关的triggers、失效相关的query cache
        - 写入Binlog
        - 为了防止遗留下表锁,在最后判断是否有锁,如果有的话就释放       

  

标签:cc,32,DROP,root,sql,mysql,MySQL,TABLE,table
From: https://www.cnblogs.com/wagaga/p/17387155.html

相关文章

  • CMake报告:Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)错误
    原因是电脑缺少pkg-config库Linux可以直接apt-get即可:sudoapt-getinstallpkg-config下面详细说一下Windows如何手动安装:转到http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/下载文件pkg-config_0.26-1_win32.zip将文件bin/pkg-config.exe解压缩到your......
  • iptables之forward转发
    1、网络防火墙2、iptables之FORWARD转发实例3、iptables之FORWARD过滤实例1、网络防火墙网络防火墙处于网络入口的边缘,针对网络入口进行防护,针对整个网络入口后面的局域网。作用:当外部网络主机与内部网络主机互相进行通讯时,都要经过iptables所在的主机,由iptables所在的主机进行“......
  • AI 绘画基础 - 细数 Stable Diffusion 中的各种常用模型 【
    AI绘画新手魔导士在刚开始玩StableDiffusion时总会遇到各种新的概念,让人困惑,其中就包括各种模型和他们之间的关系。魔法师入门得先认识各种法师装备(各种模型),让我们遇到问题知道使用何种装备来协助自己发挥更大的效果。safetensors在了解各种模型之前,有必须先了解下safeten......
  • 用print-js实现打印功能时element table组件打印不全的问题
    插件下载:npminstall--saveprint-js解决方案,修改print.js里面的 getHtml//打印类属性、方法定义/*eslint-disable*/constPrint=function(dom,options){  if(!(thisinstanceofPrint))returnnewPrint(dom,options);  this.options=this.exten......
  • 如何进行MySQL源码调试(一条select语句的执行流程)
    一、背景MySQL是当今世上最受欢迎的使用最广泛的开源数据库,它的繁荣离不开它的开源特性。放在过去商业数据库的时代,大家都没有机会接触到数据库的源代码,但在如今开源数据库的时代,越来越多的人开始研究数据库的源码,并给社区贡献代码,MySQL官方每次发布新版本都要感谢一些在社区上贡......
  • MySQL(二十二)其他数据库日志(二)bin log二进制日志
    MySQL(二十二)其他数据库日志(二)binlog二进制日志binlog二进制日志binlog即binarylog,二进制日志,也叫做变更日志它记录所有更新数据的DDL和DML语句,但是不包含没有修改数据的语句(如Select、show等),以事件的形式记录保存在二进制文件中可以用于主从服务器之间的数据同步......
  • MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志
    MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志1MySQL支持的日志1.1日志类型慢查询日志:记录执行时间超过long_query_time的所有查询,方便我们对查询进行优化通用查询日志:记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题......
  • Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Clas
      mybatis-plus生成的日期类型默认是localdatetime,数据库是datetime,按道理转换应该可以,我又不想把实体类转换成date查看依赖<--locadate/locadatetime的时间依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-ty......
  • KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
    案例说明:相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点。适用版本:KingbaseESV8R6、MySQL8.0一、MySQL的排序规则1、排序规则(collation)排序规则是依赖于字符集,字符集是用来定义MySQL存储不......
  • KingbaseES 实现 MySQL 函数 last_insert_id
    用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值。mysql文档中关于函数的说明和例子:LAST_INSERT_ID()如果没有参数,则LAST_INSERT_ID()返回一个BIGINTUNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语......