源码分析DROP TABLE
DROP TABLE的堆栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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 |
具体实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |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 // 清理LUR并删除表空间文件 |----------------------------fil_space_for_table_exists_in_mem // If the tablespace is not in the cache, just delete the file. |----------------------------fil_delete_tablespace // 删除IBD文件及清理LRU |--------------------------------buf_LRU_flush_or_remove_pages |------------------------------------buf_LRU_drop_page_hash_for_tablespace // 删除hash index |------------------------------------buf_LRU_remove_pages // 清理LUR - 删除表空间文件 - 释放dict_sys->mutex - 引擎层提交事务 - 如果成功进行了存储引擎层的删除,则删除表定义FRM文件、和表相关的triggers、失效相关的query cache - 写入Binlog - 为了防止遗留下表锁,在最后判断是否有锁,如果有的话就释放 |
分类:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?