一、体系结构概况
1.1 线程管理
YashanDB采用多线程架构,线程分为两类:
• 工作线程(Worker Threads):每个客户端连接到数据库实例时,会创建一个工作线程。工作线程负责处理客户端的SQL请求,执行SQL语句,并将结果返回给客户端。工作线程是数据库与客户端交互的核心。
• 后台线程(Background Threads):由数据库实例自动创建,用于执行系统级任务,例如:
• TCP监听线程(TCP_LSNR):监听指定的TCP端口,处理客户端的连接请求并创建会话。
• 数据脏块刷新线程(DBWR):将内存中的脏数据块写回到磁盘上的数据文件。
• Redo日志刷盘线程(LOGW):将内存中的Redo日志刷盘到Redo日志文件。
• 检查点任务调度线程(CKPT):调度全量和增量检查点任务。
1.2 物理存储
物理存储是YashanDB存储数据的物理文件集合,主要包括以下几类文件:
• 控制文件(Control Files):记录数据库的物理结构信息,如数据文件的位置、日志文件的位置等。控制文件是数据库启动和恢复的关键。
• 数据文件(Data Files):存储实际的表数据、索引数据等用户数据。
• Redo日志文件(Redo Log Files):记录数据库的所有修改操作,用于恢复和数据一致性保障。
• 归档日志文件(Archive Log Files):当Redo日志文件写满后,会将其内容归档到归档日志文件中,用于数据库的完全恢复。
• Slice文件:用于存储特定的分区数据或其他优化存储的文件。
1.3 内存管理
内存管理是YashanDB性能优化的关键部分,主要分为两大区域:
• 共享内存区域(Shared Global Area,SGA):这部分内存被所有数据库会话共享,用于存储全局信息,例如:
• 内存共享池(Share Pool):用于缓存SQL语句的解析树、执行计划、存储过程、数据字典等。
• 数据缓存(Data Buffer):缓存最近访问的数据块,减少磁盘I/O操作。
• 有界加速缓存(AC Buffer):用于加速某些特定操作。
• 虚拟内存(Virtual Memory):用于支持复杂的SQL操作,如排序、连接等。
• 私有内存区域(Session Private Area,SPA):每个会话独占的内存区域,用于存储会话特定的数据,例如:
• 会话栈内存(Stack Memory):存储局部变量等临时数据。
• 会话堆内存(Heap Memory):存储生命周期较长的数据。
1.4 实例与数据库的关系
• 实例(Instance):由线程(工作线程和后台线程)及其管理的内存结构组成。实例是数据库运行的载体,负责控制和管理数据库。
• 数据库(Database):是数据的物理存储载体,由控制文件、数据文件、日志文件等组成。
• 关系:当数据库启动时,实例会加载数据库,并通过内存和线程管理来提供数据服务。一个实例最多只能加载一个数据库。
---
二、YashanDB基本概念
2.1 实例和数据库
• 实例:是数据库运行的载体,由线程和内存结构组成。
• 数据库:是数据的存储载体,由物理文件(如控制文件、数据文件、日志文件等)组成。
• 关系:实例启动时加载数据库,一个实例对应一个数据库。
2.2 内存体系
• 共享内存区域(SGA):供多个会话或线程共享使用,包括内存共享池、数据缓存、有界加速缓存和虚拟内存。
• 私有内存区域(SPA):每个会话独占的内存区域,用于满足SQL执行时的内存需求。
2.3 进程线程体系
• 服务端核心进程(YASDB):实例启动后创建,用于处理连接请求。
• 工作线程(WORKER):客户端连接时创建,负责会话业务执行调度。
• 后台线程:用于实现工作机制和保证数据一致性。
2.4 物理存储
• 包括控制文件、Redo日志文件、数据文件和归档日志文件等。
---
三、YashanDB内存管理详解
3.1 共享内存区域(SGA)
• 内存共享池(Share Pool):
• 包括SQL缓存、日志缓存、PL池、数据字典缓存、大对象池等。
• 数据缓存(Data Buffer):
• 缓存从磁盘读取的数据块拷贝,采用LRU算法管理,大小受`data_buffer_size`参数控制。
• 虚拟内存(Virtual Memory):
• 用于物化数据的SQL算子,如`order by`、`hash join`等,不足时可交换到SWAP表空间,大小受`vm_buffer_size`参数控制。
• 有界加速缓存(AC Buffer):
• 缓存AC对象。
3.2 私有内存区域(SPA)
• 会话栈内存(Stack Memory):存放临时局部变量,大小由`WORK_AREA_STACK_SIZE`参数控制。
• 会话堆内存(Heap Memory):存放生命周期较长的运行期数据,大小由`WORK_AREA_HEAP_SIZE`参数控制。
3.3 常用内存参数
• `DATA_BUFFER_SIZE`:指定数据缓存区大小,影响数据库整体性能,重启生效。
• `VM_BUFFER_SIZE`:指定SQL标准计算使用的内存大小,影响计算性能,重启生效。
---
四、YashanDB进程详解
4.1 服务端核心进程(YASDB)
• 实例启动后创建,用于处理连接请求。
4.2 工作线程(WORKER)
• 客户端连接时创建,负责会话业务执行调度,连接退出时线程退出,会话连接上限由`MAX_SESSIONS`参数控制。
4.3 后台线程
• TCP监听线程(TCP_LSNR):监听TCP端口,处理连接请求并创建会话。
• 数据脏块刷新线程(DBWR):将脏数据块写回磁盘数据文件。
• Redo日志刷盘线程(LOGW):将Redo日志刷盘到Redo日志文件。
• 检查点任务调度线程(CKPT):调度全量和增量检查点任务。
---
五、YashanDB事务和锁
5.1 事务概述
• 定义:事务是包含一个或一组SQL语句的工作单元。
• 特性:
• 原子性(Atomicity):事务中的所有操作要么全部生效,要么全部不生效。
• 一致性(Consistency):事务前后数据库的完整性不变。
• 隔离性(Isolation):并发事务之间相互隔离,互不干扰。
• 持久性(Durability):事务提交后,数据修改永久生效。
5.2 事务的隔离级别
• 支持的隔离级别:读已提交(Read Committed)和可串行化(Serializable),默认为读已提交。
• 隔离级别对比:
• 读未提交(Read Uncommitted):可能出现脏读、不可重复读和幻读。
• 读已提交(Read Committed):避免脏读,但可能出现不可重复读和幻读。
• 可重复读(Repeatable Read):避免脏读和不可重复读,但可能出现幻读。
• 可串行化(Serializable):避免脏读、不可重复读和幻读。
5.3 锁机制
• 作用:处理写写之间的并发,控制不同事务对同一数据的并发修改。
• 分类:
• 表锁:
• 共享锁(Share Lock,S):允许DML并发执行,阻塞并发DDL。
• 排他锁(Exclusive Lock,X):阻塞其他并发的DDL和DML。
• 行锁:DML语句修改数据时锁定要修改的行,只有排他锁一种类型。
5.4 锁相关视图
• `V$LOCK`:显示当前所有锁的信息。
• `V$LOCKED_OBJECT`:显示当前所有被锁定的对象信息。
这些视图可以帮助数据库管理员监控和分析锁的状态,以便优化并发性能和解决潜在的锁冲突问题。
---
六、小结
本章详细介绍了 YashanDB 数据库的体系结构及相关核心概念,主要包括以下几个方面:
1. 体系结构概况:
• YashanDB 的整体架构由线程管理、物理存储和内存管理三大模块组成。
• 线程管理包括工作线程和后台线程,分别负责处理客户端请求和执行系统级任务。
• 物理存储涉及控制文件、数据文件、Redo 日志文件等,是数据持久化的基础。
• 内存管理分为共享内存区域(SGA)和私有内存区域(SPA),用于优化性能和资源分配。
• 实例与数据库的关系明确,一个实例对应一个数据库,实例通过内存和线程管理为数据库提供服务。
2. YashanDB 基本概念:
• 实例是数据库运行的载体,数据库是数据存储的载体。
• 内存体系包括共享内存区域和私有内存区域,分别用于全局数据共享和会话级数据隔离。
• 进程线程体系涉及服务端核心进程、工作线程和后台线程,协同完成数据库的运行和维护。
• 物理存储是数据库的物理基础,包括控制文件、数据文件、日志文件等。
3. YashanDB 内存管理详解:
• 共享内存区域(SGA)包含内存共享池、数据缓存、有界加速缓存和虚拟内存,用于缓存和优化数据库操作。
• 私有内存区域(SPA)为每个会话独占,用于存储会话特定的数据和临时变量。
• 常用内存参数(如`DATA_BUFFER_SIZE`和`VM_BUFFER_SIZE`)对数据库性能有重要影响,需要根据实际需求进行合理配置。
4. YashanDB 进程详解:
• 服务端核心进程(YASDB)负责处理客户端连接请求。
• 工作线程(WORKER)是客户端连接的会话主线程,负责调度会话的业务执行。
• 后台线程包括 TCP 监听线程、数据脏块刷新线程、Redo 日志刷盘线程和检查点任务调度线程,用于执行数据库的系统级任务。
5. YashanDB 事务和锁:
• 事务是包含一个或多个 SQL 语句的工作单元,具有原子性、一致性、隔离性和持久性。
• YashanDB 支持读已提交和可串行化两种隔离级别,默认为读已提交。
• 锁机制用于处理并发操作中的写写冲突,包括表锁和行锁。
• 锁相关视图(如`V$LOCK`和`V$LOCKED_OBJECT`)可用于监控锁的状态。