当前位置: 首页 > 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;精细的模块划分带来了更…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...