物理存储结构
数据文件
数据文件(Data File)是在物理上保存数据库中数据的操作系统文件。例如,表中的记录和索引等都存在数据文件中,有以下特征:
(1)一个数据文件仅与一个数据库联系。
(2)一个表空间由一个或多个数据文件组成。
(3)数据文件可以通过设置其自动扩展参数,实现其自动扩展的功能。
数据文件中的数据在需要时可以读取并存储在Oracle内存的 数据缓冲区 中。在存储数据时,用户修改或添加的数据会先保存在内存的数据缓冲区中,不必立刻 写入数据文件,然后由Oracle的后台进程 DBWn 决定如何将数据写入数据文件。这样的存取方式减少了磁盘的I/O总数,提高了系统的响应性能。
在Oracle中可以通过数据字典 dba_data_files 查看数据文件的基本信息。如果要井底数据文件的动态信息,可以通过数据字典视图 v$datafile 来查看。
控制文件
控制文件(Control File)是一个 很小 的二进制文件,用于 描述和维护数据库的物理结构。在Oracle数据库中,控制文件相当重要,它存放有数据库中数据文件和日志文件的信息。一旦控制文件受损,数据库将无法正常工作。为安全起见,控制文件经常 镜像。
通过数据字典 v$controlfile,可以了解控制文件的相关信息。
重做日志文件
重做日志文件主要用于记录数据库中所有修改信息的文件,简称 日志文件。通过使用日志文件,不仅 可以保证数据库安全,还 可以实现数据库备份与恢复。为了确保日志文件的安全,在实际应用中,允许对日志文件进行 镜像。
一个日志文件和它的所有镜像文件构成一个 日志文件组,它们包含相同的信息。同一个组中的日志文件最好保存到 不同 的磁盘中,这样可以防止由磁盘物理损坏所带来的麻烦。
一个数据库中 至少要有两个 日志组文件,一组写完再写另一组,即轮流写。在日志组中日志文件的镜像个数受参数 maxlogmembers 限制,最多可以有五个。
Oracle有 联机日志文件 和 归档日志文件 两种日志文件类型。联机日志文件是Oracle用来循环记录数据库改变的操作系统文件,归档日志文件是指为避免联机日志文件重写时丢失重复数据而对联机日志文件所做的备份。
Oracle有两种归档日志模式:
(1)NOARCHIVELOG
不对日志文件进行归档。这种模式可以大大减少数据库备份的开销,但可能会导致数据的不可恢复。
(2)ARCHIVELOG
在这种模式下,当Oracle转向一个新的日志文件时,将以前的日志文件进行归档。为防止出现历史“缺口”的情况,一个给定的日志文件在它 成功归档之前是不能重新使用的。归档的日志文件,加上联机日志文件,为数据库的所有改变提供了完整的历史信息。
可以通过数据字典 v$log 来了解系统当前正在使用哪个日志文件组。
其他文件
1、参数文件
参数文件用于记录Oracle数据库的基本参数信息,主要包括数据库名和控件文件所在的路径等。
参数文件分为 文本参数文件(Parameter File,PFILE) 和 服务器参数文件(Server Parameter File,SPFILE)。
2、备份文件
文件受损时,可以借助于备份文件对受损文件进行恢复。对文件进行还原的过程,就是用备份文件替换该文件的过程。
3、归档重做日志文件
归档重做日志文件用于对写满的日志文件进行复制并保存,具体功能由归档进程 ARCn 实现,该进程负责将写满的重做日志文件复制到归档日志目标中。
4、口令文件
口令文件用于存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上,因为sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说 sys用户要想连接数据库必须使用口令文件。
5、警告、跟踪文件
当一个进程发现了一个内部错误时,它可以将关于错误的信息存储到它的跟踪文件中。而 警告文件则是一种特殊的跟踪文件,它包含错误事件的说明,而随之产生的跟踪文件则记录该错误的详细信息。
逻辑存储结构
Oracle逻辑存储结构是一种层次结构,从大到小为:
表空间,段,区和 数据块。
上一个层次由多个下一个层次组成。
表空间
表空间是在Oracle中 用户可以使用的最大的逻辑存储结构,用户在数据库中建立的所有内容都被存储在表空间中,所有表空间大小的和就是数据库的大小。
在Oracle数据库中,存储结构管理主要是通过对表空间的管理实现的。
创建Oracle数据库时,Oracle数据库系统一般会自动创建一系列表空间,这些表空间可以通过数据字典视图 DBA_TABLESPACES 来查看。
表空间 | 说明 |
---|---|
sysaux | 辅助系统表空间,存储数据库组件等信息,用于减少系统表空间的负荷,提高系统的作业效率。该表空间由Oracle系统内部自动维护,一般不用于存储用户数据 |
system | 系统表空间,用于 存储表空间名称、控制文件、数据文件等系统管理信息,系统数据字典,模式对象(如表,索引,同义词,序列)的定义信息等。 |
temp | 临时表空间,用于 存储临时的数据,例如存储排序时产生的临时数据。一般情况下,数据库中的所有用户都使用temp作为默认的临时表空间。 |
undotbs1 | 撤销表空间,用于 在自动撤销管理方式下存储撤销信息。在撤销表空间中,除了回退段以外,不能建立任何其他类型的段。所以,用户不可以在撤销表空间中创建任何数据库对象。 |
users | 用户表空间,用于 存储永久性用户对象和私有信息。每个数据块都应该有一个用户表空间,以便在创建用户时将其分配给用户。 |
example | 示例表空间,存放示例数据库的方案对象信息及其培训资料。 |
段
段是由一个或多个连续或不连续的区组成的逻辑存储单元,是表空间的组成单位。
段内包含的数据区可以不连续,并且可以跨越多个文件。
Oracle段分为4种类型:
(1)数据段
数据段也称为表段,它包含数据并且与表相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
(2)索引段
用于存储表中的索引信息。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
(3)临时段
它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段的区间便退回给系统。
(4)回滚段
用于存储用户数据被修改前的值,在数据恢复期间使用,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。
区
区是Oracle数据库存储空间分配的逻辑单位,一个区由一组 连续的数据块组成,当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。
数据区不能跨文件。使用区的目的是 用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。
一个Oracle对象包含至少一个数据区,设置一个表或索引的存储参数包含设置它的数据区大小。
每个段在定义时有许多存储参数来控制区的分配,主要是STORGAE参数,主要包括以下几项:
INITIAL:分配给段的第一个区的字节数,默认为5个数据块。
NEXT:分配给段的下一个增量区的字节数,默认为5个数据块。
MAXEXTENTS:最大扩展次数。
PCTINCREASE:每一个增量区都在最新分配的增量区上增长,这个百分数默认值为50%。
区在分配时,遵循如下分配方式:
(1)初始创建时,分配INITIAL指定大小的区。
(2)空间不够时,按NEXT大小分配第二个区。
(3)再不够时,按NEXT+NEXT*PCTINCREASE分配。
数据块
数据块是Oracle 最小的逻辑存储单位。
块是Oracle读写数据的最小单位。
块的标准大小由初始化参数 DB_BLOCK_SIZE 指定。
块由以下5部分组成:
(1)块头
存放块的基本信息,如块的物理地址,块所属的段的类型。
(2)表目录
存放表的信息,即如果一些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在“表目录中”。
(3)行目录
如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行的地址等。
(4)空闲空间
空闲空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行更新。
(5)行空间
是真正存放表数据和索引数据的地方。这部分空间是已被数据行占用的空间。
块头、表目录和行目录这三部分合称为头部信息区。头部信息区不存放数据,它存放的是整个块的信息。头部信息区的大小是可变的。一般来说,头部信息区的大小为84-107B。
内存结构
在Oracle数据库很难缠中内存结构主要分为 系统全局区(SGA) 和 程序全局区(PGA),结构如下:
系统全局区
系统全局区(System Global Area, SGA) 是一组为系统分配的 共享 的内存结构,可以包含一个数据库实例的数据或控制信息。
SGA区域的总内存大小由参数 sga_max_size 决定,可使用 SHOW PARAMETER 语句查看该参数信息。
数据缓冲区
数据库缓冲区用于 存放最近访问的数据块信息,供所有用户共享。
数据库缓存区的大小由 db_cache_size 参数决定,可以通过show parameter语句查看该参数信息。
日志缓冲区
日志缓冲区用于 存储数据库的修改操作信息。当日志缓冲区中的日志数据达到一定的限度时,由日志写入进程 LGWR 将日志数据写入到磁盘重做日志文件。
日志缓冲区的大小由参数 log_buffer决定
共享池
共享池用于 保存最近执行的SQL语句、PL/SQL程序的数据字典信息,它是对SQL语句和PL/SQL程序进行语法分析、编译和执行的内存区域。
共享池包括 执行计划 及 运行数据库的SQL语句的语法分析树。
共享池主要包括以下两种缓冲区:
(1)库缓冲区:用于保存SQL语句的分析码和执行计划。在库缓冲区中,不同的数据加用户可以共享相同的SQL语句。
(2)数据字典缓冲区:用于保存数据字典中得到的表、列定义和权限。
共享池的大小由 shared_pool_size 决定。
Java池
Java池用于在数据库中支持Java的运行。
大小由 java_pool_size 决定。
大型池
大型池是一个可选内存区。大型池致力于支持SQL大型命令。
大小由 large_pool_size 决定。
程序全局区
程序全局区(Program Global Area, PGA) 是Oracle系统分配给一个进程的 私有 内存区域,包含单个用户或服务器数据和控制信息。
大小由 pga_aggregate_target 决定。
进程结构
Oracle进程结构包括 用户进程 和 Oracle进程 两类,而Oracle进程又分为 服务器进程 和 后台进程,每个系统进程的大部分操作都是 相互独立 的,互不干扰。
用户进程
用户进程运行在客户端,是用户连接数据库执行一个应用程序(例如SQL*Plud)时创建的,用来完成用户所指定的任务。
服务器进程
用于处理连接到数据库实例的用户进程所提出的请求。主要完成以下任务:
(1)解析并执行用户提交的SQL语句和PL/SQL语句。
(2)在SGA的高速缓冲区中搜索用户进程所需要访问的数据,如果数据不在缓冲区中,则需要从硬盘数据文件中读取所需的数据,再将它们复制到缓冲区中。
(3)将查询或执行后的结果数据返回给用户进程。
后台进程
后台进程是Oracle数据库为了保证在任意一个时刻都可以处理多用户的并发请求、进行复杂的数据操作、优化系统性能,而启用的一些相互独立的附加进程。数据库的物理结构与内存结构之间的交互通过后台进程来完成。后台进程主要完成以下任务:
(1)在内存与磁盘之间进行I/O操作。
(2)监视各个服务器的进程状态。
(3)协调各个服务器进程的任务。
(4)维护系统性能和可靠性。
通过查询数据字典 v$bgprocess 可以了解数据库中启动的后台进程信息。
1、DBWn进程
DBWn(数据写入进程),采用 ==LRU(Least Recently Used,最近最少使用)==算法将数据缓冲区中的数据写入数据文件的进程。
当数据缓冲区的数据被修改后,就标记为 dirty,DBWR进程将数据缓冲区中的脏数据写入数据文件,保持数据缓冲区的干净。
当用户进程要从磁盘读取数据块到数据缓冲区却无法找到足够的空闲数据缓冲区时,DBWn将数据缓冲区内容写入磁盘。
DBWn主要作用如下:
(1)管理数据缓冲区,以便用户进程总能够找到足够的空闲缓冲区。
(2)将所有修改后的缓冲区数据写入数据文件。
(3)使用LRU算法保持缓冲区数据是最近经常使用的。
(4)通过延迟写来优化磁盘I/O读写。
DBWn进程的工作流程如下:
(1)当一个用户进程产生后,服务器进程查找内存缓冲区中是否存在用户进程所需要的数据。
(2)如果内存中没有需要的数据,则服务器进程从数据文件中读取数据。这时,服务器进程会首先从LRU中查找是否有存放数据的空闲块。
(3)如果LRU中没有空闲块,则将LRU中的DIRTY数据块移入DIRTY LIST。
(4)如果DIRTY LIST越长,服务器进程将会通知DBWn进程将数据写入磁盘,刷新缓冲区。
(5)当LRU中有空闲块后,服务器进程从磁盘的数据文件中读取数据并存放到数据缓冲区。
2、LGWR进程
LGWR(日志写入)进程将日志数据从日志缓冲区写入磁盘日志文件组中。
数据库遵循 写日志优先 原则,即在写数据之前先写日志。
使用LGWR主要有以下几种情况:
(1)当用户进程提交事务。
(2)每隔3s。
(3)当日志缓冲区使用达到1/3。
(4)当DBWn为检查点进程清除缓冲区。
3、CPKT进程
CPKT(检查点或检验点)进程,一般在发生日志切换时自动产生,用于向DBWn改善将数据缓冲区里的脏数据写回数据文件的信号,然后再更新控制文件和数据文件的标题信息,从而反映最近成功能 SCN(System Change Number,系统更改号)。
检查点出现在以下情况:
(1)在每个日志切换时产生。
(2)上一个检查点之后又经过了指定时间。
(3)从上一个检查点之后,当预定义数量的日志块被写入磁盘之后。
(4)数据库关闭。
(5)当表空间设置为OFFLINE时。
检查点频繁出现、日志频繁切换或数据库有很多数据文件时,该进程可以减少LGWR的工作量。在初始化参数中 LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT 用来改变检查点出现的频率。多检查点虽然能使LGWR进程工作量下降,但是过多的检查点会导致系统处理时间和I/O时间浪费在不必要的开户和关闭检查点的执行上。
4、SMON进程
SMON(系统监控)进程的主要功能如下:
(1)执行实例恢复,当数据库不正常中断后再度开启时,SMON会自动执行该项,也就是将在线重做日志中的数据写到数据文件中。
(2)收集空间,将表空间内相邻的空间进行合并,但该表空间必须是数据库字典管理模式。
5、PMON进程
PMON(进程监控)进程主要用于清除失效的用户进程,用户进程出现故障时执行进程恢复操作,负责清理内存存储区和释放该进程所使用的资源。
PMON进程周期性检查调度进程和服务进程的状态,如果发现进程已死,则重新启动它。PMON同样也注册关于实例和调度进程用于网络监听的信息。如果这个进程在数据库系统实例启动时出现故障,那么数据库系统也将无法开始工作。
PMON进程负责进行如下清理工作:
(1)回滚用户当前的事务。
(2)释放用户所加的所有表一级和行一级的锁。
(3)释放用户的SGA资源及其他资源。
6、ARCn进程
ARCn(归档)进程,用于将写满的日志文件复制到归档日志文件中,防止日志文件组中的日志信息由于日志文件组的循环使用而被覆盖。
个数由 log_archive_max_processes 决定。
数据字典
数据字典是由Oracle自动创建并更新的一组表。数据字典的所有者为SYS用户,而数据字典表和数据字典视图都被保存在system表空间中。
1、静态数据字典
静态数据字典主要是在用户访问数据字典时不会发生改变的。
这类数据字典主要是由表和视图组成,应该注意的是,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,它们分别由三个前缀构成: user_、all_、dba_*。
(1)user_:该视图存储了关于当前用户所拥有的对象的信息(即所有在该用户模式下的对象)。
(2)all_:该视图存储了当前用户能够访问的对象的信息(与user_*相比,all_并不需要拥有该对象,只需要具有访问该对象的权限即可)。
(3)dba_:该视图存储了数据库中所有对象的信息(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)。
数据字典里的所有对象均为大写形式。而PL/SQL里不是大小写敏感的。
2、动态数据字典
动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内存信息,所以在访问这类数据字典时往往不是一成不变的。
Oracle中动态性能视图都是以v$开关的视图。
常用数据字典
1、基本数据字典
字典名称 | 说明 |
---|---|
dba_tables | 所有用户的所有表的信息 |
dba_tab_columns | 所有用户的表的字段信息 |
dba_views | 所有用户的所有视图信息 |
dba_synonyms | 所有用户的同义词信息 |
dba_sequences | 所有用户的序列信息 |
dba_constraints | 所有用户的表的约束信息 |
dba_indexes | 所有用户的表的索引简要信息 |
dba_ind_columns | 所有用户的索引的字段信息 |
dba_triggers | 所有用户的触发器信息 |
dba_sources | 所有用户的存储过程信息 |
dba_segments | 所有用户的段的使用空间信息 |
dba_extends | 所有用户的段的扩展信息 |
dba_objects | 所有用户对象的基本信息 |
dba_users | 所有数据库用户的详细信息 |
tab | 当前用户创建的所有基表、视图和同义词等 |
dict | 构成数据字典的所有表信息 |
2、数据库组件相关的数据字典
数据库组件 | 数据字典中的表或视图 | 说明 |
---|---|---|
数据库 | v$datafile | 记录系统的运行情况 |
表空间 | dba_tablespaces | 记录系统表空间的基本信息 |
表空间 | dba_free_space | 记录系统表空间的空闲空间的信息 |
控制文件 | v$controlfile | 记录系统控制文件的基本信息 |
控制文件 | v$controlfile_record_section | 记录系统控制文件中记录文档段的信息 |
控制文件 | v$parameter | 记录系统各参数的基本信息 |
数据文件 | dba_data_files | 记录系统数据文件以及表空间的基本信息 |
数据文件 | v$filestat | 记录来自控制文件的数据文件信息 |
数据文件 | v$datafile_header | 记录数据文件头部分的基本信息 |
段 | dba_segments | 记录段的基本信息 |
数据区 | dba_extends | 记录数据区的基本信息 |
日志 | v$thread | 记录日志线程的基本信息 |
日志 | v$log | 记录日志文件的基本信息 |
日志 | v$logfile | 记录日志文件的概要信息 |
归档 | v$archived_log | 记录归档日志文件的基本信息 |
归档 | v$archive_dest | 记录归档日志文件的路径信息 |
数据库实例 | v$instance | 记录实例的基本信息 |
数据库实例 | v$system_parameter | 记录实例当前有效的参数信息 |
内存结构 | v$sga | 记录SGA区的大小信息 |
内存结构 | v$sgastat | 记录SGA的使用统计信息 |
内存结构 | v$sql | 记录SQL语句的详细信息 |
内存结构 | v$sqltext | 记录SQl语句的语句信息 |
内存结构 | v$sqlarea | 记录SQL区的SQL基本信息 |
后台进程 | v$bgprocess | 显示后台进程信息 |
后台进程 | v$session | 显示当前会话信息 |
3、动态性能视图
视图名称 | 说明 |
---|---|
v$fixed_table | 显示当前发行的固定对象的说明 |
v$instance | 显示当前实例的信息 |
v$latch | 显示锁存器的统计数据 |
v$librarycache | 显示有关库缓存性能的统计数据 |
v$rollstat | 显示联机的回滚段的名字 |
v$rowcache | 显示活动数据字典的统计 |
v$sga | 显示有关系统全局区的总结信息 |
v$sgastat | 显示有关系统合成区的详细信息 |
v$sort_usage | 显示临时段的大小及会话 |
v$sqlarea | 显示SQL区的SQL信息 |
v$sqltext | 显示在SGA中属于共享游标的SQL语句内容 |
v$stsstat | 显示基本的实例统计数据 |
v$system_event | 显示一个事件的总计等待时间 |
v$waitstat | 显示块竞争统计数据 |