没有合适的资源?快使用搜索试试~ 我知道了~
drop table - by 姜少华1
需积分: 0 0 下载量 92 浏览量
2022-08-08
19:47:32
上传
评论
收藏 20KB DOCX 举报
温馨提示
试读
3页
dd_drop_tablespace(client, thd, dd_space_id) 删除表空间destroy(file) file是handler类型bo
资源详情
资源评论
资源推荐
5.7.26 drop table
5.7.26 整个 DROP TABLE 过程可以简单地概括为
1、申请持有表的 MDL 写锁
-- 不能对该表执行 DML 操作和查询操作
2、获取 dict_sys->mutex 这个数据字典的全局锁
-- 函数:ha_innobase::delete_table->row_drop_table_for_mysql->row_mysql_lock_data_dictionary
-- 阻塞 DML 语句,不会阻塞查询语句
3、启动一个 InnoDB DDL 事务
-- 函数:ha_innobase::delete_table->row_drop_table_for_mysql->trx_start_for_ddl
4、设置 table->to_be_dropped = true
5、row_add_table_to_background_drop_list
-- 这里还不理解
6、从系统表中清理表信息
拼接了一个巨大的 SQL,用来从系统表中清理信息,会释放索引树(主键索引树、二级索引树),同时清理 AHI。
从数据字典缓存中删除表
7、row_drop_single_table_tablespace 删除表空间
lazy drop 逻辑,清理 buffer pool 的 flush list,会多次持有和释放 buffer pool mutex 以及 flush list mutex,释放 cpu 资源:
8、写入 MLOG_FILE_DELETE 类型的 redo 日志
9、unlink ibd 文件
-- 删除 ibd 文件。
-- ha_innobase::delete_table->row_drop_table_for_mysql->row_drop_single_table_tablespace->fil_delete_tablespace->os_file_delete
-- C 语言 unlink()函数:删除文件
10、提交 InnoDB DLL 事务
-- ha_innobase::delete_table->row_drop_table_for_mysql->trx_commit_for_mysql
11、 释放 dict_sys->mutex
-- ha_innobase::delete_table->row_drop_table_for_mysql->row_mysql_unlock_data_dictionary
12、释放表的 MDL 写锁。
Mysql8.0 drop table
drop table test1023;
b mysql_execute_command
b mysql_rm_table
res = mysql_rm_table(thd, first_table, lex->drop_if_exists, lex->drop_temporary); //删除表 first_table 表示删除的表, first_table->table_name 表名
//1、检查:XA_IDLE 或 XA_PREPARED 事务状态中不允许使用 DROP 表。
//2、如果处于 MIXED 模式并删除 TEMP 表,则 DROP 表需要确定其日志记录格式。
//3、禁用删除已启用的日志表,必须在名称锁定之前完成
error = mysql_rm_table_no_locks(thd, tables, if_exists, drop_temporary, false, ¬_used, &post_ddl_htons,&fk_invalidator, &safe_to_release_mdl); 执行删除普通表或临时表。
drop_base_table(thd, drop_ctx, table, true /* atomic */, post_ddl_htons, fk_invalidator, &safe_to_release_mdl_atomic)) 删除单个基表
tdc_remove_table(thd, TDC_RT_REMOVE_ALL, table->db, table->table_name, false); 从表定义缓存中删除 TABLE 和 TABLE_SHARE 的全部或部分(取决于参数)实例。
table_cache_manager.lock_all_and_tdc(); 获取表缓存和表定义缓存(即 LOCK_open)的所有实例的锁。
for (uint i = 0; i < table_cache_instances; i++) m_table_cache[i].lock() //给每个表缓存实例加锁;table_cache_instances
mysql_mutex_lock(&LOCK_open) //表定义缓存加锁;table_definition_cache
key_length = create_table_def_key(db, table_name, key) 为表创建表缓存/表定义缓存键。??
table_cache_manager.free_table(thd, remove_type, share)
今年也要加油呀
- 粉丝: 17
- 资源: 312
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0