bug#66718 Assert from DROP TABLE concurrent with ibuf merges

http://bugs.mysql.com/bug.php?id=66718

Assert from DROP TABLE concurrent with ibuf merges

A.原因:

master线程发起的ibuf merge和用户线程的drop table操作可能存在竞争。

1.master线程请求文件page IO,读入内存之前,会调用buf_page_init_for_read->fil_tablespace_deleted_or_being_deleted_in_mem

如果这时候该表尚未标记为删除,那么则认为可以继续读文件Page。

2.用户线程调用fil_delete_tablespace

>设置space->stop_ibuf_merges = TRUE

>确认space->n_pending_ibuf_merges == 0  

设置space->is_being_deleted = TRUE;

>确认space->chain->n_pending为0  并且 space->n_pending_flushes = 0

继续下面的逻辑

3.master线程继续调用函数fil_io -> fil_node_prepare_for_io会递增node->n_pending++

4.用户线程继续往下走,调用

fil_delete_tablespace->fil_space_free->fil_node_free

在这里会做断言:

ut_a(node->n_pending == 0);

不过在Percona版本中,断言处就不太一样,而是:

ut_a(node->n_pending == 0 || space->is_being_deleted);

因为在free node之前,我们已经设置了space->is_being_deleted为TRUE,因此不会触发断言错误。

B.总结:

根据bug描述及分析,这个bug不影响我们的线上MySQL版本。

C.其他:

我们已经确保space->n_pending_ibuf_merges为0了,为什么还会有对该表的ibuf Merge呢?

对n_pending_ibuf_merges计数器操作的函数:fil_inc_pending_ibuf_merges及fil_decr_pending_ibuf_merges

我们来看看,在何时会递增这个计数器。

ibuf_merge_or_delete_for_page //每次读入一个索引页时,都会去尝试Merge这个索引页上在内存中缓存的操作,如果该page上没有ibuf,或者表正在被删除,则不修改计数器,否则对计数+1,当执行完相关流程后,再调用fil_decr_pending_ibuf_merges进行-1.

计数器只在函数ibuf_merge_or_delete_for_page中做了修改。

请求文件页操作在调用ibuf_merge_or_delete_for_page之前,由master线程发起(用户线程无法和DDL并发)

D.TODO

除了这个bug。另外一个去年春节发生,年底才fix的bug,也需要去跟踪(http://bugs.mysql.com/bug.php?id=66819)

这些都和INSERT BUFFER(或者称为change buffer)相关,后续会对这个模块的代码做分析

时间: 2024-09-20 00:16:38

bug#66718 Assert from DROP TABLE concurrent with ibuf merges的相关文章

[MySQL 源码] MySQL drop table(压缩表)效率与流程分析

 之前发生过一起连续drop压缩表,最后长时间等待信号量crash,线上alert log里的报错是: OS WAIT ARRAY INFO: reservation count 36647199, signal count 34050225 --Thread 1331538240 has waited at row0purge.c line 680 for 950.00 seconds the semaphore: S-lock on RW-latch at 0xe60b60 '&dict_o

MySQL · 特性分析 · drop table的优化

背景 系统为了加速对象的访问,通常都会增加一层缓存,以缓解下一层IO的瓶颈,OS的page cache和数据库的buffer pool都基于此. 但对象的删除,如果同步清理对象的缓存的话,不仅大大增加了延时,同时可能因为缓存过大导致IO blooding.所以针对缓存的清理,都会采用lazy drop的优化,下面我们就来对比下percona和官方针对drop table的lazy drop 优化. 假设使用innodb_file_per_table为表创建独立的tablespace,在业务处理过

MySQL · 引擎特性 · DROP TABLE之binlog解析

Drop Table的特殊之处 Drop Table乍一看,与其它DDL 也没什么区别,但当你深入去研究它的时候,发现还是有很多不同.最明显的地方就是DropTable后面可以紧跟多个表,并且可以是不同类型的表,这些表还不需要显式指明其类型,比如是普通表还是临时表,是支持事务的存储引擎的表还是不支持事务的存储引擎的表等.这些特殊之处对于代码实现有什么影响呢?对于普通表,无论是创建还是删除,数据库都会产生相应的binlog日志,而对于临时表来说,记录binlog日志就不是必须的.对于采用不同存储引

mysql执行drop table 数据恢复方法

对于MySQL数据库的innodb引擎的数据库中,由于误操作删除表,或者由于sqldump自动生成语句含drop table create table语句导致数据丢失,在没有覆盖的情况下,可以实现完美恢复创建测试表 mysql> CREATE TABLE recover.`t_drop` (     ->   `messageId` varchar(30) NOT NULL,     ->   `msgContent` varchar(1000) default NULL,     -&

为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭)

问题描述 为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭) 为什么drop table 后数据还存在在数据字典中(10g 回收站已关闭)?是否有等待?如何证明有堵塞?

Drop table 出现的问题

由于应用下线,需要把数据库中相关应用的表删除,库中有一千多张表,事先已经将所有的表rename到test库中,drop table的脚步也已经准备好,所以接下来的工作本以为是很轻松的事情,但是在执行脚本的过程中,发现删除表的速度感觉有点慢,查看主机的负载也在挺高的,报警消息中thread running过高也出现了,发现大多数线程的状态是Opening Tables,但还是勉强的忍受了过去,事后想想为什么删除表也会这么的慢? 在drop table的时候有几件事情需要去做: 对目标表加上writ

Oracle10g 回收站及彻底删除table : drop table xx purge

drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 1.通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句flashback table <user_recyclebin.object_name or user_recyclebin.original_name> to before drop [rename to <new_table_name>];   将回收站里的表恢复为原

SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?

原文:SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?   本文出处:http://www.cnblogs.com/wy123/p/6704619.html      问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时候一个一个显式地删除过程中定义的临时表(drop table #tName),有些人又没有这个习惯,对于不明真相的群众或者喜欢思考的人会问,存储过程中定义的临

利用硬链接和truncate降低drop table对线上环境的影响

作者简介 肖鹏 微博研发中心数据库技术负责人,主要负责微博数据库(MySQL/Reids/HBase/Memcached)相关的业务保障,性能优化,架构设计以及周边的自动化系统建设.10年互联网数据库架构和管理经验,专注于数据库的高性能和高可用技术保障方向. 众所周知drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常. 首先,我们看一下为什么drop容量大的table会影响线上服务 直接执行drop table,mysql会将表定义和表数据