【赵渝强老师】崖山数据库的体系架构
YashanDB数据库中有数据库和数据库实例这两个基本的概念并且从体系架构的组成上看YashanDB数据库又分为了存储结构、进程线程结构和内存结构。因此要掌握YashanDB的体系架构就需要从数据库与数据库实例入手并进一步深入到其内部核心的结构中。视频讲解如下【赵渝强老师】崖山数据库的还原数据一、 数据库与数据库实例YashanDB数据库英文名称叫做Yashan Database。这里所说的数据库是一个物理上的概念即指物理操作系统的文件或者磁盘的集合。换句话来说YashanDB数据库是由物理硬盘上许多的文件组成。这些文件包含了数据文件、控制文件、重做日志文件等等。数据库的配置信息、日志信息以及表中的数据最终都是存储在这些文件当中。YashanDB数据库的实例英文名称叫做Yashan Database Instance它是一个逻辑上的概念由操作系统的内存和操作系统中的进程组成。这些内存由同一个宿主机上运行的进程所共享。即使没有磁盘存储的数据库文件数据库实例也能存在但是这样的数据库实例没有实际的意义。对于一个正常运行的YashanDB数据库实例来讲可以把它看成是YashanDB数据库文件在内存中的镜像。客户端需要通过操作系统中的进程来访问内存中的这些镜像最终读写YashanDB数据库的数据。在不考虑YashanDB数据库集群的情况下一般情况下一个YashanDB数据库服务只包括一个YashanDB数据库和一个YashanDB数据库的实例。一个实例对应一个数据库。它们之间的对应关系如下图所示。二、 存储结构YashanDB数据库由硬盘上的文件组成而要读写数据需要通过YashanDB实例来完成。那么YashanDB数据库是如何存储数据的呢要搞清楚这个问题就需要理解什么是YashanDB数据库的存储结构。YashanDB数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库还是NoSQL数据库在存储结构上都是通过逻辑存储结构来管理物理存储结构。下面分别介绍这两部分。2.1 YashanDB的逻辑存储结构从逻辑组成上来看一个YashanDB数据库是由一个或者多个表空间等组成一个表空间(tablespace)由一组段组成一个段(segment)由一组区组成一个区(extent)由一批数据库块组成一个数据库块(block)对应一个或多个物理块。如下图所示。下面分别对这些逻辑单元进行介绍。2.1.1 Database数据库Database是YashanDB中最大的逻辑单元它是按照数据结构来组织、存储和管理数据的仓库。所有的表、索引、存储过程、触发器等都被包含在了YashanDB的数据库中。2.1.2 Tablespaces表空间表空间(Tablespace)是数据库的逻辑划分一个表空间只能属于一个数据库。表空间对应一个或多个数据文件通常由相关的段组成。表空间的大小是它所对应的数据文件大小的总和,所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表所以称作表空间。执行下面的语句可以查看YashanDB中的表空间信息。$ yasql/assysdbaSQLselecttablespace_namefromdba_tablespaces;# 输出的信息如下TABLESPACE_NAME------------------SYSTEM SYSAUXTEMPSWAP USERS UNDO6rowsfetched.# 在YashanDB数据库中有些表空间必须存在而有些表空间可以没有。下表列举了YashanDB数据库中的表空间信息以及它们各自在作用。2.1.3 Segments段一个段是分配空间时的一个逻辑结构该逻辑结构可能是表、索引或其他对象存储的一个区域它是数据库对象使用的空间集合。段可以有表段、索引段、回滚段、临时段和高速缓存段等而最常用的段就是表段和索引段。下面的语句将查询YashanDB数据库中段的信息。SQLselectowner,segment_name,segment_typefromdba_segmentswheresegment_typeTABLEandrownum5unionselectowner,segment_name,segment_typefromdba_segmentswheresegment_typeINDEXandrownum5;# 输出的信息如下OWNER SEGMENT_NAME SEGMENT_TYPE------------------ ------------------------ ---------------------MDSYS SPATIAL_REF_SYSTABLEMDSYS SPATIAL_REF_SYS_PKEYINDEXSYS I_OPTSTAT_OPR1INDEXSYS I_OPTSTAT_TASK1INDEXSYS I_OPTSTAT_TASK2INDEXSYS MON_MODS_ALL$TABLESYS TABLE_PRIVILEGE_MAP$TABLESYS YLS$PROPSTABLE8rowsfetched# 这里只显示了YashanDB数据库中部分段的信息。2.1.4 extents区区是数据库存储空间分配的一个逻辑单位它由连续数据块所组成。每一个段是由一个或多个区组成。当一个段中间所有使用的区空间已完全使用YashanDB数据库为该段重新分配一个新的范围即分配一组新的区来存储段中的数据。2.1.5 Data Block数据块数据块是YashanDB数据库管理的最小逻辑存储单位它也是数据库使用的I/O最小单位 即一次I/O读写的数据量大小。数据块的大小由db_block_size参数确定。数据块是处理YashanDB数据库更新、查询或者插入数据时的最小单位。当用户从表中读取数据时I/O操作将从数据库文件中以数据块为单位读取或者写入数据YashanDB数据库默认的数据块的大小为8 KB即使只想检索4 KB的数据也需要读取8 KB的数据量。通过下面的语句查看当前数据块设置的大小SQLshowparameter db_block_size# 输出的信息如下NAMEVALUE-------------------- ---------DB_BLOCK_SIZE81921rowfetched.2.2 YashanDB的物理存储结构YashanDB的物理存储结构就是指的YashanDB数据库在硬盘上存储的各种文件包括数据文件、联机日志文件、控制文件、归档日志文件、参数文件、告警日志文件、跟踪文件和备份文件等。下面分别介绍这些文件以及它们的作用。2.2.1 数据文件Data File一个数据库由多个表空间组成而表空间可以由多个数据文件组成的数据文件是真正存放数据库数据的。一个数据文件就是一个硬盘上的文件。表和索引中的数据在物理上是被存放在数据文件中的。当查询表中数据的时候如果内存中没有该表的数据那么YashanDB数据库的服务器进程将读取该表所在的数据文件然后把数据存放到内存中。通过下面的语句可以查看当前数据库中存在的数据文件和对应的表空间SQLselectfile_name,tablespace_namefromdba_data_files;# 输出的信息如下FILE_NAME TABLESPACE_NAME------------------------------------------------------ -----------------/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/tempTEMP/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO6rowsfetched.当表空间中的数据文件写满时可以通过下面的语句往表空间中添加新的数据文件。例如往users表空间中添加一个10M大小的数据文件。SQLaltertablespaceusersadddatafile/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02size10M;执行下面的语句重新查看YashanDB数据库的数据文件信息SQLselectfile_name,tablespace_namefromdba_data_files;# 输出的信息如下FILE_NAME TABLESPACE_NAME------------------------------------------------------- -----------------/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/tempTEMP/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02 USERS7rowsfetched.2.2.2 重做日志文件Redo Log File一个数据库可以有多个联机重做日志文件它记录了数据库的变化。例如当YashanDB数据库产生异常时导致对数据的改变没有及时写入到数据文件中。这时YashanDB数据库就会根据联机重做日志文件中的信息来获得数据库的变化信息并根据这些信息把这些改变写到数据文件中。换句话来说联机重做日志文件中记录的重做日志可以用来进行数据库实例的恢复。下图展示了YashanDB数据库写入数据的过程。从上图可以看出当前客户端成功提交事务时数据有可能还没有写到数据文件上。如果此时数据库实例发生了崩溃写入的数据是会丢失的。当重新启动数据库实例时YashanDB会利用成功写入的重做日志来恢复实例在内存中的数据这个过程叫做实例恢复。由YashanDB数据库的SMON进程自动完成。通过下面的语句查看当前YashanDB数据库中存在的联机重做日志文件和对应的日志组信息。SQLselectid,name,statusfromv$logfile;# 输出的信息如下ID NAMESTATUS-- --------------------------------------------------- ---------0/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE1/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE2/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3CURRENT3/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE4rowsfetched.下表说明了重做日志文件不同状态的含义。下面是关于重做日志文件的一些基本操作。1添加新的重做日志文件。SQLalterdatabaseaddlogfile(redo5size200m);2重新查询已存在的重做日志文件。SQLselectid,name,statusfromv$logfile;# 输出的信息如下ID NAMESTATUS--- ---------------------------------------------------- ---------0/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE1/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE2/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3CURRENT3/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE4/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 NEW5rowsfetched.3切换重做日志文件。SQLaltersystem switch logfile;4重新查询已存在的重做日志文件。SQLselectid,name,statusfromv$logfile;# 输出的信息如下ID NAMESTATUS--- ---------------------------------------------------- ---------0/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE1/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE2/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 ACTIVE3/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE4/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5CURRENT5rowsfetched.5触发一个检查点并重新查询已存在的重做日志文件。SQLaltersystemcheckpoint;SQLselectid,name,statusfromv$logfile;# 输出的信息如下ID NAMESTATUS--- ----------------------------------------------------- ---------0/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE1/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE2/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 INACTIVE3/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE4/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5CURRENT5rowsfetched.2.2.3 控制文件Control File一个数据库至少要有一个控制文件控制文件中存放了YashanDB数据库的物理结构信息。这些物理结构信息就包括:1数据库的名字。2数据文件和联机日志文件的名字及位置。3创建数据库时的时间戳。4备份的元信息。YashanDB数据库在启动过程中会根据控制文件中记录的数据文件和联机重做日志文件的位置信息来打开数据库。由于控制文件非常重要为了更好的保护数据库通常在执行数据库备份时是需要备份控制文件的。可以通过下面的语句查看当前存在的控制文件。SQLselectnamefromv$controlfile;# 输出的信息如下NAME----------------------------------------------------------------/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl1/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl2/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl33rowsfetched.可以看到在默认情况下YashanDB数据库有三个控制文件这三个控制文件的内容是一样的。这样的方式称之为控制文件的多路复用。即使其中的一个控制文件出现了问题YashanDB数据库也可以使用另一个控制文件。这样也不会因为数据库的损坏从而造成数据的丢失。2.2.4 归档日志文件归档日志文件是联机重做日志文件的副本它也记录了对数据库改变的历史。下面的语句将查看当前数据库的日志模式。SQLselectlog_modefromv$database;# 输出的信息如下LOG_MODE-----------------ARCHIVELOG1rowfetched.YashanDB数据库默认是归档模式。在归档模式下YashanDB可以执行数据库的联机备份或者叫做数据库的热备份而在非归档模式下YashanDB只能执行数据库的离线备份或者叫做数据库的冷备份。2.2.5 参数文件配置参数文件是名为yasdb.ini的文本文件存放在$YASDB_DATA/config路径下产品安装时所指定的数据库初始配置参数将保存在此文件中后续数据库运行过程中对配置参数的非memory修改也将持久化到此文件中。下面展示了参数文件的内容$pwd/home/yashan/yasdb/yasdb_data/db-1-1/config $catyasdb.ini# 输出的信息如下_CLUSTER_ID2fd38e8003d1f864a081f24c187d4b2e NODE_ID1-1:1 CONTROL_FILES(?/dbfiles/ctrl1,?/dbfiles/ctrl2,?/dbfiles/ctrl3)ARCH_CLEAN_IGNORE_MODEBACKUP CGROUP_ROOT_DIR/sys/fs/cgroup LISTEN_ADDR192.168.79.10:1688 REPLICATION_ADDR192.168.79.10:1689 RUN_LOG_FILE_PATH/home/yashan/yasdb/log/db-1-1/run RUN_LOG_LEVELINFO SLOW_LOG_FILE_PATH/home/yashan/yasdb/log/db-1-1/slow CHARACTER_SETUTF8 TIME_ZONE 08:00 DATA_BUFFER_SIZE 512M CHECKPOINT_TIMEOUT 3002.2.6 密码文件密码文件是名为yasdb.pwd的文本文件不可直接进行编辑其路径受PASSWORD_FILE参数控制。该文件用于存储SYS用户的密码。SQLshowparameter PASSWORD_FILE;# 输出的信息如下NAMEVALUE----------------- -----------------------PASSWORD_FILE ?/instance/yasdb.pwd1rowfetched.# 密码文件内容为加密后信息虽然为文本文件但不能直接修改里面的内容。2.2.7 告警日志文件告警日志文件按照时间的先后顺序记录了数据库的重大活动和所发生的错误信息以及警告信息。因此当YashanDB数据库出现任何问题的时候首先就应当检查告警日志文件。警报文名字的格式是alert.log。警报文件的位置默认保存在了存放在$YASDB_DATA/log/alert目录下如下所示$pwd/home/yashan/yasdb/yasdb_data/db-1-1/log/alert $ tail alert.log# 输出的信息如下2025-12-03 15:35:11.569|12|Incident|0|0||the incident was controlled by flood,problem id4,last incident id77 2025-12-03 15:45:38.294|12|Incident|0|0||the incident was controlled by flood,problem id6,last incident id80 2025-12-03 15:54:53.672|12|Incident|0|0||the incident was controlled by flood,problem id1,last incident id82 2025-12-03 17:10:29.602|12|Incident|0|0||the incident was controlled by flood,problem id1,last incident id87 2025-12-03 17:58:03.305|12|Incident|0|0||the incident was controlled by flood,problem id1,last incident id90 2025-12-03 18:11:16.950|12|Incident|0|0||the incident was controlled by flood,problem id1,last incident id91 2025-12-04 15:00:03.294|12|Incident|0|0||the incident was controlled by flood,problem id1,last incident id96 2025-12-04 15:50:00.629|12|Incident|0|0||the incident was controlled by flood,problem id3,last incident id107 2025-12-04 15:52:31.697|12|Incident|0|0||the incident was controlled by flood,problem id2,last incident id116 2025-12-04 15:52:32.767|12|Incident|0|0||the incident was controlled by flood,problem id5,last incident id1182.2.8 跟踪文件跟踪文件是每个YashanDB数据库服务器进程都有的日志文件。当数据库运行中出现问题时通过查看跟踪文件中的内容可以帮助诊断YashanDB数据库的问题。因为每个服务器进程都会将错误信息写到跟踪文件中。因此数据库管理员DBA就可以根据跟踪文件的信息来查看进程中所发生的错误。在默认情况下YashanDB数据库的跟踪文件的位置保存在$YASDB_DATA/diag/trace/目录下。2.2.9 备份文件备份文件就是在数据库发生介质损坏的时候用来还原Restore数据库并执行恢复Recover数据的文件。三、 进程线程结构YashanDB实例启动后创建YASDB进程处理连接到数据库实例的客户端进程的请求。YASDB进程主要包含后台线程以及处理客户请求的工作线程。因此YashanDB采用的是多线程架构这样可以充分利用多核处理器的计算能力提高系统的并发性和响应性。在多线程架构中由一个主线程负责程序的初始化和协调工作然后创建多个子线程来执行具体的任务。每个线程可以独立地执行特定的代码块但它们共享进程的资源和内存空间。通过下面的步骤能够确定YashanDB数据库实例的进程信息和包含的线程信息。1确定YASDB进程的PID。$ps-ef|grep yasdb# 输出的信息如下yashan 45244.../home/yashan/yasdb/23.4.1.102/bin/yasdb open-D/home/yashan/yasdb/yasdb_data/db-1-1# 这里的45244是YASDB的进程PID。2确定YASDB进程所包含的线程信息。$ top-H-p 45244# 输出的信息如下......PID USER......COMMAND 说明 45300 yashan......MMON AWR快照自动管理线程 45244 yashan......yasdb 主线程 45245 yashan......TIMER 逻辑时钟线程 45246 yashan......BUFFER_POOL BUFFER_POOL辅助线程 45247 yashan......PRELOADER 冷数据表扫描预读线程 45248 yashan......PRELOADER 45249 yashan......SMON 系统监控线程 45250 yashan......CKPT 检查点任务调度线程 45251 yashan......DBWR 数据脏块刷新线程 45252 yashan......DBWR 45253 yashan......SCHD_TIMER 高精度定时器线程 45254 yashan......REPL_TCP_LSNR HA监听线程 45260 yashan......LISTENER_LOG 监听日志线程 45261 yashan......UDS_LSNR 本地网络监听线程 45262 yashan......TCP_LSNR TCP监听线程 45263 yashan......RD_ARCH 归档文件传输线程 45264 yashan......ARCH_DATA 归档文件清理线程 45265 yashan......HEALTH_MONITOR 健康检查监控线程 45291 yashan......HOT_CACHE_RECYC 热块回收线程 45292 yashan......LOGW redo刷盘线程 45299 yashan......XFMR 后台转换任务调度线程 45301 yashan......JOB_QUEUE JOB的执行线程 45303 yashan......XFMR_WORKER_0 LSC后台转换任务执行线程四、 内存结构YashanDB数据库的内存结构可以看成是数据库文件的镜像而每个YashanDB数据库实例有两个关联的内存结构共享内存区域SGAShared Global Area和私有内存区域SPASession Private Area。共享内存区域是一组所有后台线程以及会话能够共享访问的内存结构例如数据缓存、SQL缓存、数据字典缓存等。私有内存区域是会话独占和管理的内存区域例如会话栈内存、会话堆内存。下图展示了YashanDB数据库实例的内存结构。4.1 共享内存区域SGA共享内存区域SGAShared Global Area一般共享给多个会话或线程使用主要包括内存共享池SHARE POOL、数据缓存DATA BUFFER、有界加速缓存AC BUFFER以及虚拟内存VIRTUAL MEMORY。通过下面的语句可以查看共享内存区域中的缓冲池SQLselect*fromv$sga;# 输出的信息如下NAME SIZE--------------------------------- ---------------------databuffer536870912temporarybuffer134217728large pool134217728redo buffer67108864hot cache16777216sharepool335544320globalapplication pool16777216dbwr buffer8404992job pool4194304audit queue buffer1677721610rowsfetched.下面分别介绍其中的主要缓冲池的功能和作用。4.1.1 内存共享池SHARE POOL内存共享池包含多个内存区域执行下面的语句可以进行查看SQLselectname,sum(size)fromv$share_poolgroupbyname;# 输出的新如下NAMESUM(SIZE)--------------------------------- -----------SQLPOOL201326448DICTIONARY CACHE POOL67108864LOCKPOOL33554432CURSORPOOL33554432DSTB POOL0RECOVERY BUDDY POOL0BLOCK RES POOL0NON BLOCK RES POOL0GRC REQ POOL0GCS PC POOL0GRC OBJECT POOL0GLS POOL0STREAM POOL0FREE POOL14414rowsfetched.这里最主要的就是SQL POOL它表示SQL的缓存。该内存区域用户保存SQL解析树和执行计划。SQL引擎在执行语句时首先会匹配SQL缓存如果存在相同语句则无需编译直接使用已编译的执行计划从而避免硬解析节省开销。下面通过一个简单的示例来说明SQL POOL的功能。1使用scott用户登录YashanDB数据库实例。$ yasql scott/tiger2执行下面的SQL语句三次。SQLselectcount(empno)fromemp;SQLselectcount(empno)fromemp;SQLselectcount(empno)fromemp;3切换到管理员用户监控SQL POOL中的信息。SQLselectsql_text,parse_calls,loads,executionsfromv$sqlwheresql_textlike%count(empno)%;# 输出的信息如下SQL_TEXT PARSE_CALLS LOADS EXECUTIONS--------------------------------- ------------- ------- ------------selectcount(empno)fromemp313# 从输出的信息可以看出# 该条SQL语句被加载了1次、解析了3次其中1次为硬解析2次为软解析# 并执行了3次。4.1.2 数据缓存DATA BUFFER数据缓存用于缓存当前或最近使用的从磁盘读取的数据块的拷贝可优化数据库的I/O减少物理读/写。采用LRU算法管理当缓存区域内存不足、需要回收内存以重用时选择一些最长时间未使用的缓存块进行淘汰回收。数据缓存分为行数据缓存和列数据缓存行数据缓存用于存放行表相关的数据块拷贝列数据缓存用于存放列表相关的数据块拷贝。4.1.3 有界加速缓存AC BUFFER有界加速缓存类似于数据缓存但缓存的对象不同有界加速缓存只存放基于有界理论的AC对象。4.1.4 虚拟内存VMVIRTUAL MEMORY虚拟内存主要是由需要物化数据的SQL算子使用且在物化对象过大时将磁盘作为虚拟内存使用。虚拟内存又分为行虚拟内存和列虚拟内存相关SQL算子计算行存表数据时使用行虚拟内存计算列存表数据时使用列虚拟内存。4.2 私有内存区域SPA私有内存区域SPASession Private Area是每个会话创建时分配的独占内存区域与共享内存区域不同此区域的内存由会话独占和管理会话退出时释放该内存区域主要是满足SQL执行时的各种内存空间需求。该区域主要包括两部分会话栈内存该区域一般用于存放会话执行过程中临时使用的局部变量等。会话堆内存该区域一般用于存放生命周期较长的运行期数据。通过下面的语句可以查看每个会话的SPA的内存区域。SQLselecttype,sum(use_size)fromV$SESSION_SPAgroupbytype;# 输出的信息如下TYPESUM(USE_SIZE)--------------------------------- -------------vm buffer pool0large pool0app pool0pq pool0columnar vm buffer pool0
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2500837.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!