开源数据库 - 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提供的那些环境。这就早成了运行和开发上的不同步问题。 -----引言 浏览器模块化的问题: 效率问题:精细的模块划分带来了更…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...