【收藏整理】Oracle数据库体系架构

来源:互联网 发布:红色经典知多少手抄报 编辑:程序博客网 时间:2024/06/11 01:42

 原文见http://blog.csdn.net/kele1121/archive/2009/10/30/4742051.aspx与http://www.itpub.net/thread-1105403-1-1.html


 所谓Oracle的体系架构,是指Oracle数据库管理系统的的组成部分和这些组成部分之间的相互关系,包括内存结构、后台进程、物理与逻辑结构等。Oracle数据库的体系很复杂,复杂的原因在于它最大限度的节约内存,从上图可以看出,它在整体上分实例和数据库文件两部分。

 

1)首先区分一下数据库的实例(Instance)和数据库两个概念:

l        ORACLE实例 = 进程 + 进程所使用的内存(SGA),实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态!

l        数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件,数据库是永久的,是一个文件的集合。

ORACLE实例和数据库之间的关系

1.      临时性(instance)和永久性(数据库)

2.      实例(instance)可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义

3.      一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库

4.      一个数据库可被许多实例同时装载和打开(RAC)RAC环境中实例的作用能够得到充分的体现!

下面对实例和数据库做详细的诠释:

Oracle领域中有两个词很容易混淆,这就是实例instance)和数据库database)。作为Oracle术语,这两个词的定义如下:

数据库database):物理操作系统文件或磁盘disk)的集合。使用Oracle 10g的自动存储管理(Automatic Storage ManagementASM)或RAW分区时,数据库可能不作为操作系统中单独的文件,但定义仍然不变。

实例instance):一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。也许实例不能算是世界上最有用的事物,不过你完全可以把它想成是最有用的事物,这有助于对实例数据库划清界线。

这两个词有时可互换使用,不过二者的概念完全不同。实例和数据库之间的关系是:数据库可以由多个实例装载打开,而实例可以在任何时间点装载打开一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!稍后就会介绍这样的一个例子。

是不是更糊涂了?我们还会做进一步的解释,应该能帮助你搞清楚这些概念。实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,Oracle真正应用集群Real Application ClustersRAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。Oracle RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。

下面来看一个简单的例子。假设我们刚安装了Oracle 10g10.1.0.3。我们执行一个纯软件安装,不包括初始的启动数据库,除了软件以外什么都没有。通过pwd命令可以知道当前的工作目录(这个例子使用一个Linux平台的计算机)。我们的当前目录是dbs(如果在Windows平台上,则是database目录)。执行ls–l命令显示出这个目录为。其中没有init.ora 文件,也没有任何存储参数文件stored parameter fileSPFILE);

使用ps(进程状态)命令,可以看到用户ora10g运行的所有进程,这里假设ora10gOracle软件的所有者。此时还没有任何Oracle数据库进程。 

然后使用ipcs命令,这个UNIX命令可用于显示进程间的通信设备,如共享内存、信号量等。目前系统中没有使用任何通信设备。

然后启动SQL*PlusOracle的命令行界面),并作为SYSDBA连接(SYSDBA账户可以在数据库中做任何事情)。连接成功后,SQL*Plus报告称我们连上了一个空闲的实例:

我们的实例现在只包括一个Oracle服务器进程,见以下输出中粗体显示的部分。此时还没有分配共享内存,也没有其他进程。

现在来启动实例:

这里提示的文件就是启动实例时必须要有的一个文件,我们需要有一个参数文件(一种简单的平面文件,后面还会详细说明),或者要有一个存储参数文件。现在就来创建参数文件,并放入启动数据库实例所需的最少信息(通常还会指定更多的参数,如数据库块大小、控制文件位置,等等)。

然后再回到SQL*Plus

这里对startup命令加了nomount选项,因为我们现在还不想真正装载数据库(要了解启动和关闭的所有选项,请参见SQL*Plus文档)。

注意

Windows上运行startup命令之前,还需要使用oradim.exe实用程序执行一条服务创建语句。

现在就有了所谓的实例。运行数据库所需的后台进程都有了,如进程监视器(processmonitorPMON)、日志写入器(log writerLGWR)等,这些进程将在第5章详细介绍。

再使用ipcs命令,它会首次报告指出使用了共享内存和信号量,这是UNIX上的两个重要的进程间通信设备:

注意,我们还没有数据库呢!此时,只有数据库之名(在所创建的参数文件中),而没有数据库之实。如果试图装载这个数据库,就会失败,因为数据库根本就不存在。下面就来创建数据库。有人说创建一个Oracle数据库步骤很繁琐,真是这样吗?我们来看看:

这里创建数据库就是这么简单。但在实际中,也许要使用一个稍有些复杂的CREATE DATABASE命令,因为可能需要告诉Oracle把日志文件、数据文件、控制文件等放在哪里。不过,我们现在已经有了一个完全可操作的数据库了。可能还需要运行$ORACLE_HOME/rdbms/admin/ catalog.sql脚本和其他编录脚本(catalog script)来建立我们每天使用的数据字典(这个数据库中还没有我们使用的某些视图,如ALL_OBJECTS),但不管怎么说,数据库已经有了。可以简单地查询一些Oracle V$视图(具体就是V$DATAFILEV$LOGFILEV$CONTROLFILE),列出构成这个数据库的文件:

Oracle使用默认设置,把所有内容都放在一起,并把数据库创建为一组持久的文件。如果关闭这个数据库,再试图打开,就会发现数据库无法打开:

一个实例在其生存期中最多只能装载和打开一个数据库。要想再打开这个(或其他)数据库,必须先丢弃这个实例,并创建一个新的实例。

重申一遍:

l        实例是一组后台进程和共享内存。

l        数据库是磁盘上存储的数据集合。

l        实例一生只能装载并打开一个数据库。

l        数据库可以由一个或多个实例(使用RAC)装载和打开。

前面提到过,大多数情况下,实例和数据库之间存在一种一对一的关系。可能正因如此,才导致人们很容易将二者混淆。从大多数人的经验看来,数据库就是实例,实例就是数据库。
不过,在许多测试环境中,情况并非如此。在我的磁盘上,可以有5个不同的数据库。测试主机上任意时间点只会运行一个Oracle实例,但是它访问的数据库每天都可能不同(甚至每小时都不同),这取决于我的需求。只需有不同的配置文件,我就能装载并打开其中任意一个数据库。在这种情况下,任何时刻我都只有一个实例,但有多个数据库,在任意时间点上只能访问其中的一个数据库。所以,你现在应该知道,如果有人谈到实例,他指的就是Oracle的进程和内存。提到数据库时,则是说保存数据的物理文件。可以从多个实例访问一个数据库,但是一个实例一次只能访问一个数据库。

2)其他概念:

区分了实例(instance)和数据库(Database)后,再看看其他概念:

1.表空间

Oracle数据库系统中,用于存放数据库表,索引,回滚段等对象的逻辑空间叫做表空间。

2.数据文件

数据文件是用于保存用户应用数据和Oracle系统内部数据的文件。由于Oracle数据库是由表空间组成。每个表空间可以含一个或多个数据文件。一般来说,可以在创建表空间时创建一个或多个数据文件,也可对已存在的表空间追加新的数据文件。数据文件包括系统数据,用户数据。

注意:

表空间是一个数据库的逻辑区

每个表空间由一个或多个数据文件组成。

一个数据文件只能属于一个表空间。

3.存储结构

当我们创建表空间时至少创建一个以上的数据文件,Oracle创建数据文件时实际上是将磁盘的操作系统块重新格式化Oracle数据块,并且每个Oracle数据块都有惟一的标识。一般Oracle数据块操作系统的倍数。从物理(Physical)上讲,我们可以在Oracle实例上创建多个表空间,每一个表空间由一个或多个数据文件(物理文件)组成;而数据文件由多个操作系统构成。

从逻辑(Logical)上讲,一般我们在设计数据库结构时需要将表,索引中簇存储到一个已存在的表空间上,而表,索引,簇都是占空间的对象,Oracle把占空间的对象统一为段(Segment),而段是由多个区间(Extend)构成,而区间则是由多个连续的Oracle数据块构成。数据块是一个基本的处理单位。Oracle实例有多个表空间,一个表空间有一到多个段,一个段有一个到多个区间,一个区间有一个到多个的数据块。

4.临时表空间与临时文件

临时表空间是Oracle用存放与排序有关表的特殊表空间。

5.控制文件

控制文件一个存储有Oracle实例信息,数据文件和日志文件等信息的二进制文件。控制文件一般在Oracle系统安装时自动创建,控制文件所存放的路径由服务器参数文件SPFILEsid.oracontrol_file参数值来确定。可以从数据字典查询控制文件的信息:

select * from v$controlfile;

6.重做日志文件与归档日志文件

这两个日志文件是Oracle系统的主要文件之一,特别是日志文件是Oracle数据库系统工作必需的文件夹。数据库运行时,用户发出commit命令时,数据库会将每笔的交易信息记录到日志文件中,在写入日志文件成功后才把完成信息传给用户程序,所以在日志文件上可以随时读出信息以恢复某些交易数据。