当前位置: 首页 > news >正文

开源数据库 - 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 线程的主要职责包括:

  1. 收集统计信息:定期扫描数据字典中的对象,收集关于表大小、索引使用情况、列数据分布等统计信息。
  2. 更新统计信息:根据收集到的数据,更新数据字典中的统计信息表。
  3. 监控数据变化:持续监控数据库中的数据变化,以便在数据发生变化时及时更新统计信息。

通过这些操作,m_dict_stats 线程确保查询优化器能够基于最新的统计信息做出最优的查询计划决策,从而提高数据库的整体性能。

在 InnoDB 中,统计信息的收集和更新是一个后台任务,它会在数据库运行期间持续进行,以保证统计信息的准确性和实时性。

FTS 子系统(FTS sub-system)全称为 Full-Text Search 子系统,它是 InnoDB 存储引擎中的一个组件,用于支持全文搜索功能。全文搜索是一种能够在文本数据中搜索特定关键词或短语的技术,它允许用户在大量文本数据中快速找到所需的信息。

在 InnoDB 中,FTS 子系统通过创建和维护一个特殊的索引来实现全文搜索。这个索引包含了文档中所有单词的信息,以及它们在文档中的位置。当用户执行全文搜索查询时,FTS 子系统会使用这个索引来快速定位包含查询关键词的文档,并返回搜索结果。

FTS 子系统的主要功能包括:

  1. 索引管理:创建、更新和删除全文索引。
  2. 查询处理:解析和执行全文搜索查询。
  3. 结果排序:根据相关性对搜索结果进行排序。
  4. 性能优化:通过缓存和其他技术提高搜索性能。

在 InnoDB 中,FTS 子系统的实现基于 MyISAM 存储引擎的全文搜索功能,但它在 InnoDB 中进行了优化和改进,以提供更好的性能和可靠性。

在当前的代码片段中,srv_start_threads() 函数正在启动 InnoDB 服务线程,其中包括创建一个优化 FTS 子系统的线程。这个线程的主要职责是监控和优化 FTS 索引的性能,确保全文搜索功能能够高效运行。

扩展

只读模式

MySQL服务器的只读模式是一个重要的功能,它在多个方面发挥着关键作用。以下是对MySQL服务器只读模式作用的详细阐述:

一、保护关键数据

只读模式的核心作用是保护数据库中的关键数据不被意外修改或删除。在只读模式下,用户只能执行查询操作(如SELECT),而无法进行插入(INSERT)、更新(UPDATE)或删除(DELETE)等写操作。这有助于防止因误操作或恶意攻击而导致的数据损坏或丢失。

二、确保数据一致性

在数据库维护、备份或迁移等过程中,确保数据一致性至关重要。通过将数据库设置为只读模式,可以防止在这些操作期间对数据进行修改,从而确保数据的一致性和完整性。这对于维护数据库的可靠性和稳定性具有重要意义。

三、提高读取性能

在只读模式下,由于不允许进行写操作,因此可以减少锁的竞争,从而提高读取性能。这对于需要频繁读取数据的应用场景来说是一个显著的优势。然而,也需要注意到,在只读模式下,一些写入相关的缓存和日志功能可能会被关闭,这可能会对某些性能产生一定影响,但通常这种影响较小。

四、实现主从复制中的只读服务器

在MySQL的主从复制架构中,只读模式可以用于实现只读服务器。通过将从服务器设置为只读模式,可以确保它只用于查询操作,而不会干扰主服务器的写操作。这有助于实现读写分离,提高系统的可扩展性和性能。

五、应用场景

  1. 数据库备份:在进行数据库备份时,为了防止备份过程中数据被修改,可以将数据库设置为只读模式。
  2. 维护期间的数据保护:在数据库维护期间,如升级、修复或优化等操作时,可以通过设置只读模式来限制对数据库的写操作,确保数据的一致性。
  3. 只读分析场景:在需要进行大量数据分析的场景下,可以通过设置只读模式来限制对数据库的写操作,从而提高读取性能并保护数据不被修改。

六、注意事项

  1. 全局影响:只读模式是全局的,会影响整个数据库实例。因此,在设置只读模式前,需要评估其对业务的影响,并通知相关团队。
  2. 权限绕过:具有SUPER权限的用户可以绕过只读模式的限制进行写操作。因此,在设置只读模式时,需要考虑权限管理问题。
  3. 恢复写操作:在完成查询任务或维护操作后,需要及时关闭只读模式以恢复写操作功能。

综上所述,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文件&#xff0c;默认在/etc/clickhouse-server路径下 一、配置角色 找到标签定义 <aaaa><readonly>1</readonly><allow_dll>0</allow_dll> </aaaa>其中aaaa为角色名称&#xff0c;readonly为只读权限&#xff08;0–代表…...

面试题整理 4

总结整理了某公司面试中值得记录的笔试和问到的问题和答案。 目录 PHP传值和传引用区别&#xff1f;什么情况下用传值&#xff1f;什么情况下用传引用&#xff1f; 传值 传引用 区别 选择传值还是传引用时 简述PHP的垃圾回收机制 二维数组排序 什么是CSRF攻击&#xff…...

React基础大全

文章目录 一、React基本介绍1.虚拟DOM优化1.1 原生JS渲染页面1.2 React渲染页面 2.需要提前掌握的JS知识 二、入门1.React基本使用2.创建DOM的两种方式2.1 使用js创建&#xff08;一般不用&#xff09;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 日&#xff0c;Meta 公司发布了其最新的 AI 模型 Llama 3.1&#xff0c;这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta 表…...

【已解决】element-plus配置主题色后,sass兼容问题。set-color-mix-level() is...in Dart Sass 3

项目&#xff1a;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 协议的概念以及特点之后&#xff0c;接下来介绍 HTTP 当中的请求协议。 请求协议指的就是请求数据的格式。 HTTP 请求协议在整个 Web 通信中起着至关重要的作用。当用户在浏览器…...

软考:数据库考点总结

结构冲突 在数据库领域&#xff0c;冲突主要指的是在并发操作中&#xff0c;多个事务试图同时访问或修改相同的数据资源&#xff0c;导致数据一致性、完整性和隔离性受到威胁。以下是数据库中常见的几种冲突类型&#xff1a; 读写冲突&#xff08;Read-Write Conflict&#xf…...

Flash的语音ic型号有哪些?

深圳唯创知音电子有限公司在语音技术领域具有深厚的积累&#xff0c;其Flash语音IC产品凭借高性能和广泛的应用领域&#xff0c;在市场上占据了一席之地。以下是对该公司Flash语音IC产品的详细介绍&#xff1a; 一、产品概述 Flash语音IC是一种采用Flash存储技术的语音芯片&…...

10天进阶webpack---(1)为什么要有webpack

首先就是我们的代码是运行在浏览器上的&#xff0c;但是我们开发大多都是利用node进行开发的&#xff0c;在浏览器中并没有node提供的那些环境。这就早成了运行和开发上的不同步问题。 -----引言 浏览器模块化的问题&#xff1a; 效率问题&#xff1a;精细的模块划分带来了更…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...