目录
1.3.1 高速数据缓冲区(Database buffer cache)
1.3.2 重做日志缓冲区(Redo log buffer cache)
1 Oracle体系结构概述
1.1 简介
oracle体系结构主要用来分析数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。oracle数据库是一个逻辑概念,而不是物理概念上安装了oracle数据库管理系统的服务器。
在oracle数据库管理系统中有3个重要的概念需要理解,实例(instance)、数据库(database)和数据库服务器(database server)
- 实例:是一组oracle后台进程以及在服务器中分配的共享内存区域;一个实例只能对应一个数据库,但一个数据库可以对应多个实例(比如 Oracle Rac 集群环境就是多个实例操作同一个)
- 数据库:由基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合;
- 数据库服务器:管理数据库的各种软件工具和实例及数据库的三个部分。
从实例与数据库之间的辩证关系来讲,实例用于管理和控制数据库;而数据库为实例提供数据。一个数据库可以被多个实例装载和打开,而一个实例在其生存期内只能装载和打开一个数据库。
数据库的主要功能就是存储数据,数据库存储数据的方式通常称为存储结构, Oracle 数据库的存储结构分为逻辑存储结构和物理存储结构。逻辑存储结构用于描述 Oracle 内部组织和管理数据的方式,而物理存储结构用于展示 Oracle 在操作系统中的物理文件组成情况。
从实例和数据库的概念来看,实例暂时存在的,是一组逻辑划分的内存结构和进程结构,会随着数据库的关闭而消失。而数据库是一系列的物理文件(控制文件,数据文件,日志文件等等),是永久存在的。
启动 Oracle 数据库服务器实际上是在服务器的内存中创建一个 Oracle 实例, 然后用这个实例来访问和控制磁盘中的数据文件。当用户连接到数据库时,实际上连接的是数据库的实例,然后由实例负责与数据库进行通信,最后将处理结果返回给用户。用户要访问数据库,必须连接到实例,通过实例来访问数据库。
1.2 服务器结构
Oracle服务器主要由实例、数据库、程序全局区和前台进程组成,实例用来提供管理数据库的功能,数据库由Oracle数据库文件组成,用来存储系统数据。
实例可以进一步划分为系统全局区(SGA)和后台进程(PMON、SMON等)两部分,其中,SGA使用操作系统的内存资源,后台进程需要使用CPU与内存资源。
数据库(Database)中包含数据文件(Data files)、控制文件 (ControI files) 和重做日志文件(Redo log file) ,数据库文件存放在硬盘中,程序全局区(PGA)是一个非共享的内存区域,于管理用户进程的私有资源;前台进程可以再划分为用户进程和服务器进程,它们需要使用CPU与内存资源。
Oracle Server 的结构如下图所示:
1.3 系统全局区 (SGA)
系统全局区(System Global Area)是所有用户进程共享的一块内存区域,也就是说,SGA中的数据资源可以被多个用户进程共同使用。SGA主要由高速数据缓冲区、重做日志缓存区、共享池、大型池和Java池等内存结构组成。SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。SGA 是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
1.3.1 高速数据缓冲区(Database buffer cache)
内存中用来频繁访问的区域,包括默认缓存池、保存缓存池、再生缓存池。
高速数据缓冲区中存放着Oracle系统最近访问过的数据块(数据块在高速缓冲区中也可称为缓存块),当用户向数据库发出请求时(如检索某一条数据), 如果在高速数据缓冲区中存在请求的数据,则Oracle系统会直接从高速数据缓冲区中读取数据并返回给用户,否则,Oracle系统会打开数据文件读取请求的数据。若无法在高速数据缓冲区中找到所需要的数据,则Oracle首先从数据文件中读取指定的数据块到缓冲区,然后再从缓冲区中将请求的数据返回给用户。
由于高速数据缓冲区被所有的用户所共享,只要数据文件中的某些数据块被当前用户或其他用户请求过,那么这些数据块就会被装载到高速数据缓冲区中。这样当任何用户再次访问相同的数据时,Oracle就不必再从数据文件中读取数据,而是可以直接将缓冲区中的数据返回给用户。经常或最近被访问的数据块会被放置到高速数据缓冲区前端,不常被访问的数据块会被放置到高速数据缓冲区的后端,当高速数据缓冲区填满时,会自动挤掉一不常被访问的数据块(LRU,Least Recently Used,最近最少使用算法)。
DML语句处理:
- 如果缓冲区高速缓存中尚不存在数据和回退块,那么服务器进程就会从数据文件中将它们读入缓冲区高速缓存。
- 服务器进程在将要修改的行上放置锁。
- 在重做日志缓冲区中服务器进程记录将要对回退和数据进行的更改。
- 回退块更改记录数据修改以前的值。回退块用于存储成映像前的数据,以便必要的情况下DML 语句能够回退。
- 数据块更改记录数据的新值。
- 服务器进程将成映像前的数据记录到回退块中,并且更新数据块。这两种更改都是在数据库缓冲区高速缓存中进行的。缓冲区高速缓存中的任何已更改块都标记为灰数据缓冲区- 即与磁盘中相应的块不同的缓冲区
缓冲区高速缓存中每个缓冲区的大小(大小由 DB_CACHE_SIZE 参数设定)都与Oracle 块的大小相等,数据块由DB_BLOCK_SIZE
参数指定。缓冲区的数目等于DB_BLOCK_BUFFERS
参数值。
以存取速度来看,内存的读取速度远快于物理硬盘,所以高速数据缓冲区的存在可大大降低对物理磁盘的读取频率,从而达到提高数据库服务器性能的目的。
为了便于管理SGA的内存数据,Oracle把高速数据缓冲区分为以下3个部分:
- 脏数据区
脏数据区中存放着已被修改过的数据,这些数据等待被写入数据文件中。当一条更新或删除语句对某些数据块中的数据修改后,那么这些数据块就被标记为“脏”,然后等待提交命令并通过后台进程DBWR将其写入数据文件中。 - 空闲区
空闲区中的数据块不包含任何数据,这些数据块可以被写入数据,Oracle可以从数据文件中读取数据块,并将其存放到该区中。 - 保留区
保留区包含那些正在被用户访问的数据块和明确保留以作为将来使用的数据块(即缓存块), 这些数据块将被保留在缓冲区中。
1.3.2 重做日志缓冲区(Redo log buffer cache)
重做日志缓冲区用于存放对数据库进行修改操作时所产生的日志信息,这些日志信息在写入重做日志文件之前,首先存放到重做日志缓冲区中,然后,在检查点发生或重做日志缓冲区中的信息量到达一定峰值(LOG_BUFFER)时, 最后由日志写入进程(LGWR)将此缓冲区的内容写入到重做日志文件。
重做日志缓冲区的大小由LOG_BUFFER(查看命令:show parameter LOG_BUFFER)参数指定,该参数也可以在实例启动后动态修改。相对于高速数据缓冲区而言,重做日志缓冲区的大小对数据库性能的影响较小,通常较大的重做日志缓冲区能减少重做日志文件对I/O的读写次数,对数据库的整体性能有一定的提高。
COMMIT提交处理:
- 服务器进程随同系统更改号(SCN)一起在重做日志缓冲区中放置一个提交记录。
- LGWR 向重做日志文件中连续写入直到提交记录含提交记录的所有重做日志缓冲区条目,在这之后,Oracle 服务器就能够保证即使存在实例失败也不会丢失更改。
- 通知用户COMMIT 命令已完成。
- 服务器进程记录信息以指出事务处理已完成并且可以释放资源锁。
每当事务处理提交时,Oracle 服务器就把一个提交系统更改号(SCN) 分配给该事务处理。SCN 是简单递增的,而且在数据库中是唯一的。Oracle 服务器使用它作为内部时间戳以使数据同步。并且在从数据文件检索数据时提供读一致性。使用SCN 使 Oracle 服务器能够执行一致性检查,而不用依赖操作系统的日期和时间。
1.3.3 共享池(Shared Pool)
共享池是SGA保留的内存区域,用于缓存SQL语询、PL/SQL语句、 数据字典、资源锁、字符集以及其他控制结构等。共享池的内存空间大小是可以动态改变的,一般通过修改参数SHARED_POOLSIZE的值来实现。Oracle共享池的空间不是越大越好,因为系统的内存资源是有限的,而且操作系统本身也要消耗一定的内存空间。共享池包含库高速缓冲区(Library cache)和字典高速缓冲区(Dictionary cache)。
- 库高速缓冲区(Library cache)
库高速缓冲区是共享池的一部分,主要包括共享SQL区和私有SQL区两个组成部分。库高速缓冲区中存放最近用过的SQL语句、PL/SQL语句的文本和执行计划。当下一次执行相同的SQL语句或PL/SQL语句时,可以直接在库高速缓冲区中找到之前已生成的执行计划,而不需要再次解析相同的SQL语句或PL/SQL语句,从而提高系统执行效率。
Oracle 使用 LRU 队列和算法来管理库缓存,最近使用过的 SQL 命令会放在队首,长时间没有使用的 SQL 命令放在队尾,当库缓存需要内存空间而又没有空闲的内存空间时,队尾内存中的 SQL 命令会被清除,放入最新的 SQL命令。
每条被缓存的SQL或PL/SQL语句都被分成两个部分,分别被存放在共享SQL区和私有SQL区中。- 共享SQL区:存放SQL或PL/SQL语句的语法分析结果和执行计划,如果以后要再次执行类似的语句,则可以利用共享SQL区中已缓存的语法分析结果和执行计划。
- 私有SQL区:存放SQL语询中的绑定变量、环境和会话等信息, 这些信息属于执行该语句的用户的私有信息,其他用户则无法共享这些信息。
- 字典高速缓冲区(Dictionary cache)
数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、权限、数据文件名、段名、表结构及表说明等,当需要这些信息时,将读取数据字典表并且将返回的数据存储在数据字典缓存区中。数据字典缓存区通过 LRU 算法来管理。
1.3.4 大型池(Large pool)
大型池在SGA区中不是必需的内存结构,只在某些特殊情况下,实例需要使用大型池来减轻共享池的访问压力,常用的情况有以下几种。
- 当使用恢复管理器进行备份和恢复操作时, 大型池将作为I/O缓冲区使用。
- 使用I/O Slave仿真异步I/O功能时,大型池将被当作I/O缓冲区使用。
- 执行具有大量排序操作的SQL语句。
- 当使用并行查询时,大型池作为并行查询进程彼此交换信息的地方。
大型池的缓存区大小是通过LARGE_POOL_SIZE参数定义的,在Oracle 11g中,用户可以使用alter system命令动态地修改其缓存区的大小。如果在SGA区中没有设置大型池,则在实例需要时,Oracle系统会在共享池或PGA中分配一定的缓存空间, 这样势必会影响到共享池或PGA的工作效率。
1.3.5 Java池
用来提供内存空间给Java虚拟机使用,目的是支持在数据库中运行Java程序包,其大小由JAVA_POOL_SIZE参数决定。
1.3.6 流池
Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。流池的大小由参数STREAMS_POOL_SIZE决定。
1.4 程序全局区(PGA)
程序全局区(Program Global Area)也可称作用户进程全局区,它的内存区在进程私有区而不是共享区中。虽然PGA是一个全局区, 可以把代码、全局变量和数据结构都可以存放在其中,但区域内的资源并不像SGA一样被所有的用户进程所共享,而是每个Oracle服务器进程都只拥有属于自己的那部分PGA资源。
在程序全局区中,一个服务进程只能访问属于它自己的那部分PGA资源区,各个服务进程的PGA的总和即为实例的PGA的大小。通常PGA由私有SQL区和会话区组成。
1.4.1 私有SQL区
私有SQL区用于存储变量以及SQL语句运行时的内存结构信息,当每个用户连接到实例时,都会在实例中创建一个会话。 这些会话可能会在SGA区中创建一个共享SQL区,但在PGA区中可能会创建多个私有SQL区。把一个私有 SQL 区与对应的共享SQL区合并在一起,就可以获得一条SQL语句的完整缓存数据。
另外,每个会话的私有SQL区可以再分为静态区和动态区两部分。静态区的信息在会话过程中保持不变,只有当会话结束时,静态区才会被释放掉,而动态区的信息在整个会话过程中是不断变化的,一旦SQL语句指定完毕,即使会话还没有结束,动态区就被释放掉。
1.4.2 会话区
会话区用于存放用户的会话信息(如登录用户名)。如果数据库处于共享服务器连接模式下,则会话区将位于SGA中,而不是PGA中,这点需要用户特别注意,查看程序全局区的信息可以通过显示PGA参数的内容来实现。
1.5 前台进程
前台进程包括用户进程和服务器进程,它不属于实例的一部分,但是用户在不知不觉中经常会用到它,使用前台进程能够实现用户与实例的沟通。
1.5.1 用户进程
用户进程是指那些能够产生或执行SQL语句的应用程序,无论是SQL*Plus
,还其他应用程序,只要是能生成或执行SQL语句,都被称作用户进程。
在用户进程中有两个非常重要的概念:连接和会话。
- 连接是一个用户进程与实例之间建立的通信渠道,这个渠道可以通过操作系统上的相关通信机制或网络连接来实现。
- 会话是指在用户进程与实例之间建立连接后形成的用户与实例之间的交互式,一般是用户发出请求,数据库实例为用户返回响应消息的方式。
例如,户在SQL*Plus
中发出connect system/1qaz2wsx
的请求命令,若用户名和密码都正确,则数据库实例返回“已连接”的响应消息。
1.5.2 服务器进程
服务器进程是用于处理用户会话过程中向数据库实例发出的SQL语句或SQL*PIus命令,它可以分为专用服务器模式和共享服务器模式。
- 在专用服务器模式下,每个用户进程都有一个专用的服务器进程,这个服务器进程代表用户进程执行SQL语句,必要时还可以回传执行结果给用户进程。
- 在共享服务器模式下,每个用户进程不直接与服务器进程连接,而是连接到分派程序,每个分派程序可以同时连接多个用户进程。
1.6 后台进程
Oracle后台进程是一组运行于Oracle服务器端的后台程序, 是Oracle实例的重要组成部分。这组后台进程有若干个,它们分工明确一分别完成不同的系统功能,如图所示,SMON、PMON、DBWR、 LGWR和CKPT这5个后台进程必须正常启动,否则将导致数据库实例崩溃。
此外,还有很多辅助进程,用于实现相关的辅助功能,如果这些辅助进程发生问题,只是某些功能受到影响,一 般不会导致数据库实例崩溃。
1.6.1 数据写入进程(DBWR)
数据写入进程的主要任务负责将内存中的 "脏” 数据块回写到数据文件中。
所谓的“脏”数据块是指高速数据缓冲区中被修改过的数据块,这些数据块的内容与数据文件的数据块内容不一致。但DBWR并不是随时将所有的“脏” 数据块都写入数据文件,只有满足一定的条件时,DBWR进程才开始批量地将“脏”数据块写入数据文件,Oracle这样做的目的是尽量减少I/O操作,提高Oracle服务 器性能。
通常在以下几种情况发生时,DBWR进程会将"脏” 数据块写入数据文件:
- 脏数据缓冲区的数量达到阈值
当用户进程执行插入或修改等操作时,需要将“新数据”写入到高速数据缓冲区,如果在高速数据缓冲区中没有找到足够用的空闲数据块来存放这些”新数据”,这时,Oracle系统将启动DBWR进程并将”脏” 数据块写入到数据文件,以获得空闲数据块来存储这些”新数据”。 - 当进行扫描而无法找到任何空闲缓冲区时,进程扫描了指定数量的块
- 产生检查点,当检查点进程启动后,它会强制要求DBWR将某些“脏”数据块写入数据文件。
- 当 ”脏”数据块在高速数据缓冲区中存放超过3秒钟,DBWR进程会自行启动并将某些”脏”数据块写入数据文件
- 表空间 offline
- drop / truncate 表
在某些比较繁忙的应用系统中,可以修改服务器参数文件SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程。但是DBWR进程的数量不应当超过系统处理器的数量,否则多余的DBWR不但无法发挥作用,反而会耗费系统资源。
1.6.2 检查点进程(CKPT)
检查点进程可以看作是一个事件, 当检查点事件发生时,CKPT会要求DBWR将某些”脏”数据块回写到数据文件。主要负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
CKPT 进程负责通知 DBWR 和 LGWR 将脏数据写入磁盘,以及时消除因 DBWR 与 LGWR 延迟写所造成的数据不一致情况,确保内存中的数据块被规律地写入文件,并对数据库控制文件和数据文件进行更新同步(修改文件时间头部),以记录下当前的数据库结构和状态。由于Oracle 中 LGWR 和 DBWR 工作的不一致,Oracle 引入了检查点的概念,用于同步数据库,保证数据库的一致性。
检查点可强制 DBWR 写入脏缓冲区,当数据库崩溃后,由于大量脏缓冲区未写入数据文件,在重新启动时,需要由 SMON 进行实例恢复,实例恢复需要提取和应用重做日志记录,提取的位置就是从上次检查点发起的位置开始的,这个位置称为RBA(redo byte address),CKPT 会不断将这个位置更新到控制文件中去,以确定实例恢复需要从哪儿开始提取日志记录。
当用户进程发出数据请求时,Oracle 系统从数据文件中读取需要的数据并存放到高速数据缓冲区中,对数据的操作是在缓冲区中进行的。当用户操作数据时,就会产生大量的日志信息并存储在重做日志缓冲区,当Oracle系统满足一 定条件时,日志写入进程(LGWR)会将日志信息写入重做日志文件组中,当发生日志切换时(写入操作正要从一个日志文件组切换到另一组时), 就会启动检查点进程。
1.6.3 日志写入进程(LGWR)
日志写入进程用于将重做日志缓冲区中的数据写入重做日志文件。Oracle系统首先将用户所做的修改日志信息写入日志文件,然后再将修改结果写入数据文件。
当事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。LGWR 进程管理日志缓冲区,将数据库的更改写入日志文件,以便维护数据的一致性,并为数据丢失后进行恢复提供依据。Oracle 通过延迟写日志来优化 IO 操作,Oracle 会在以下 情况触发 LGWR 进程写日志:
- 当提交事务处理时
- 当重做日志缓冲区的三分之一已满时
- 日志信息存放超过3秒钟
- 当重做日志缓冲区中记录了超过1 MB 的更改时
- 在 DBWR 将数据库缓冲区高速缓存中修改的块写入数据文件以前因为恢复操作需要重做,所以 LGWR 只在重做写入磁盘后确认COMMIT 命令。
LGWR进程就将日志信息从重做日志缓冲区中读出并写入日志文件组中序号较小的文件中,一个日志组写满后接着写另外一组。当LGWR进程将所有的日志文件都写过一遍之后,它将再次转向第一个日志文件组重新覆盖,如图所示。当LGWR进程写满一个日志文件组而转向写另外一个组时,称之位日志切换。
1.6.4 归档进程(ARCH)
归档进程是一个可选择的进程,只有当Oracle数据库处于归档模式时,该进程可能起到作用。若Oracle数据库处于归档模式,当各个日志文件组都被写满而即将被覆盖之前,先由归档进程(ARCH)把即将被覆盖的日志文件中的日志信息读出,然后再把这些 “读出的日志信息” 写入到归档日志文件中,如图所示。
当系统比较繁忙而导致LGWR进程处于等待ARCH进程时,可通过修改LOG_ARCHIVE_MAX_PROCESSES参数启动多 个归档进程,从而提高归档写磁盘的速度。
1.6.5 系统监控进程(SMON)
系统监控进程是在数据库系统启动时执行回复工作的强制性进程。比如,在并行服务器模式下,SMON可以恢复另一条处于失败的数据库 ,使系统切换到另外一台正常的服务器上。
当实例异常终止时,SMON 进程在实例启动时执行实例恢复,在实例恢复过程中,如果由于文件读取错误或所需文件处于脱机状态而导致某些异常终止的事务未被恢复,SMON 将在表空间或文件恢复联机状态后再次恢复这些事务。SMON 还负责清理不再使用的临时段以及为数据字典管理的表空间合并相邻的可用数据扩展。
检查数据库的一致性,如果Oracle 实例失败,那么SGA 中尚未写入磁盘的所有信息都会丢失。实例丢失后,后台进程 SMON 在数据库重新打开时自动执行实例恢复。恢复实例需要进行以下步骤:
- 前滚以恢复尚未记入数据文件但已经记入联机重做日志中的数据。由于实例失败过程中SGA 的丢失,这些数据尚未写入磁盘。在这个进程中,SMON 读取重做日志文件并将重做日志中记录的更改应用到数据块中。由于所有提交的事务处理都已被写入重做日志,因此该进程完全恢复这些事务处理。
- 打开数据库以允许用户登录。未被未恢复事务处理锁定的任何数据都立即可用。
- 回退未提交的事务处理。它们由SMON 回退,或在访问锁定的数据时由单个服务器进程回退。
SMON 也执行一些空间维护功能:
- 联合或合并数据文件中空闲空间的邻近区域。
- 回收临时段将它们作为数据文件中的空闲空间返回。临时段用于在SQL 语句处理过程中存储数据。
1.6.6 进程监控进程(PMON)
进程监控进程用于监控其他进程的状态,当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。
负责在一个Oracle 进程失败时清理资源,进程失败后,后台进程PMON 通过下面的方法进行清理:
- 回退用户的当前事务处理
- 释放当前保留的所有表锁或行锁
- 释放用户当前保留的其它资源
如果会话不正常终止时,PMON 负责 Rollback 未提交的事务,释放资源;同时监控 Oracle 所有后台进程。PMON 还周期性地检查调度进程和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)
1.6.7 锁进程(LCKN)
锁进程是一个可选进程 ,并行服务器模式下可以出现多个锁定进程以利于数据库通信。
LCKN进程是在并行服务器环境下使用,用于实例间的封锁,最多可以有 10 个进程(LCK0,LCK1……,LCK9)。
1.6.8 恢复进程(RECO)
RECO 进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障,维持在分布式环境中的数据的一致性。
1.6.9 调度进程(DNNN)
调度进程是-个可选进程,在共享服务器模式下使用,可以启动多个调度进程。
1.6.10 快照进程(SNPN)
快照进程用于处理数据库快照的自动刷新,并通过DBMS_ JOB包运行预定的数据库存储过程。
2 逻辑存储结构
逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构。逻辑存储结构是从逻辑的角度分析数据库的构成,是对数据存储结构在逻辑概念上的划分。Oracle 的逻辑存储结构是一种层次结构,主要由表空间、段、区间和数据块等概念组成。逻辑结构是面向用户的,当用户使用 Oracle 设计数据库时,其使用的就是逻辑存储结构。 Oracle 的逻辑存储结构中所包含的多个结构对象从数据块到表空间形成了不同层次的粒度关系,如下图所示:
从图中可以看到, Oracle 数据库由多个表空间组成(数据库自身也属于逻辑概念),而表空间
又由多个段组成,段由多个数据区组成,数据区又由多个数据块组成。
2.1 数据块 (Data Blocks)
数据块是 Oracle 逻辑存储结构中最小的逻辑单位, 也是执行数据库输入输出操作的最小存储单位。Oracle 数据存放在“Oracle 数据块”中,而不是“操作系统块”中。
块是Oracle数据库中最基本的存储单位。它是数据文件中的连续数据单元,用于存储和检索数据。每个块由一组字节组成,包括数据、元数据和用于管理块的控制信息。在一个块中,可以存储一个或多个表或索引的数据行。块的大小在创建数据库时确定(默认大小为8K)并且在整个数据库中保持一致。较小的块大小可以提高存储效率,但也会增加管理开销。较大的块大小可以提高IO性能,但会浪费存储空间。
通常Oracle数据块是操作系统块的整数倍,如果操作系统块的大小为2048B,并组Oracle数据块的大小为8192B,则表示Oracle数据块由4个操作系统块构成。
Oracle 数据块有一定的标准大小,其大小被写入到初始化参数DB_BLOCK_SIZE 中。另外, Oracle 支持在同一个数据库中使用多种大小的块,与标准块大小不同的块就是非标准块。
SQL> col name format a30
SQL> col value format a20
SQL> select name,value from v$parameter where name = 'db_block_size' ;
注意:上述语法中col是column的简称,format可以简称为for
数据块中可以存放表数据、索引数据和簇数据等,无论存放哪种类型的数据,其结构都是相同的。数据块由块头、表目录、行目录、余空间和行数据这5部分组成,数据块中各个组成部分的介绍如下:
- 块头: 存放数据块的基本信息, 如块的物理地址、 块所属的段的类型。
- 表目录:存放表的相关信息。如果数据块中存储的数据是表数据,则表目录中存储有关这些表的相关信息。
- 行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行的地址等。
- 空余空间:空余空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。
- 行数据:用于存放表数据和索引数据的地方,这部分空间已被数据行所占用(如表中的若干行数据记录)。
通常把块头、表目录、行目录这 3 部分组合起来称为头部信息区,头部信息区不存放数据,它存放整个块的引导信息,起到引导系统读取数据的作用。所以头部信息区若遭到破坏,则 Oracle 系统将无法读取这部分数据。另外,空余空间和行数据共同构成块的存储区,用于存放真正的数据记录。
2.2 数据区(Extent)
2.3 段(Segment)
2.4 表空间
表空间是一个逻辑存储结构,用于组织和管理数据文件。一个数据库可以包含多个表空间,每个表空间包含一个或多个数据文件。表空间可以由DBA(数据库管理员)创建和管理,它定义了数据文件的分配和增长方式。
Oracle数据库中有四种类型的表空间:系统表空间、用户表空间、临时表空间和回滚表空间。系统表空间用于存储数据库的元数据,用户表空间用于存储用户数据,临时表空间用于存储临时数据(如排序和临时表),回滚表空间用于存储事务回滚数据。
2.5 数据文件(Data Files)
数据文件是Oracle数据库中存储数据的基本单位。每个数据文件都对应于操作系统中的一个物理文件,可以位于磁盘、阵列或其他存储介质上。数据文件是以固定大小的块(Block)为单位进行管理的。