第三章 Oracle体系结构

  Oracle体系结构 主要用来分析数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。Oracle数据库是一个逻辑概念,而不是物理概念上安装了Oracle数据库管理系统的服务器。

  在Oracle数据库管理系统中有3个重要的概念需要理解,那就是实例(Instance)、数据库(Database)和数据库服务器(Database Server)。其中,实例是指一组Oracle后台进程以及在服务器中分配的共享内存区域;数据库是由基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合;数据库服务器是指管理数据库的各种软件工具(比如,sqlplus、OEM等)和实例及数据库三个部分。从实例与数据库之间的辩证关系来讲,实例用于管理和控制数据库;而数据库为实例提供数据。一个数据库可以被多个实例装载和打开;而一个实例在其生存期内只能装载和打开一个数据库。

逻辑存储结构

  Oracle的逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。

   从上图可以看到,Oracle数据库由多个表空间组成(数据库自身也属于逻辑概念),而表空间又由多个段组成,段由多个数据区组成,数据区又由多个数据块组成。

数据块

  数据块是Oracle逻辑存储结构中最小的逻辑单位,也是执行数据库输入输出操作的最小存储单位。数据块中可以存放表数据、索引数据和簇数据,无论存放那种类型的数据,其结构都是相同的。数据块有数据头、表目录、行目录、空余空间和行数据组成。

   块头、表目录、行目录三部分为头部信息区,头部信息区不存放数据,它存放整个块的引导信息,引导系统读取系统数据。若头部信息遭到破坏,则Oracle系统将无法读取此数据块数据。空余空间和行数据共同构成块的存储区,用于存储数据记录。

头部信息区:

  块头存放块的基本信息,块的物理地址、所属段的类型等;表目录存放表相关的信息;行目录存放行信息。

存储区:

  空余空间是一块未被使用的区域,该区域用于新行的插入以及已经存在的行的更新;行数据用于存放表数据和索引数据。

通过v$parameter数据字典来查询Oracle标准数据块的大小:

 col name format a30
 col value format a20
 select name,value from v$parameter where name = 'db_block_size' ;

数据区(Extent)

  数据区(也可称作数据扩展区)是由一组连续的Oracle数据块所构成的Oracle存储结构,一个或多个数据块组成一个数据区,一个或多个数据区再组成一个段(Segment)。当一个段中的所有空间被使用完后,Oracle系统将自动为该段分配一个新的数据区,这也正符合Extent这个单词所具有的“扩展”的含义,可见数据区是Oracle存储分配的最小单位,Oracle就以数据区为单位进行存储空间的扩展。

  使用数据区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配存储空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

段(Segment)

  段由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,它用于存储表、索引或簇等占用空间的数据对象,Oracle也把这种占用空间的数据对象统一称为段。一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时,Oracle将为它创建一个段。

  段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。段内包含的数据区可以不连续,而且可以跨越多个文件,使用段的目的是用来保存特定对象。一个Oracle数据库通常有四种类型的段。

  1. 数据段:数据段中保存的是表中的数据记录。在创建数据表时,Oracle系统将为表创建数据段。当表中的数据量增大时,数据段的大小自然也随着变大,数据的增大过程是通过向其添加新的数据区来实现的。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
  2. 索引段:索引段中包含用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
  3. 回滚段:也叫撤销段,回滚段保存了回滚条目,Oracle将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。
  4. 临时段:当执行创建索引、查询等操作时,Oracle可能会使用一些临时存储空间,用于暂时性的保存解析过的查询语句以及在排序过程中产生的临时数据。Oracle系统将在专门用于存储临时数据的表空间中为操作分配临时段。

  注:在执行“create index”、“select order by”、“select distinct”和“select group by”等几种类型的sql语句时,Oracle系统就会在临时表空间中为这些语句的操作分配一个临时段。

表空间(TableSpace)

  Oracle使用表空间将相关的逻辑结构(如段、数据区)组合在一起,表空间是数据库最大的逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象,任何数据对象在创建时都必须被指定存储在某个表空间中。表空间(属逻辑存储结构)与数据文件(属物理存储结构)相对应,一个表空间由一个或多个数据文件组成,一个数据文件只能属于一个表空间;Oracle数据的存储空间在逻辑上表现为表空间,而在物理上表现为数据文件。表空间类似于操作系统中的文件夹,而数据文件就相当于文件夹中的文件。每个数据库至少有一个表空间(SYSTEM表空间),表空间的大小等于所有从属于它的数据文件大小的总和。

  在创建数据库时,Oracle会自动创建多个默认的表空间,这些表空间除了管理用于管理用户数据的表空间之外,还包括用于管理Oracle系统内部数据的表空间。Oracle11g默认创建的主要表空间:

  SYSTEM表空间:存放Oracle系统内部表和数据字典的数据。Oracle本身不赞成将用户创建的表、索引等存放到系统表空间。表空间中的数据文件不是固定不变的,可以根据需要向表空间中追加新的数据文件。

  SYSAUX表空间:此表空间是Oracle 11g新增的表空间,是随着数据库的创建而创建,它充当SYSTEM的辅助表空间,降低SYSTEM表空间的负荷,主要存储数据字典以外的其他数据对象。此表空间一般不存储用户数据,由Oracle系统内部自动维护。

  UNDO表空间:撤销表空间,用于存储撤销信息的表空间。

  USERS表空间:用户表空间,Oracle建议用户使用的表空间,可以在这个表空间上创建各种数据对象(创建表、索引、用户等数据对象)。(除了Oracle系统默认创建的表空间外,用户可以根据应用系统的实际情况及其所要存放的对象类型创建多个自定义的表空间,以区分用户数据与系统数据。不同的数据应存放在不同的表空间,而不同的表空间的文件应该存放在不同的盘上,从而减少IO冲突,提高应用系统的操作性能)

物理存储结构

  物理存储结构描述了Oracle数据库中数据在操作系统中的组织和管理,它是指存储在磁盘上的物理文件,包括数据文件、控制文件、重做日志文件、初始化参数文件、跟踪文件、归档文件等。

  

  数据文件

  数据文件是用于保存用户应用程序数据和Oracle系统内部数据的文件,这些文件在操作系统中就是普通的操作系统文件,Oracle在创建表空间的同时会创建数据文件。Oracle数据库在逻辑上由表空间组成,每个表空间可以包含一个或多个数据文件,一个数据文件只能隶属于一个表空间。

通过查询dba_data_files或v$datafile数据字典来了解Oracle系统的数据文件信息:

col file_name for a50;
set linesize 100;
select file_name,tablespace_name from dba_data_files;
--临时文件信息
select file_name,tablespace_name from dba_temp_files;

  控制文件

  控制文件是一个二进制文件,它记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库建立日期等信息。控制文件一般在Oracle系统安装时或创建数据库时自动创建,控制文件所存放的路径由服务器参数文件spfileorcl.ora的control_files参数值来指定。

      由于控制文件存放有数据文件、日志文件等的相关信息,因此,Oracle实例在启动时必须访问控制文件。如果控制文件正常,实例才能加载并打开数据库;但若控制文件中记录了错误的信息,或者实例无法找到一个可用的控制文件,则实例无法正常启动。

-- 通过查询v$controlfile视图查看Oracle系统的控制文件信息
SELECT NAME FROM V$CONTROLFILE;

  日志文件

  日志文件的主要功能是记录对数据所作的修改,对数据库所作的修改几乎都记录在日志文件中。在出现问题时,可以通过日志文件得到原始数据,从而保障不丢失已有操作成果。Oracle的日志文件包括重做日志文件(Redo Log File)和归档日志文件(Archive Log File),它们是Oracle系统的主要文件之一,尤其是重做日志文件,它是Oracle数据库系统正常运行所不可或缺的。

  • 重做日志文件:用于记录数据库所有发生过的更改信息(修改、添加、删除等)及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息(方便数据库恢复)。
--通过v$logfile视图查询日志文件信息
SELECT MEMBER FROM V$LOGFILE;
  • 归档日志文件:用于保存已经写满的重做日志文件

    Oracle数据库可以运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断的记录到日志文件组中,当所有重做日志组写满后,又重新从第一个日志组开始覆写。归档模式是在各个日志文件都被写满而即将被覆盖之前,先由归档进程(ARCH)将即将被覆写的日志文件中的日志信息读出并写入到归档日志文件中。这个过程称之为归档操作。

    在归档操作的过程中,日志写入进程(LGCH)需要等待归档进程(ARCH)的结束才能开始覆写日志文件,这样就延迟了系统响应时间,而且归档日志文件本身又会占用大量的磁盘空间,这些都会影响系统的整体性能。所以在默认情况下,Oracle系统不采用归档模式运行。

-- 是否采用归档模式
select dbid,name,log_mode from v$database;

  如果将Oracle设置在归档模式下运行,可以通过服务器参数文件的log_archive_dest参数来确定归档日志文件的所在路径

show parameter log_archive_dest;

  服务器参数文件

  服务器参数文件SPFILE(Server parameter File)是二进制文件,用来记录了Oracle数据库的基本参数信息(如,数据库名、控制文件所在路径、日志缓冲大小等)。数据库实例在启动之前,Oracle系统首先会读取SPFILE参数文件中设置的这些参数,并根据这些初始化参数来配置和启动实例。比如,设置标准数据块的大小(即参数db_block_size的值)、设置日志缓冲区的大小(即参数log_buffer的值)等等,所以SPFILE参数文件非常重要。服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid为所创建的数据库实例名。

      与早期版本的初始化参数文件INITsid.ora不同的是,SPFILE中的参数由Oracle系统自动维护,如果要对某些参数进行修改,则尽可能不要直接对SPFILE进行编辑,最好通过企业管理器(OEM)或ALTER SYSTEM命令来修改,所修改过的参数会自动写到SPFILE中。

1.查看服务器参数

--方式1:通过v$parameter视图查看
SELECT NAME,VALUE,ISMODIFIED FROM V$PARAMETER;

--方式2:
SHOW PARAMETER;

2.修改服务器参数

-- 方式1:通过企业管理器(OEM)修改

-- 方式2:使用ALTER SYSTEM语句
ALTER SYSTEM 参数名=参数值;

  密码文件、警告文件和跟踪文件

  Oracle系统运行时,除了必须的数据文件、控制文件、日志文件及服务器参数文件外,还需要一些辅助文件,如,密码文件、警告文件和跟踪文件(一般称之为外部文件)

Oracle服务器结构

  oracle服务器主要由实例、数据库、程序全局区和前台进程组成,如下图所示。其中实例就是图中Instance矩形区域,用来提供管理数据库的功能;数据库就是图中database区域,由oracle数据文件组成,用来存储系统数据

  实例可以进一步划分为系统全局区(SGA)和后台进程两部分,其中SGA使用操作系统的内存资源,而后台进程需要使用CPU与内存资源。程序全局区(PGA)是一个非共享的内存区域,用于管理用户进程私有资源。前台进程可以进一步划分为用户进程和服务器进程,它们需要使用CPU与内存资源。

系统全局区

  系统全局区(System Global Area)是所有用户进程共享的一块内存区域,也就是说,SGA中的数据资源可以被多个用户进程共同使用。SGA主要由高速数据缓冲区、共享池、重做日志缓存区、java池和大型池等内存结构组成。SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。

1、高速数据缓冲区(Database buffer cache)

2、重做日志缓冲区

3、共享池

4、大型池

5、java池

6、流池

程序全局区

  程序全局区(Program Global Area)也可称作用户进程全局区,它的内存区在进程私有区而不是共享区中。虽然PGA是一个全局区,可以把代码、全局变量和数据结构都可以存放在其中,但区域内的资源并不像SGA一样被所有的用户进程所共享,而是每个Oracle服务器进程都只拥有属于自己的那部分PGA资源。

  在程序全局区(PGA)中,一个服务进程只能访问属于它自己的那部分PGA资源区,各个服务进程的PGA区的总和即为实例的PGA区的大小。通常PGA区由私有SQL区和会话区组成。

前台进程

  1、用户进程

  用户进程是指那些能够产生或执行SQL语句的应用程序,无论是SQL*Plus,还是其它应用程序,只要是能生成或执行SQL语句,都被称作用户进程。

  用户进程中有两个非常重要的概念:连接和会话。连接时一个用户进程与实例之间建立的通信渠道,这个渠道可以通过操作系统上的相关通信机制或网络连接来实现。会话是指在用户进程与实例之间建立连接后形成的用户与实例之间的交互方式,一般是用户发出请求,数据库实例为用户返回响应消息的方式。

  2、服务器进程

  服务进程就是用于处理用户会话过程中向数据库实例发出的SQL语句或SQL*Plus命令,它可以分为专用服务器模式和共享服务器模式。

后台进程

  Oracle后台进程是一组运行于Oracle服务器端的后台程序,是Oracle实例的重要组成部分。进程包括DBWR、CKPT、LGWR、ARCH、SMON、PMON、LCKN、RECO、DNNN、SNPN。其中SMON、PMON、DBWR、LGWR和CKPT这5个后台进程必须正常启动,否则将导致数据库实例崩溃。此外,还有很多辅助进程,用于实现相关的辅助功能,如果这些辅助进程发生问题,只是某些功能受到影响,一般不会导致数据库实例崩溃。

 

数据字典

Oracle数据字典的名称由前缀和后缀组成,使用下划线“_”连接,其代表的含义如下:

  1. DBA_:包含数据库实例的所有对象信息。
  2. V$_:当前实例的动态视图,包含系统管理和系统优化等所使用的视图。
  3.  USER_:记录用户的对象信息。
  4. GV_:分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图。
  5.  ALL_:记录用户的对象信息机被授权访问的对象信息。

常用数据字典

数据字典名称 说明
dba_tablespaces 关于表空间的信息

dba_ts_quotas

所有用户表空间限额
dba_free_space 所有表空间中的自由分区
dba_segments 描述数据库中所有段的存储空间
dba_extents 数据库中所有分区的信息
dba_tables 数据库中所有数据表的描述
v$database 描述关于数据库的相关信息
v$datafile 数据库使用的数据文件信息
v$log 从控制文件中提取有关重做日志组的信息
v$logfile 有关实例重置日志组文件名及其位置的信息
posted @ 2020-05-12 14:32  Tiger-Adan  阅读(1359)  评论(0编辑  收藏  举报