自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(133)
  • 资源 (1)
  • 收藏
  • 关注

原创 海山数据库(He3DB)查询解析模块解析(一):词法分析scan.l解析

本文介绍了词法分析的基本原理,海山数据库使用的lex词法分析工具,并对scan.l文件进行了解析,在后文中将进一步解析词法分析,并梳理sql命令是如何经过词法和语法分析转化为一颗分析树。

2025-01-22 14:47:04 662

原创 海山数据库(He3DB)查询解析模块分析(二):语法分析gram.y解析

定义段可分为代码段和声明部分,代码段由%{和%}%{/**/do { \else \%}%pure-parser //纯解析器,不依赖于全局变量或静态变量,而是通过参数传递和返回值来管理状态%expect 0 //希望冲突数量为0%name-prefix="base_yy" //代表生成的函数和变量前缀从yy变成base_yy%locations声明段中的union来声明所有表示符号的可能c类型,将标识符和C语言中定义的类型对应起来。

2025-01-22 14:45:31 640

原创 大云海山数据库(He3DB)源码详解:He3DB-SimpleLruReadPage_ReadOnly

本文基于大云He3DB,针对SimpleLruReadPage_ReadOnly进行源码解读分享。这个函数的主要逻辑是:尝试在共享锁下快速查找页面。如果找到页面,更新统计信息并返回槽位编号。如果未找到页面,切换到独占锁并调用常规读取函数。通过这种方式,函数尽量减少锁的冲突,提高读取效率。

2025-01-22 14:43:05 866

原创 大云海山数据库(He3DB)源码详解:He3DB-SimpleLruReadPage

本文基于大云He3DB,针对SimpleLruReadPage进行源码解读分享。函数名作用SimpleLruReadPage 函数的作用是从 SLRU 缓冲区中读取一个页面。它通过以下步骤实现:检查页面是否已在内存中。如果页面正在被读取或写入,等待 I/O 完成。如果页面不在内存中,选择一个空闲槽位。从磁盘读取页面数据到槽位。更新页面状态并返回槽号。

2025-01-22 14:42:01 974

原创 大云海山数据库(He3DB)源码详解:He3DB-MultiXactIdCreateFromMembers

本文基于大云He3DB,针对MultiXactIdCreateFromMembers 进行源码解读分享。MultiXactIdCreateFromMembers 函数的主要逻辑如下:检查本地缓存中是否已经存在相同的成员集合,避免重复创建。验证成员中是否只有一个更新事务,确保多事务的合法性。分配新的 MultiXactId 和偏移量。创建 XLOG 记录,描述新创建的多事务。将多事务信息写入 OFFSET 和 MEMBER 日志文件。

2025-01-22 14:40:34 956

原创 海山数据库(He3DB)源码详解:ResourceOwnerData及ResourceArray结构体解析

本文介绍了事务执行过程中,检查一个堆元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

2025-01-22 14:39:14 670

原创 海山数据库(He3DB)源码详解:RecordTransactionCommit 函数解读

是 PostgreSQL 中用于记录事务提交的关键函数。它负责在事务结束时执行一系列操作,包括日志记录、清理资源、更新事务状态等。这个函数是 PostgreSQL 事务提交机制的核心部分,确保事务的原子性和持久性。

2025-01-22 14:38:16 1044

原创 海山数据库(He3DB)源码详解:MemoryContextData及MemoryContextMethods结构体解析

内存上下文是 PostgreSQL 的内存管理机制,用于高效地分配和释放内存,支持嵌套内存上下文,并允许在事务或函数结束时批量释放内存。等)都有自己的实现方式,这些函数指针提供了一种统一的接口,允许通过多态的方式操作不同的内存上下文。这种设计使得 PostgreSQL 的内存管理机制既灵活又高效,能够适应多种内存分配策略和应用场景。这种设计使得 PostgreSQL 的内存管理机制既灵活又高效,能够适应复杂的内存分配和释放需求。是 PostgreSQL 中定义的一组函数指针,用于实现内存上下文(

2025-01-22 14:37:13 1045

原创 海山数据库(He3DB)源码详解:海山Mysql 自动测试框架MTR

在修改内核代码后,不仅需要测试新增功能,同时也要对原有功能做回归测试,以保证新加代码对原有功能没有影响,这就需要用到MySQL源码自带的测试框架,简称MTR。主要应用于MySQL等相关数据库项目开发测试,对单个功能点或者模块进行正确性和功能性测试,该工具在SQL级别对MySQL进行单元测试。不仅仅能测试SQL语句,也能根据实际需要测试不同启动参数配置的MySQL服务器和客户端从而验证指定的功能逻辑。

2025-01-22 10:10:52 590

原创 海山数据库(He3DB)源码详解:海山PG 表和元组的组织方式(2)

访问Page时会先将它加载到内存,所以Page可以仅用一个char *类型的指针来表示,指向内存中该Page的起始位置。由于Page的大小是已知的,通过Page指针和Page的大小即可表示并访问一个Page。在构建一个Page时,会调用PageInit函数进行初始化。

2025-01-21 16:04:33 498

原创 海山数据库(He3DB)源码详解:海山PG 表和元组的组织方式(1)

PostgreSQL是一种开源的关系型数据库管理系统,具有强大的功能和可靠性。在PostgreSQL数据库中,表和元组是数据组织的基础单元。其中,表是PG数据库中存储数据的逻辑结构,由多个列(Column)和行(Row)组成。列代表了数据字段,而行则代表了一条条的数据记录。每个表都有其独特的属性,如主键()、外键()、索引(Index)等。主键用于唯一标识表中的一条记录,外键用于建立表与表之间的关联,索引则用于提高查询效率。在PostgreSQL中,元组通常指的是表中的一行数据,即一条记录。

2025-01-21 15:13:31 715

原创 海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesUpdate函数

本文介绍了事务执行过程中,检查一个Update元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

2024-12-28 15:50:10 751

原创 海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesToast函数

本文介绍了事务执行过程中,检查一个Toast元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

2024-12-28 15:44:31 859

原创 海山数据库(He3DB)源码解读:T_GrantStmt原理浅析

(一)  GrantStmt 是一个表示 GRANT 或 REVOKE 语句的结构体。该结构体用于存储和处理对数据库对象权限的授予或撤销信息。。用于标识该节点的类型,通常在抽象语法树(AST)中用于区分不同节点的类型。布尔值,指示该操作是 GRANT(true)还是 REVOKE(false)。表示授权目标的类型,通常可能是角色、数据库、表等。该类型可能是枚举类型,具体定义在某个头文件中。表示被操作对象的类型,比如表、视图、序列等,这通常是一个枚举类型。

2024-12-28 15:43:58 767

原创 海山数据库(He3DB)源码解读:T_DropRoleSetStmt原理浅析

(一)  DropRoleStmt 是一个结构体,定义在 He3DB中,用于表示删除角色的 SQL 命令。*/这是一个枚举类型,表示节点类型。NodeTag 通常用于区分不同的 SQL 语句类型或查询树中的不同节点类型。对于 DropRoleStmt,这个字段通常会被设置为 T_DropRoleStmt,表示这是一个删除角色的语句。这是一个链表(List),包含了要删除的角色的名称列表。每个角色名称通常是一个字符串(char *),表示要删除的角色。

2024-12-28 15:42:58 744

原创 海山数据库(He3DB)源码解读:T_AlterRoleSetStmt原理浅析

(一)  AlterRoleSetStmt 是一个用于表示“ALTER ROLE … SET”语句的语法树节点的结构体。这种结构体通常在 He3DB 的解析和执行过程中使用,以处理 ALTER ROLE 命令。/* role */用于标识节点的类型。这是一个通用字段,能帮助 PostgreSQL 识别语法树中的各种节点类型。指向一个 RoleSpec 结构,该结构包含了要修改的角色的信息。RoleSpec 通常包含角色名和角色的其他细节(如是否是一个用户或组角色)。

2024-12-28 15:42:43 800

原创 大云海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesSelf函数

本文介绍了事务执行过程中,检查一个堆元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

2024-12-28 15:41:03 614

原创 大云海山数据库(He3DB)源码详解:He3DB-SubTrans日志管理器函数之SubTransSetParent

本文基于大云He3DB,针对SubTrans日志管理模块进行源码解读分享。函数名作用在子事务日志中记录父事务id。

2024-12-28 15:40:13 769

原创 大云海山数据库(He3DB)源码详解:He3DB-SubTrans日志管理器函数之SubTransGetParent、SubTransGetTopmostTransaction

函数名作用获取目标事务的父事务id获取给定TransactionId的顶层事务ID。

2024-12-28 15:39:13 593

原创 大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdGetStatus

函数名作用实现CLOG日志的读操作。

2024-12-28 15:38:39 524

原创 海山数据库(He3DB)源码详解:海山Mysql 崩溃恢复(3)-日志应用

为崩溃恢复的入口函数,其从调用,传入参数读取存在系统表空间的获得的,该函数在日志解析、日志应用等线程创建之前,进行崩溃恢复操作。MySQLredo日志崩溃恢复整体流程如图所示,其中,日志应用的流程主要集中在右边部分,用于解析或应用日志记录体,用于恢复页面函数,这是应用日志记录到数据库页面的关键步骤。图中还显示了日志解析和日志应用流程之间的交互,特别是在解析日志记录后,如何将它们应用到数据库页面以完成恢复过程。本文将针对日志应用过程中涉及到的几个函数源码进行详细解析。

2024-12-19 13:33:12 755

原创 海山数据库(He3DB)源码详解:海山Mysql 崩溃恢复(2)-日志解析

MySQL redo日志崩溃恢复整体流程如图所示,本文将针对日志解析过程中涉及到的几个函数源码进行详细解析。

2024-12-19 10:36:40 993

原创 海山数据库(He3DB)源码详解:海山Mysql 崩溃恢复(1)-准备及结束

选取最近发生的那次checkpoint的信息。衡量checkpoint发生时间早晚的信息就是所谓的,只要把和这两个block中的值读出来比一下大小,哪个的值更大,说明哪个block存储的就是最近的一次checkpoint信息。这样就能拿到最近发生的checkpoint对应的值以及它在redo日志文件组中的偏移量。为什么要把checkpoint信息存储到2个block中?万一就在某次写checkpoint信息的过程中MySQL崩溃了,有可能导致正在写入的这个block中的checkpoint信息不正确。

2024-12-17 18:51:40 1008

原创 standard_ProcessUtility()函数中CheckPoint语句执行过程

在 PostgreSQL 中,标签与执行检查点(checkpoint)操作相关。CHECKPOINT命令会强制数据库进行一次检查点操作,这个操作会更新所有数据文件,以确保事务日志中的信息被刷新到磁盘上,保证数据的持久性。

2024-11-27 17:53:42 641

原创 海山数据库(He3DB)源码详解:主备复制SyncRepWaitForLSN

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-11-22 17:12:20 770

原创 海山数据库(He3DB)源码解读:T_GrantRoleStmt原理浅析

(一)  GrantRoleStmt 是一个结构体,用于在 PostgreSQL 中表示授予或撤销角色的语句。类型: NodeTag解释: NodeTag 是一个枚举类型,表示不同类型的节点。在这里,type 用于标识这是一个 GrantRoleStmt 节点。通常,type 的值为 T_GrantRoleStmt。类型: List *解释: 这是一个链表(List),包含了将被授予或撤销的角色列表。每个元素是一个角色名称或角色标识符。这个变量指定了要操作的角色。

2024-11-22 17:11:51 641

原创 海山数据库(He3DB)源码解读:T_CreateRoleStmt原理浅析

(一)  CreateRoleStmt 是 He3DB 中用于表示创建角色 (CREATE ROLE) 语句的结构体。它包含了与角色创建相关的各种信息,包括角色类型、角色名称和角色选项。NodeTag type 这个成员用于标识结构体的类型。在 He3DB 的抽象语法树 (AST) 中,每个节点都有一个类型标识符(NodeTag),用于区分不同类型的节点。CreateRoleStmt 会被标记为其特定的类型,以便在AST中进行正确的处理。ROLESTMT_ROLE,//表示一般的角色声明。

2024-11-22 17:10:33 959

原创 海山数据库(He3DB)源码解读:T_AlterRoleStmt原理浅析

(一)  AlterRoleStmt 是一个用于定义 He3DB 中 ALTER ROLE 命令语法的数据结构。它是一个结构体,包含了执行 ALTER ROLE 操作所需的所有信息。/* role */NodeTag type: 这是一个枚举类型,用于标识该结构体是哪种节点类型。NodeTag 通常用于区分不同的 SQL 语句类型。RoleSpec *role: 这是一个指向 RoleSpec 结构体的指针,表示要修改的角色。RoleSpec 结构体可能包含角色的名称或其他标识信息。

2024-11-22 17:08:46 1013

原创 海山数据库(He3DB)源码详解:子事务块内核函数执行过程

本文介绍了子事务执行过程中,从SAVEPOINT定义子事务开始到子事务结束释放RELEASE或者回滚ROLLBACK To的内核函数执行过程。

2024-11-22 17:07:46 1000

原创 海山数据库(He3DB)源码详解:主备复制read_backup_label

在数据库主备复制(如PostgreSQL的流复制等场景)中,时间点恢复是一种数据库恢复技术,它允许将数据库恢复到指定的历史时间点。周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-11-22 17:05:26 753

原创 海山数据库(He3DB)源码详解:主备复制pg_wal_replay_resume

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-11-22 17:05:00 699

原创 大云海山数据库(He3DB)源码详解:主备复制-流复制

在数据库中,是一种数据库复制技术,它允许一主多从的数据库集簇实现实时数据复制和同步。周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-11-22 17:03:32 536

原创 大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之WriteZeroPageXlogRec、CheckPointCLOG

函数作用创建一个新CLOG日志页面时,调用该函数创建一条ZEROPAGE的XLOG日志记录,以记录所创建CLOG日志页面的页面号,方便系统崩溃或恢复过程中重建CLOG日志。

2024-11-22 17:02:31 481

原创 海山数据库(He3DB)源码详解:事务块执行过程及内核函数

事务SQL语句的执行过程,会先通过事务块函数修改事务块状态,然后根据事务块状态执行不同的事务行为。因此,本章会讲解事务块的开始和结束过程的事务块函数。

2024-11-22 17:01:39 551

原创 海山数据库(He3DB)源码详解:两阶段提交(2PC)事务块内核函数执行过程

两阶段提交(2PC)是一种用于分布式系统的事务处理协议,旨在确保事务的原子性。以下是2PC从事务准备到提交或放弃的执行流程图:开始:事务发起者(协调者)开始一个新的分布式事务。事务发起者请求所有参与者准备:协调者向所有参与者发送准备请求,询问它们是否准备好提交事务。所有参与者是否准备好?:这是一个决策点,需要等待所有参与者的响应。是:如果所有参与者都准备好了,协调者将发送提交请求。否:如果任何一个参与者没有准备好,协调者将发送放弃请求。事务发起者发送提交请求。

2024-11-22 17:00:18 639

原创 海山数据库(He3DB)源码详解:海山MySQL redo日志-写入过程

设计InnoDB时为了更好的进行系统奔溃恢复,将通过mtr生成的redo日志放在大小为512字节的页中。为了和表空间中的页做区别,于是把用来存储redo日志的页称为block。一个的示意图如下:真正的redo日志都是存储到占用496字节大小的中。另外,占12个字节,占4个字节,存储的是一些管理信息。其中,

2024-11-19 13:47:37 1047

原创 海山数据库(He3DB)源码详解:海山MySQL redo日志-日志文件组

MySQL的数据目录下默认有两个名为和的文件,log buffer中的日志默认情况下就是刷新到这两个磁盘文件中。redo从上边的描述中可以看到,磁盘上的redo日志文件不只一个,而是以一个日志文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2…)的形式进行命名。在将redo日志写入日志文件组时,是从ib_logfile0开始写,如果ib_logfile0写满了,就接着ib_logfile1写,同理,ib_logfile1写满了就去写ib_logfile2,依此类推。

2024-11-19 13:38:40 1002

原创 海山数据库(He3DB)源码详解:海山MySQL redo日志-MTR

如果作为内节点的页a的剩余空闲空间也不足以容纳增加一条目录项记录,那需要继续做内节点页a的分裂操作,也就意味着会修改更多的页面,从而产生更多的redo日志。一个事务可以包含若干条语句,每一条语句其实是由若干个mtr组成,每一个mtr又可以包含若干条redo日志。写入重做日志缓冲区。它根据事务日志的模式(m_log_mode)来决定如何处理日志写入。遍历redo日志缓冲区中的每个块,并准备将它们写入到日志文件中。函数为日志写入预留空间,并获取起始日志序列号。函数完成日志写入,并获取结束日志序列号。

2024-11-19 11:33:58 1050

原创 海山数据库(He3DB)源码详解:主备复制stop过程

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-10-21 14:37:31 642 2

原创 海山数据库(He3DB)源码详解:主备复制start过程

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

2024-10-21 14:35:26 660

google F1 paper

Google 最新分布式数据库介绍,用于支持Google的广告系统,可以做到全球数据同步,数据一致性。

2015-10-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除