一直好奇innodb main thread的thread state。最近偶然发现没有ddl操作的时候,show engine innodb status时,main thread处于"doing background drop tables",就顺便了解了一下有关 innodb main thread状态的一些处理逻辑。主要的处理逻辑在srv/srv0srv.c文件里。
main thread的初始状态(srv_main_thread_op_info)为"";srv_master_thread开始后就设置main thread状态为“reserving kernel mutex”,获取kernel_mutex,之后就开始了各种操作&状态转换,本来打算画幅图的,结果画到一半感觉可以从任何一个状态转换到另外一个状态(对很多逻辑不是非常清楚,有待考证)。
从代码(5.1.58,innodb_plugin 1.0.17)里可以看到main thread有下面一些状态:
waiting for server activity suspending reserving kernel mutex flushing buffer pool pages flushing log doing insert buffer merge purging doing background drop tables making checkpoint waiting for buffer pool flush to end sleeping ""
reserving kernel mutex是为了获取kernel mutex,kernel mutex获取主要是为了判断server是否干了什么活,main thread需要处理:
//...master thread的一次循环开始后,初始化old_activity_count... mutex_enter(&kernel_mutex); /* Store the user activity counter at the start of this loop */ old_activity_count = srv_activity_count; mutex_exit(&kernel_mutex); //...判断server是否有activity需要main thread处理... mutex_enter(&kernel_mutex); /* ---- When there is database activity, we jump from here back to the start of loop */ if (srv_activity_count != old_activity_count) { mutex_exit(&kernel_mutex); goto loop; } mutex_exit(&kernel_mutex);
waiting for server activity,表示server很闲,master thread没活儿干。
sleeping,表示main threa正在sleep,时间是1s,sleep完之后就开始了令人“疑惑”的"doing background drop tables",不过看完注释就应该很理解,为什么会有这个状态了:
... loop: ... srv_main_thread_op_info = "sleeping"; srv_main_1_second_loops++; if (!skip_sleep) { os_thread_sleep(1000000); srv_main_sleeps++; } skip_sleep = FALSE; /* ALTER TABLE in MySQL requires on Unix that the table handler can drop tables lazily after there no longer are SELECT queries to them. */ srv_main_thread_op_info = "doing background drop tables"; row_drop_tables_for_mysql_in_background(); srv_main_thread_op_info = ""; ... background_loop: /* ---- In this loop we run background operations when the server is quiet from user activity. Also in the case of a shutdown, we loop here, flushing the buffer pool to the data files. */ /* The server has been quiet for a while: start running background operations */ srv_main_background_loops++; srv_main_thread_op_info = "doing background drop tables"; n_tables_to_drop = row_drop_tables_for_mysql_in_background(); ...
row_drop_tables_for_mysql_in_background会去检测row_mysql_drop_list,如果有需要drop的表,则取出第一个,调用row_drop_table_for_mysql处理掉。这里每次只处理一个。
上面是main thread处于"droping background drop tables"的第一种情况,这种情况一般是main thread发现server有活动了,需要去处理,开始干活,而每次干活都会先去清理需要后台处理的表:
if (srv_activity_count != old_activity_count) { mutex_exit(&kernel_mutex); goto loop; }
另外,当系统比较空闲,main thread 会主动地跳转到background_loop,这时main thread也会处于这种状态:
if (srv_activity_count == old_activity_count) { /* There is no user activity at the moment, go to the background loop */ goto background_loop; }
当启用了innodb_fast_shutdown,关机的时候,main thread也会处于这种状态:
if (srv_fast_shutdown && srv_shutdown_state > 0) { goto background_loop; }
参考链接:
http://gtowey.blogspot.com/2012/09/whats-innodb-main-thread-really-doing.html
相关推荐
在MySQL 8.0中,`DROP TABLE`的实现略有不同,增加了对XID状态、日志记录格式、以及临时表删除的检查,并且在删除过程中涉及到了更多的锁管理和缓存管理操作。例如,`mysql_rm_table_no_locks`函数用于执行删除,`...
MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。
在 innodb_file_per_table=ON 场景下,drop 表后,.ibd 文件也被删除了,需要扫描磁盘获取相应的数据页进行恢复。如果是 innodb_file_per_table=OFF,则数据存放在共享表空间 ibdata1 里,只要扫描该 ibdata1 文件...
drop table if exists departments; drop table if exists employees; drop table if exists jobs; drop table if exists locations; drop table if exists countries; drop table if exists regions; drop table if...
如果你的服务器的CPU或者IO使用接受饱和,特别是偶尔出现峰值,这时候系统想在超载时能正常处理查询,那么强烈建议关注innodb_thread_concurrency
使用`DROP TABLE`或`CREATE TABLE AS SELECT`比`DELETE FROM`更快,尤其是在处理大量数据时。 以上是针对InnoDB性能调优的一些核心建议,实际应用中应根据系统具体情况进行调整。记得定期检查和监控系统状态,以...
InnoDB 删除数据后释放磁盘空间需要通过设置参数 innodb_file_per_table=1 和使用 OPTIMIZE TABLE 命令来实现。如果没有设置这个参数,那么需要将数据库导出,删除 InnoDB 数据库文件,然后再倒入。 此外,InnoDB ...
通常,InnoDB使用一个后台线程“log thread”在磁盘上通过fsync()命令来刷新日志。文章还提到了Redo日志文件组中文件的数量,通常是2到3个。 9. 回滚段和UNDO空间 回滚段是用于存储撤销事务更改的内部结构。在...
THREAD_CACHE MySQL里面为了提高客户端请求创建连接过程的性能,提供了一个连接池也就是 Thread_Cache池,将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建...
此外,`py_innodb_page_info`还能揭示InnoDB的锁机制,例如行级锁(row lock)、表级锁(table lock)等,这些都是保证并发性和事务安全的关键。通过对锁状态的分析,我们可以优化查询性能,减少锁定冲突。 总的来...
最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...
InnoDB表存储结构的核心特点之一是它采用索引组织表(Index Organized Table, IOT)的方式存储数据。这意味着表中的数据是根据主键排序并存储的。因此,每张InnoDB表必须有一个主键,如果没有显式定义,则InnoDB会自动...
利用MySQL性能监控工具如SHOW STATUS、SHOW VARIABLES、SHOW ENGINE INNODB STATUS等,监控InnoDB的运行状态,及时发现和解决问题。 总结,MySQL的InnoDB存储引擎在提供强大功能的同时,也带来了丰富的优化可能性...
### InnoDB: 热备份手册 #### 一、ibbackup选项 InnoDB热备份工具(简称ibbackup)是一款能够实现在MySQL运行期间对InnoDB数据库进行无锁备份的强大工具,它不会干扰到正常的数据库处理流程。通过ibbackup,用户...
在MySQL数据库系统中,InnoDB存储引擎是默认的引擎,它提供了事务处理、行级锁定以及外键支持,使得InnoDB在许多业务场景下成为首选。本篇文章将深入探讨InnoDB存储引擎中的索引大小问题,包括其影响因素、限制以及...
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...
### MySQL体系结构及原理(innodb)图文完美解析 #### 宏观认识 在深入探讨MySQL的体系结构及其核心组件InnoDB之前,我们先来理解几个基础概念。 1. **MySQL简介** MySQL是一种开源的关系型数据库管理系统(RDBMS)...
`innodb_thread_concurrency`限制并发线程数,以避免过多并发导致的锁竞争。 综上所述,InnoDB作为MySQL的核心存储引擎,提供了丰富的特性和高度的灵活性,能够满足各种复杂的数据管理需求,特别是在需要事务处理和...