开源数据库 - mysql - innodb源码阅读 - 线程启动
线程启动源码
/** Start up the InnoDB service threads which are independent of DDL recovery.*/void srv_start_threads() {if (!srv_read_only_mode) {/* Before 8.0, it was master thread that was doing periodicalcheckpoints (every 7s). Since 8.0, it is the log checkpointerthread, which is owned by log_sys, that is responsible forperiodical checkpoints (every innodb_log_checkpoint_every ms).Note that the log checkpointer thread was created earlier andis already active, but the periodical checkpoints were disabled.Only the required checkpoints were allowed, which includes:- checkpoints because of too old last_checkpoint_lsn,- checkpoints explicitly requested (because of call tolog_make_latest_checkpoint()).The reason was to make the situation more deterministic duringthe startup, because then:- it is easier to write mtr tests,- there are less possible flows - smaller risk of bug.Now we start allowing periodical checkpoints! Since now, it'shard to predict when checkpoints are written! */log_limits_mutex_enter(*log_sys);log_sys->periodical_checkpoints_enabled = true; // log_checkpoint 周期性检查点,检查点线程log_limits_mutex_exit(*log_sys);}srv_threads.m_buf_resize =os_thread_create(buf_resize_thread_key, 0, buf_resize_thread); // 后台线程,用于收缩表空间。这个线程 m_buf_resize 是用于缓冲池(buffer pool)的大小调整srv_threads.m_buf_resize.start();if (srv_read_only_mode) {purge_sys->state = PURGE_STATE_DISABLED; // 只读模式 关闭purge 线程return;}/* Create the master thread which does purge and other utilityoperations */srv_threads.m_master =os_thread_create(srv_master_thread_key, 0, srv_master_thread); // 创建主线程srv_threads.m_master.start();if (srv_force_recovery == 0) { // 根据恢复级别来判断是否需要更新缓存区的最大表空间id/* In the insert buffer we may have even bigger tablespaceid's, because we may have dropped those tablespaces, butinsert buffer merge has not had time to clean the records fromthe ibuf tree. */ibuf_update_max_tablespace_id();}/* Create the dict stats gathering thread */srv_threads.m_dict_stats =os_thread_create(dict_stats_thread_key, 0, dict_stats_thread); // 启动 统计线程dict_stats_thread_init();srv_threads.m_dict_stats.start();/* Create the thread that will optimize the FTS sub-system. */fts_optimize_init(); // 启动 FTS优化线程srv_start_state_set(SRV_START_STATE_STAT); // 设置状态为 SRV_START_STATE_STAT}
线程启动
if (!srv_read_only_mode) {/* Before 8.0, it was master thread that was doing periodicalcheckpoints (every 7s). Since 8.0, it is the log checkpointerthread, which is owned by log_sys, that is responsible forperiodical checkpoints (every innodb_log_checkpoint_every ms).Note that the log checkpointer thread was created earlier andis already active, but the periodical checkpoints were disabled.Only the required checkpoints were allowed, which includes:- checkpoints because of too old last_checkpoint_lsn,- checkpoints explicitly requested (because of call tolog_make_latest_checkpoint()).The reason was to make the situation more deterministic duringthe startup, because then:- it is easier to write mtr tests,- there are less possible flows - smaller risk of bug.Now we start allowing periodical checkpoints! Since now, it'shard to predict when checkpoints are written! */log_limits_mutex_enter(*log_sys);log_sys->periodical_checkpoints_enabled = true; // log_checkpoint 周期性检查点,检查点线程log_limits_mutex_exit(*log_sys);}
这段代码是用于在InnoDB存储引擎中启动周期性检查点(checkpoints)的逻辑。以下是对代码的逐行解释:
-
if (!srv_read_only_mode) {:这行代码检查服务器是否不是只读模式。如果服务器不是只读模式,则执行下面的代码块。 -
/* Before 8.0, it was master thread that was doing periodical checkpoints (every 7s). Since 8.0, it is the log checkpointer thread, which is owned by log_sys, that is responsible for periodical checkpoints (every innodb_log_checkpoint_every ms). */:这段注释说明了在8.0版本之前,是由主(master)线程负责周期性检查点(每7秒一次)。而从8.0版本开始,这个任务由log_sys拥有的日志检查点(log checkpointer)线程负责,该线程会按照innodb_log_checkpoint_every毫秒的频率进行周期性检查点。 -
Note that the log checkpointer thread was created earlier and is already active, but the periodical checkpoints were disabled.:这行注释指出日志检查点线程已经创建并且处于活动状态,但周期性检查点被禁用。 -
Only the required checkpoints were allowed, which includes: - checkpoints because of too old last_checkpoint_lsn, - checkpoints explicitly requested (because of call to log_make_latest_checkpoint()).:这行注释说明了在启动阶段,只允许必要的检查点,包括因为最后一个检查点LSN太旧而触发的检查点,以及通过调用log_make_latest_checkpoint()显式请求的检查点。 -
The reason was to make the situation more deterministic during the startup, because then: - it is easier to write mtr tests, - there are less possible flows - smaller risk of bug.:这行注释解释了在启动阶段限制检查点的原因,是为了使情况更加确定,从而更容易编写mtr测试,减少可能的流程,降低错误风险。 -
Now we start allowing periodical checkpoints! Since now, it's hard to predict when checkpoints are written! */:这行注释表明现在开始允许周期性检查点,这意味着从现在开始,很难预测检查点何时被写入。 -
log_limits_mutex_enter(*log_sys);:这行代码进入log_sys的互斥锁(mutex)。 -
log_sys->periodical_checkpoints_enabled = true;:这行代码将log_sys的periodical_checkpoints_enabled属性设置为true,从而启用周期性检查点。 -
log_limits_mutex_exit(*log_sys);:这行代码退出log_sys的互斥锁。
总的来说,这段代码的作用是在服务器不是只读模式的情况下,启用InnoDB存储引擎的日志检查点线程的周期性检查点功能。
srv_threads.m_buf_resize =os_thread_create(buf_resize_thread_key, 0, buf_resize_thread); // 后台线程,用于收缩表空间。这个线程 m_buf_resize 是用于缓冲池(buffer pool)的大小调整srv_threads.m_buf_resize.start();
这个线程 m_buf_resize 是用于缓冲池(buffer pool)的大小调整。在InnoDB存储引擎中,缓冲池是一个内存区域,用于缓存数据库页面,以减少对磁盘的访问次数,从而提高数据库的性能。缓冲池的大小对于数据库的性能至关重要,因为它直接影响到数据库能够缓存的数据量。
m_buf_resize 线程的主要职责是监控缓冲池的使用情况,并根据需要调整缓冲池的大小。这可能涉及增加或减少缓冲池的内存分配,以适应数据库的工作负载。例如,如果数据库的查询负载增加,可能需要增加缓冲池的大小以容纳更多的缓存页面;反之,如果负载减少,可能需要减少缓冲池的大小以释放内存资源。
调整缓冲池大小的过程通常是动态的,并且是基于一些预定义的策略或阈值。例如,InnoDB可能会根据缓冲池的命中率、脏页的比例、可用内存的大小等因素来决定是否需要调整缓冲池的大小。
在实际的数据库管理中,管理员可以通过配置参数来影响 m_buf_resize 线程的行为,例如设置缓冲池的最小和最大大小,以及调整大小的步长和频率等。
总的来说,m_buf_resize 线程是InnoDB存储引擎中一个重要的后台线程,它通过动态调整缓冲池的大小来优化数据库的性能和资源使用。
m_dict_stats 线程在 InnoDB 存储引擎中负责收集和更新数据字典的统计信息。数据字典是 InnoDB 存储引擎中用于存储数据库对象(如表、索引、列等)元数据的核心组件。这些统计信息对于查询优化器来说非常重要,因为它们帮助优化器做出更明智的决策,例如选择最佳的查询执行计划。
具体来说,m_dict_stats 线程的主要职责包括:
- 收集统计信息:定期扫描数据字典中的对象,收集关于表大小、索引使用情况、列数据分布等统计信息。
- 更新统计信息:根据收集到的数据,更新数据字典中的统计信息表。
- 监控数据变化:持续监控数据库中的数据变化,以便在数据发生变化时及时更新统计信息。
通过这些操作,m_dict_stats 线程确保查询优化器能够基于最新的统计信息做出最优的查询计划决策,从而提高数据库的整体性能。
在 InnoDB 中,统计信息的收集和更新是一个后台任务,它会在数据库运行期间持续进行,以保证统计信息的准确性和实时性。
FTS 子系统(FTS sub-system)全称为 Full-Text Search 子系统,它是 InnoDB 存储引擎中的一个组件,用于支持全文搜索功能。全文搜索是一种能够在文本数据中搜索特定关键词或短语的技术,它允许用户在大量文本数据中快速找到所需的信息。
在 InnoDB 中,FTS 子系统通过创建和维护一个特殊的索引来实现全文搜索。这个索引包含了文档中所有单词的信息,以及它们在文档中的位置。当用户执行全文搜索查询时,FTS 子系统会使用这个索引来快速定位包含查询关键词的文档,并返回搜索结果。
FTS 子系统的主要功能包括:
- 索引管理:创建、更新和删除全文索引。
- 查询处理:解析和执行全文搜索查询。
- 结果排序:根据相关性对搜索结果进行排序。
- 性能优化:通过缓存和其他技术提高搜索性能。
在 InnoDB 中,FTS 子系统的实现基于 MyISAM 存储引擎的全文搜索功能,但它在 InnoDB 中进行了优化和改进,以提供更好的性能和可靠性。
在当前的代码片段中,srv_start_threads() 函数正在启动 InnoDB 服务线程,其中包括创建一个优化 FTS 子系统的线程。这个线程的主要职责是监控和优化 FTS 索引的性能,确保全文搜索功能能够高效运行。
扩展
只读模式
MySQL服务器的只读模式是一个重要的功能,它在多个方面发挥着关键作用。以下是对MySQL服务器只读模式作用的详细阐述:
一、保护关键数据
只读模式的核心作用是保护数据库中的关键数据不被意外修改或删除。在只读模式下,用户只能执行查询操作(如SELECT),而无法进行插入(INSERT)、更新(UPDATE)或删除(DELETE)等写操作。这有助于防止因误操作或恶意攻击而导致的数据损坏或丢失。
二、确保数据一致性
在数据库维护、备份或迁移等过程中,确保数据一致性至关重要。通过将数据库设置为只读模式,可以防止在这些操作期间对数据进行修改,从而确保数据的一致性和完整性。这对于维护数据库的可靠性和稳定性具有重要意义。
三、提高读取性能
在只读模式下,由于不允许进行写操作,因此可以减少锁的竞争,从而提高读取性能。这对于需要频繁读取数据的应用场景来说是一个显著的优势。然而,也需要注意到,在只读模式下,一些写入相关的缓存和日志功能可能会被关闭,这可能会对某些性能产生一定影响,但通常这种影响较小。
四、实现主从复制中的只读服务器
在MySQL的主从复制架构中,只读模式可以用于实现只读服务器。通过将从服务器设置为只读模式,可以确保它只用于查询操作,而不会干扰主服务器的写操作。这有助于实现读写分离,提高系统的可扩展性和性能。
五、应用场景
- 数据库备份:在进行数据库备份时,为了防止备份过程中数据被修改,可以将数据库设置为只读模式。
- 维护期间的数据保护:在数据库维护期间,如升级、修复或优化等操作时,可以通过设置只读模式来限制对数据库的写操作,确保数据的一致性。
- 只读分析场景:在需要进行大量数据分析的场景下,可以通过设置只读模式来限制对数据库的写操作,从而提高读取性能并保护数据不被修改。
六、注意事项
- 全局影响:只读模式是全局的,会影响整个数据库实例。因此,在设置只读模式前,需要评估其对业务的影响,并通知相关团队。
- 权限绕过:具有SUPER权限的用户可以绕过只读模式的限制进行写操作。因此,在设置只读模式时,需要考虑权限管理问题。
- 恢复写操作:在完成查询任务或维护操作后,需要及时关闭只读模式以恢复写操作功能。
综上所述,MySQL服务器的只读模式在保护关键数据、确保数据一致性、提高读取性能以及实现主从复制中的只读服务器等方面发挥着重要作用。然而,在使用时也需要注意其全局影响、权限绕过以及恢复写操作等注意事项。
参考资料
mysql源码
本博客中出现源码在mysql-server-trunk -> storage -> innobase -> srv -> srv0start.cc中
文心一言
MarsCode AI
相关文章:
开源数据库 - mysql - innodb源码阅读 - 线程启动
线程启动源码 /** Start up the InnoDB service threads which are independent of DDL recovery.*/void srv_start_threads() {if (!srv_read_only_mode) {/* Before 8.0, it was master thread that was doing periodicalcheckpoints (every 7s). Since 8.0, it is the log …...
在美团外卖上抢券 Python来实现
在美团外卖上抢券的 Python 实现 在如今的互联网时代,自动化脚本已经成为了许多用户生活中不可或缺的工具。尤其是在购物、抢券等场景中,自动化脚本能够帮助我们节省大量的时间和精力。今天,我们将一起探索如何使用 Python 编写一个简单的脚…...
【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃
引言 在数字化办公的浪潮中,ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案,赢得了全球用户的青睐。随着 8.2 版本的发布,ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF:团队合…...
npm入门教程18:npm发布npm包
一、准备工作 注册npm账号: 前往npm官网注册一个账号。注册过程中需要填写个人信息,并完成邮箱验证。 安装Node.js和npm: 确保你的计算机上已安装Node.js和npm。Node.js的安装包中通常包含了npm。你可以通过运行node -v和npm -v命令来检查它…...
VueSSR详解 VueServerRenderer Nutx
SSR Vue中的SSR(Server-Side Rendering,服务器端渲染)是一种将页面的渲染工作从客户端转移到服务器端的技术。以下是对Vue中SSR的详细解释: 一、SSR的工作原理 在传统的客户端渲染(CSR)中,页面的…...
构建您自己的 RAG 应用程序:使用 Ollama、Python 和 ChromaDB 在本地设置 LLM 的分步指南
在数据隐私至关重要的时代,建立自己的本地语言模型 (LLM) 为公司和个人都提供了至关重要的解决方案。本教程旨在指导您完成使用 Ollama、Python 3 和 ChromaDB 创建自定义聊天机器人的过程,所有这些机器人都托管在您的系统本地。以…...
谷歌浏览器安装axure插件
1.在生成静态原型页面的路径下,找到resources\chrome\axure-chrome-extension.crx,这就是需要的插件了。 2.将axure-chrome-extension.crx重命名成axure-chrome-extension.zip然后解压到指定的文件夹(这个文件夹不能删除, 例如解压到了扩展程…...
Java唯一键实现方案
数据唯一性 1、生成UUID1.1 代码中实现1.2 数据库中实现优点缺点 2、数据库递增主键优点 3、数据库递增序列3.1 创建序列3.2 使用序列优点缺点 在Java项目开发中,对数据的唯一性要求,业务数据入库的时候保持单表只有一条记录,因此对记录中要求…...
opencv - py_imgproc - py_canny Canny边缘检测
文章目录 Canny 边缘检测目标理论OpenCV 中的 Canny 边缘检测其他资源 Canny 边缘检测 目标 在本章中,我们将学习 Canny 边缘检测的概念用于该目的的 OpenCV 函数:cv.Canny() 理论 Canny 边缘检测是一种流行的边缘检测算法。它由 John F. Canny 于1…...
Spring Boot 创建项目详细介绍
上篇文章简单介绍了 Spring Boot(Spring Boot 详细简介!),还没看到的读者,建议看看。 下面,介绍一下如何创建一个 Spring Boot 项目,以及自动生成的目录文件作用。 Maven 构建项目 访问 http…...
70B的模型需要多少张A10的卡可以部署成功,如果使用vLLM
部署一个 70B 的模型(如 defog/sqlcoder-70b-alpha)通常需要考虑多个因素,包括模型的内存需求和你的 GPU 配置。 1. 模型内存需求 大约计算,一个 70B 参数的模型在使用 FP16 精度时大约需要 280 GB 的 GPU 内存。对于 A10 GPU&a…...
clickhouse配置用户角色与权限
首先找到user.xml文件,默认在/etc/clickhouse-server路径下 一、配置角色 找到标签定义 <aaaa><readonly>1</readonly><allow_dll>0</allow_dll> </aaaa>其中aaaa为角色名称,readonly为只读权限(0–代表…...
面试题整理 4
总结整理了某公司面试中值得记录的笔试和问到的问题和答案。 目录 PHP传值和传引用区别?什么情况下用传值?什么情况下用传引用? 传值 传引用 区别 选择传值还是传引用时 简述PHP的垃圾回收机制 二维数组排序 什么是CSRF攻击ÿ…...
React基础大全
文章目录 一、React基本介绍1.虚拟DOM优化1.1 原生JS渲染页面1.2 React渲染页面 2.需要提前掌握的JS知识 二、入门1.React基本使用2.创建DOM的两种方式2.1 使用js创建(一般不用)2.2 使用jsx创建 3.React JSX3.1 JSX常见语法规则3.2 for循环渲染数据 4.模…...
51c大模型~合集10
我自己的原文哦~ https://blog.51cto.com/whaosoft/11547799 #Llama 3.1 美国太平洋时间 7 月 23 日,Meta 公司发布了其最新的 AI 模型 Llama 3.1,这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta 表…...
【已解决】element-plus配置主题色后,sass兼容问题。set-color-mix-level() is...in Dart Sass 3
项目:vue3vite "scripts": {"dev": "vite","build": "vite build","preview": "vite preview"},"dependencies": {"element-plus/icons-vue": "^2.3.1",&quo…...
JavaWeb——Web入门(4/9)-HTTP协议:请求协议(请求行、请求头、请求体、演示 )
目录 请求协议概述 请求行 请求头 请求体 演示 GET POST 请求协议概述 介绍完了 HTTP 协议的概念以及特点之后,接下来介绍 HTTP 当中的请求协议。 请求协议指的就是请求数据的格式。 HTTP 请求协议在整个 Web 通信中起着至关重要的作用。当用户在浏览器…...
软考:数据库考点总结
结构冲突 在数据库领域,冲突主要指的是在并发操作中,多个事务试图同时访问或修改相同的数据资源,导致数据一致性、完整性和隔离性受到威胁。以下是数据库中常见的几种冲突类型: 读写冲突(Read-Write Conflict…...
Flash的语音ic型号有哪些?
深圳唯创知音电子有限公司在语音技术领域具有深厚的积累,其Flash语音IC产品凭借高性能和广泛的应用领域,在市场上占据了一席之地。以下是对该公司Flash语音IC产品的详细介绍: 一、产品概述 Flash语音IC是一种采用Flash存储技术的语音芯片&…...
10天进阶webpack---(1)为什么要有webpack
首先就是我们的代码是运行在浏览器上的,但是我们开发大多都是利用node进行开发的,在浏览器中并没有node提供的那些环境。这就早成了运行和开发上的不同步问题。 -----引言 浏览器模块化的问题: 效率问题:精细的模块划分带来了更…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
