gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述

  • 为了便于数据库系统的复原和逻辑恢复,数据库服务器生成的一致性标志点,称为检查点,其是建立在数据库系统的已知和一致状态时日志中的某个时间点
  • 检查点的目的在于定期将逻辑日志中的重新启动点向前移动
    • 如果存在检查点,数据库只需要完成检查点之后的逻辑日志的恢复即可完成数据库的重启和恢复
    • 如果不存在检查点,则需要重新读取自数据库重启以来的所有逻辑日志才可完成数据库的重启和恢复
    • 数据库服务为为逻辑日志空间的每个范围生成至少一个自动检查点,保证可以开始快速恢复的检查点存在
  • 检查点在infomix9.2版本中增加了fuzzy checkpoint的概念
    • 检查点分为full checkpoint和fuzzy checkpoint两种
    • full checkpoint会把所有的脏页刷新到磁盘
    • fuzzy checkpoint不会刷新所有页
    • 在informix11.5版本中又取消了fuzzy checkpoint
  • 逻辑日志是循环的,数据库保证在每个循环周期内,数据库保证至少做一次checkpoint,当下一个日志包含最后的checkpoint时(代表次周期只做了一次检查点),数据库会做一次检查点操作

2. 检查点的作用

  • 数据从磁盘读取到缓冲池中后被修改后,内存中的数据和缓冲池中的数据会出现差异,检查点会将共享内存缓冲池中的脏页数据全部刷新到磁盘上,使所修改的数据固化到硬盘上
  • 检查点除了刷新数据到磁盘,还起到了有助恢复的作用,数据库down机恢复时,会找到最后一个检查点的位置,然后动态恢复检查点之后的逻辑日志,如果没有检查点,需要恢复所有的逻辑日志,需要的时间会较长

3. 检查点针对的数据

  • checkpoint时,内存中的LRU队列会存在两种数据
    • 一种是从磁盘读出来没有发生更改的数据,FLRU队列
    • 一种是从磁盘读出来后发生了更改的数据,MLRU队列
  • 检查点刷新的数据只针对MLRU队列的数据,即只需要将内存中修改的数据同步到磁盘,而不需要将所有的信息写到磁盘,如果只有一个page脏页,则只同步一个page页到磁盘,其他page不需要
  • 写磁盘的脏页数据虽然同步到了磁盘,但是仍然在内存中存在

4. 检查点的种类

  • 阻塞检查点
    • 改检查点操作时会加上数据库级别的锁,他是一个完全检查点,必须保证事务的一致性
  • 非阻塞检查点
    • 模糊检查点,这些检查点的频率可以通过应用程序进行调整
    • 非阻塞检查点,不需要数据库级别的锁,因此在检查点正在进行时,多个应用程序可以在同一个数据库上异步提交或回滚事务,他是一个不完全检查点不必保证事务的一致性
    • 非阻塞检查点不是说全部过程都不阻塞,其是会存在一段阻塞的过程:检查点执行之前,需要在阻塞状态下等待用户离开critical section,然后将系统恢复需要的逻辑日志、物理日志等刷新,此阶段为阻塞阶段

5. 阻塞的种类

事件

描述

是否阻塞

管理类

1.dbspace的创建、删除和改名

阻塞

2.增加或删除chunk

3.增加或删除一个逻辑日志文件

4.修改物理日志的位置和大小

5.在不记日志的分区上执行shrink(碎片整理)操作

6.打开或关闭镜像

备份

假备份

阻塞

开始归档时

物理恢复结束之后

CDR(数据库同步程序)

第一次启动ER的子系统或者所有参与者被删除之后重启了复制

阻塞

升级转换/升级回退

在检查转换结束和真正的磁盘结构转换开始之前会执行一次checkpoint;如果升级失败,回退成功之后会执行一次checkpoint

阻塞

高可用性

1.增加一个新的RSS或者SDS系节点

1.secondary server被升级为主服务器

根据场景进行区分

HDR

1.服务器的模式发生了变化

2.HDR安装结束之后的第一次传输

3.primary或secondary servers上潜在的物理日志溢出

情景不同,结果不同

恢复点

恢复开始和结束之后都会执行checkpoint,当设置了CONVERSION_GUARD,并且指定了RESTORE_POINT_DIR配置参数时,恢复点才会生效

阻塞

Pload

以快速模式启动Pload(HPL)

阻塞

恢复

快速恢复开始时

阻塞

重组

在线创建索引

碎片整理

阻塞

用户操作

用户执行checkpoint

阻塞(除外部备份期间)

事件

描述

是否阻塞

CKPTINTVL

当CKPTINTVL间隔时间到了之后,数据库会检查是否需要做checkpoint,满足下列条件,需要做:

  • 当MLRU队列中的缓冲页达到了BUFFERPOOL中定义的lru_max_dirty参数后
  • 清页线索过于繁忙。即一个用户需要获得一个可用的缓冲页,但是所有的缓冲页的指针都在MLRU内

不阻塞

LongTX

长事务:发现长事务,且事务没有停止,会执行一个checkpoint来停止这个长事务

回滚过程中,如果长事务被终止,当长事务仍然没有回滚结束,此时执行一个checkpoint

不阻塞

Llog

逻辑日志用完

不阻塞

Misc

因IO错误导致dbspace或chunk处于PD状态

不阻塞

物理日志

物理日志所处条件:

1.物理日志写到75%

2.物理日志加上脏页的容量大于物理日志总空间的90%

不阻塞

RTO

定义最长的数据恢复时间,正常操作系统崩溃,重启的时间不会超过TRO_SERVER_RESTART配置的时间

不阻塞

stamp wrap

如果新的检查点时间戳在最后一个检查点之前,会触发另外一个检查点

不阻塞

startup

数据库穷的那个

不阻塞

解压

在不及日志的表或者数据库上执行解压操作

不阻塞

6. 检查点的场景

  • 阻塞检查点:数据库空间添加到服务器或执行数据库备份时,检查点将出现
  • 非阻塞检查点:资源限制发生时,如逻辑日志空间的每个范围需要检查点来保证日志具有快速开始恢复的检查点;如数据库服务器将在物理日志达到总大小的75%时触发检查点,以避免物理日志移除,这种检查点不会阻塞事务
    • 如果检查点期间,资源将要耗尽,则会为了保证有足够的资源保证检查点的完成,则会阻塞其他事务
    • 如果事务被阻塞,则服务器会更频繁的触发检查点,以避免检查点处理期间的事务阻塞
    • 自动检查点引起数据库更频繁的触发检查点,以避免事务阻塞,自动检查点尝试监视系统活动和资源使用情况(物理和逻辑日志使用情况以及缓冲池脏的程度),以能够及时触发检查点,这样检查点的处理就可在物理日志或逻辑日志耗尽前完成、3

7. 检查点的参数

  • auto_ckpts:配置参数设置启动时启用或禁用自动检查点
  • RTO_SERVER_RESTART:配置参数可指定快速恢复需要的时间
    • 配置此参数将忽略参数CKPTINTVL
    • 此参数配置后,数据库服务器将会监视物理日志和逻辑日志使用情况,以估计快速恢复的持续时间。如果服务器估计快速恢复将超出RTO_SERVER_RESTART时间,将会触发检查点
    • RTO_SERVER_RESTART指定的是目标时间量,不能是保证的时间量

8. 检查点的执行过程

  • 第一步:检查点执行开始时关于用户线索的要求:
    • 检查点发生时,会检查所有数据库线索的状态,而此时数据库线索(用户执行sql的进程)的状态可以分为三种:将要执行、执行中和执行结束
    • 针对执行中的线索,根据其执行过程的节点位置将会划分出检查点执行的两种行为,而针对线索的某部分节点我们称之为关键部分代码,根据线索是否进入到关键部分代码,检查点的两种行为如下:
      • 线索还没有进入关键代码部分的执行,此时检查点可以阻塞线程的后续执行
      • 如果线索执行节点进入了关键部分代码,则检查点需要等待线索执行完成后再进行检查点
    • 关键部分代码的描述
      • 关键部分的代码主要是做磁盘的更新,为了保证数据物理的一致性,所以针对这部分要么全部完成,要么全部不完成
      • 关键部分的线索会持有完成数据修改所需要的共享内存资源,而针对这部分资源,做checkpoint操作时,必须获得这部分共享内存资源,所以检查点执行时要求关键部分代码中没有用户线索在执行
    • checkpoint会等待所有进入关键部分代码的用户线索执行完毕释放资源会,才会继续执行,将缓冲池的数据同步到磁盘
  • 第二步:将物理日志缓冲刷新到物理日志文件
    • 当没有用户线索处于关键部分代码中,检查点将继续执行
    • 清页线索会把物理日志缓冲中的信息刷新到物理日志文件中

  • 第三步:将缓冲池中的所有脏页写入到磁盘,这一步被称之为chunk write,仅需要刷新脏页,不需要刷新所有页
  • 第四步:将检查点的信息写入到几个关键文件中
    • 清页线索会在逻辑日志中写一个checkpoint记录,他提供了一个系统失败之后的一个恢复点
    • 清页线索还会在rootdbs的保留页中(page_1CKPT和page_2CKPT)进行更新状态
    • 将checkpoint完成的记录写到消息日志文件中

  • 第五步:将逻辑日志缓冲区的内容刷新到逻辑日志文件中
  • 第六步:逻辑上将物理日志文件清空
    • 物理日志主要是数据库异常崩溃恢复时,可以在此基础上进行恢复,防止块断裂问题,所以检查点完成后,之前的物理日志已经失效了
    • 对于已经失效的物理日志,gbase8s采用的是逻辑删除:即checkpoint记录写到消息日志文件后,物理日志上的文件不会被移走(移动删除开销较大)。而是以在物理日志后面的地址作为新一轮物理日志的写入的开始地址,继续往后写,而物理日志使用完毕后,将会从物理日志文件开头进行覆盖写
    • 可以把物理日志文件看成循环文件,没有起始点,没有结束点,每次checkpoint,物理日志的起始点都在变化

9. 非阻塞检查点的特殊说明

  • 检查点分为阻塞检查点和非阻塞检查点,非阻塞检查点并不是完全不阻塞,其也会出现一部分阻塞时间,只是时间相比较会非常短暂
  • 步骤如下:
    • 检查点开始执行时,会阻塞新的线索进入到关键代码区域,等待进入到关键部分代码的线索离开
    • 将缓存中的系统目录表信息写入到磁盘中
    • 将物理、逻辑日志缓冲区刷新到日志文件中
    • 将检查点写入到逻辑日志和消息日志文件中
    • 完成上述步骤后,将不再阻塞新的线索进入到关键代码部分
    • 将缓冲区中的脏页写入到磁盘中
    • 结束检查点操作,在保留页中更新检查点记录,检查点完成
  • 从上可知非阻塞检查点将会存在一段阻塞时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML DOM 对象

HTML DOM 对象 1. 概述 HTML DOM(文档对象模型)是一个跨平台和语言独立的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。在HTML DOM中,文档被表示为节点树,其中每个节点代表文档中的一个部分,例如元素、文本或属性。HTML DOM对象是构成这个节点树的基…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx(最小)配置详解 六、Nginx(基础)配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

【源码】综合股票币币合约交易所源码/etf交易所源码/美股港股台股交易所源码

支持多国语言 全开源可二开的一个版本!支持虚拟货币 ETF 外汇 美股 A股 港股 台股。 前端是VUE开发(带vue工程源码)后端JAVA开发!搭建也相对简单。 总的来说功能非常强大,适合线上运营的一个版本,有兴趣的可…

(53)MOS管专题--->(08)MOS管N沟道MOS管

(08)MOS管N沟道MOS管 1 目录 (a)IC简介 (b)数字IC设计流程 (c)Verilog简介 (d)MOS管N沟道MOS管 (e)结束 1 IC简介 (a)在IC设计中,设计师使用电路设计工具(如EDA软件)来设计和模拟各种电路,例如逻辑电路、模拟电路、数字信号处理电路等。然后,根据设…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说,第一部分侧重于定义什么是因果推理,哪些偏差会阻止相关性成为因果关系&…

支付数据安全

支付数据安全是确保支付系统和用户信息安全的关键环节,以下是一些可以采取的措施来增强支付数据的安全性: 数据加密:使用强加密算法来保护存储和传输中的支付数据,确保即使数据被截获也无法被未授权者读取[26]。 使用安全的通信协…

自定义防抖注解

问题场景 在开发中由于可能存在的网络波动问题导致用户重复提交,所以自定义一个防抖注解。设计思路:自定义注解加在接口的方法上,注解中设置了SPEL表达式,可以通过SPEL表达式从接口参数中提取Redis的Key,以这个Key作为…

空气的物性解释

什么是空气?什么是常态空气?空气就是我们生活在其中的大气。常态空气是一个规定的值(不同国家有所不同):压力0.1MPa(或者说是1个标准大气压)、温度20℃、相对湿度为36%状态下称之为常态空气。常…

Techo TVP技术 沙龙

Techo TVP技术 沙龙 今天参加了 在上海 徐汇 腾讯云大厦 举办的 Techo TVP 技术沙龙(主要介绍 AI agent 让我感受很深) ,那什么是 AI Agent呢? 是一个智能体,由大语言模型驱动,具有自主理解、感知、规划、…

MISSING COURSE-shell

shell 01 what is the shell q: linux如何操作计算机硬件cpu 内存 磁盘 显示器等 a:使用linux的内核操作 1.shell -is命令 shell通过编写shell命令 发送给linux内核 去执行 操作就是计算机硬件 so shell 是用户操作计算机 类似于windows里的dos命令 shell是一门程序设计语言…

《分析模式》漫谈03- Unified Method并不是RUP

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 在《分析模式》第2章 ,Fowler提到了“Rational Softwares Unified Method”, 而且给出了引用的参考文献,是Rational公司的一份文档: 200…

数字电路中二进制的数据表达

文章目录 1. 二进制数据表达 1.1 二进制简介 1.2 用二进制表达文字 1.2.1 最开始的表达方式 1.2.2 通讯系统的编码和解码 1.2.3 集成电路 1.2.4 ASCII编码 1.2.5 GBK编码 1.2.6 Unicode编码 2. 用二进制表达图像 2.1 图片像素化 2.2 像素数字化 2.3 二值图像 2.4…

Git冲突解决指南:如何优雅地解决代码合并冲突

在团队协作开发中,使用版本控制系统Git是非常常见的。然而,在多人同时对同一文件进行修改时,就可能出现代码合并冲突。这时就需要我们学会如何优雅地解决这些冲突,保证代码的完整性和质量。本文将为您介绍Git冲突解决的基本原则和…

string类的使用手册

1.构造函数 补充:npos:size_t类型数据的最大值 default (1) string(); 构造空的string类对象 copy (2) string (const string& str); 拷贝构造函数(深拷贝) substring (3) string (const string& str, size_t pos, size_…

在 dingo api 路由中使用 middleware

在使用dingo api路由中使用middleware api.throttle 节流中间件遇到的问题 $api->group([middleware > [auth:api]],function ($api) {$api->get(getUserInfo, [middleware > [api.throttle],limit > 1,expires > 1], App\Http\Controllers\Users\UserContr…

HTML 颜色名:网页设计的调色板

HTML 颜色名:网页设计的调色板 在网页设计和开发中,颜色是一个关键元素,它不仅影响视觉效果,还能传达情感和品牌信息。HTML 颜色名是用于在 HTML 和 CSS 代码中指定颜色的预定义名称。这些颜色名易于记忆,方便设计师和开发者快速选择和应用颜色。本文将详细介绍 HTML 颜色…

自动化测试火狐下载文件

本篇文章介绍selenium中火狐浏览器如何下载文件。比如我想把这个MP4的视频文件下载下来。 点击之后查看下载的类型是video/mp4 指定使用火狐浏览器 profile webdriver.FirefoxOptions() # 设置firefox默认的下载路径,0表示桌面,1表示我的下载&#xf…

linux shell-awk样例

需求: 从 hive-server2.log 中截取所有当天日志,并统计其时间的平均值和时长最长的时间 hive-server2.log 2024-05-01 12:00:00 INFO [HiveServer2] Starting query execution 2024-05-01 12:00:01 INFO [HiveServer2] Query executed successfully i…

20. 第20章 调试

20. 调试 调试程序时, 应当区分不同类型的错误, 以便更快地查找出错误的原因.* 语法错误(semantic error): 在将源代码翻译成字节码的过程中有解释器发现.它们通常表示有程序结构错误.例如, 在def语句的末尾漏掉冒号, 会产生一个有些冗余的错误信息SyntaxErroe: invalid synta…

Qt自定义日志输出

Qt自定义日志输出 简略版&#xff1a; #include <QApplication> #include <QDebug> #include <QDateTime> #include <QFileInfo> // 将日志类型转换为字符串 QString typeToString(QtMsgType type) {switch (type) {case QtDebugMsg: return "D…