Oracle实用教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 Oracle数据库基本概念

Oracle是一种关系数据库管理系统(RDBMS)。关系数据库是按照二维表结构方式组织的数据集合,每个表体现了集合理论中定义的数学概念——关系。在创建数据库之前,理解Oracle数据库的基本概念很重要。

Oracle数据库(Database)是一个数据容器,它包含了表、索引、视图、过程、函数、包等对象,并对其进行统一的管理。用户只有和一个确定的数据库连接,才能使用和管理该数据库中的数据。

下面将分别从数据库的内部结构与外部结构两个角度来探讨数据库。简单地说,内部结构描述了Oracle数据库的内部存储结构,即从技术概念上描述如何组织、管理数据。内部结构包括表空间、表、列、分区、用户、索引、视图、权限、角色、段、盘区、块等。而外部结构则是从“操作系统”角度来看,Oracle 11g数据库的实体构成项目,包括数据文件、重做日志文件和控制文件等。

2.1.1 内部结构

1.表空间(TABLESPACE)

表空间是数据库的逻辑划分,一个表空间只属于一个数据库。每个表空间由一个或多个数据文件组成,表空间中其他逻辑结构的数据存储在这些数据文件中。一般Oracle系统完成安装后,会自动建立多个表空间。以下介绍Oracle 11g默认创建的主要表空间。

(1)EXAMPLE表空间。EXAMPLE表空间是示例表空间,用于存放示例数据库的方案对象信息及其培训资料。

(2)SYSTEM表空间。SYSTEM表空间是系统表空间,用于存放Oracle系统内部表和数据字典的数据,如表名、列名和用户名等。一般不赞成将用户创建的表、索引等存放在SYSTEM表空间中。

(3)SYSAUX表空间。SYSAUX表空间是辅助系统表空间,主要存放Oracle系统内部的常用样例用户的对象,如存放CMR用户的表和索引等,从而减少系统表空间的负荷。SYSAUX表空间一般不存储用户的数据,由Oracle系统内部自动维护。

(4)TEMP表空间。TEMP表空间是临时表空间,存放临时表和临时数据,用于排序和汇总等。

(5)UNDOTBS1表空间。UNDOTBSI表空间是重做表空间,存放数据库中有关重做的相关信息和数据。当用户对数据库表进行修改(包括INSERT、UPDATE和DELETE操作)时,Oracle系统自动使用重做表空间来临时存放修改前的数据。当所作的修改完成并提交后,系统根据需要保留修改前数据的时间长短来释放重做表空间的部分空间。

(6)USERS表空间。USERS表空间是用户表空间,存放永久性用户对象的数据和私有信息,因此也被称为数据表空间。每个数据库都应该有一个用户表空间,以便在创建用户时将其分配给用户。

除了Oracle系统默认创建的表空间以外,用户可以根据应用系统的规模及其所要存放对象的情况创建多个表空间,以区分用户数据和系统数据。

2.表(TABLE)

表是数据库中存放用户数据的对象。它包含一组固定的列。表中的列描述该表所跟踪的实体的属性,每个列都有一个名字和若干个属性。表结构的一个样例如图2.1所示。

图2.1 表结构样例

3.约束条件(CONSTRAINT)

可以为一个表列创建约束条件。此时,表中的每一行都必须满足约束条件定义所规定的条件。约束条件有以下5种。

(1)主键(PRIMARY KEY)。主键是表中的一列或多个列。为表定义主键有如下几个作用:主键包含的列不能输入重复的值,以此来保证一个表的所有行的唯一性;主键也不允许定义此约束的列为NULL值;主键在定义此约束的列中创建了唯一性的索引,利用这个索引可更快地检索表中的行。

(2)默认(DEFAULT)约束条件。在表中插入一行数据但没有为列指定值时生成一个在定义表时预先指定的值。

(3)检查(CHECK)约束条件。检查约束条件确保指定列中的值符合一定的条件。CHECK列约束条件不能引用一个独立表。非空值约束条件被数据库看做一个CHECK约束条件。

(4)唯一性(UNIQUE)约束条件。唯一性约束条件用于保证应具有唯一性而又不是主键的一部分的那些列的唯一性。

(5)外键(FOREIGN KEY)约束条件。外键约束条件规定表间的关系性质。一个外键使一个表的一列或多列与已定义为主键的表中的一批相同的列相关联。当在已定义主键约束的表中更新列值时,其他表中定义有外键约束的列会被自动更新。

主键约束和外键约束保证关联表的相应行持续匹配,以至于它们可以用在后面的关系连接中。在它们被定义为主键约束和外键约束后,不同表的相应列会自动更新,称为引用完整性声明。

数据库的约束条件有助于确保数据的引用完整性。引用完整性保证数据库中的所有列引用都有效且全部约束条件都得到满足。

4.分区(PARTITION)

在非常大的数据库中,可以通过把一个大表的数据分成多个小表来简化数据库的管理,这些小表称做分区。除了对表分区外,还可以对索引进行分区。分区不仅简化了数据库的管理还改善了其应用性能。在Oracle中,能够细分分区,创建子分区。例如,可以根据一组值分割一个表,然后再根据另一种分割方法分割分区。

5.索引(INDEX)

在关系数据库表中,一个行数据的物理位置无关紧要。为了能够找到数据,表中的每一行都用一个RowID来标识。RowID告诉数据库这一行的准确位置,包括所在的文件、该文件中的块和该块中行地址。

索引是帮助用户在表中快速地找到记录的数据库结构。它既可以提高数据库性能,又能够保证列值的唯一性。当CREATE TABLE命令中规定有UNIQUE或PRIMARY KEY约束条件子句时,Oracle就会自动创建一个索引。也可以通过CREATE INDEX命令来手工创建自己的索引。

6.用户(USER)

用户账号虽然不是数据库中的一个物理结构,但它与数据库中的对象有着重要的关系,这是因为用户拥有数据库的对象。例如,用户SYS拥有数据字典表,这些表中存储了数据库中其他对象的所有信息;用户SYSTEM拥有访问数据字典表的视图,这些视图供数据库其他用户使用。

为数据库创建对象(例如表)必须在用户账号下进行。可以对每一个用户账号进行自定义,以便将一个特定的表空间作为它的默认表空间。

把操作系统的账号和数据库账号联系在一起,这样可以不必既输入操作系统口令,又输入数据库的口令。

7.方案(SCHEMA)

用户账号拥有的对象集称为用户的方案(SCHEMA),可以创建不能注册到数据库的用户账号。这样的用户账号提供一种方案,这种方案可以用来保存一组其他用户方案分开的数据库对象。

8.同义词

为了给不同的用户使用数据库对象时提供一个简单的、唯一标识数据库对象的名称,可以为数据库对象创建同义词。同义词有公用同义词和私有同义词两种。

9.权限及角色(ROLE)

为了访问其他账号所有的对象,必须首先被授予访问这个对象的权限。权限可以授予某个用户或PUBLIC,PUBLIC把权限授予数据库中的全体用户。

可以创建角色即权限组来简化权限的管理。可以把一些权限授予一个角色,而这个角色又可以被授予多个用户。在应用程序中角色可以被动态地启用或禁用。

10.段(SEGMENT)、盘区(EXTENT)和数据块(DATA BLOCK)

依照不同的数据处理性质,可能需要在数据表空间内划分出不同区域,以存放不同数据,将这些区域称之为“段”(SEGMENT)。例如,存放数据的区域称为“数据区段”、存放索引的区域称为“索引区段”。

由于段是一个物理实体,所以必须把它分配到数据库中的一个表空间中(放在表空间的一个数据文件中)。而段其实就是由许多盘区组合而成的。当段中的空间用完时,该段就获取另外的盘区。

数据块是最小的储存单元,Oracle数据库是操作系统块的倍数。图2.2说明了段、盘区和数据块之间的关系。

图2.2 段、盘区和数据块之间的关系

2.1.2 外部结构

1.数据文件(DATAFILE)

每一个Oracle数据库都有一个或多个数据文件,而一个数据文件只能属于一个表空间。数据文件创建后可改变大小,创建新的表空间需要创建新的数据文件。数据文件一旦加入到表空间,就不能从这个表空间中移走,也不能和其他表空间发生联系。

如果数据库对象存储在多个表空间中,可以通过把它们各自的数据文件存放在不同的磁盘上来对其进行物理分割。数据库、表空间和数据文件之间的关系如图2.3所示。

图2.3 数据库、表空间和数据文件之间的关系

2.重做日志文件(REDO LOG FILES)

除了数据文件外,最重要的Oracle数据库实体档案就是重做日志文件(Redo Log Files)。Oracle保存所有数据库事务的日志。这些事务被记录在联机重做日志文件(Online Redo Log File)中。当数据库中的数据遭到破坏时,可以用这些日志来恢复数据库。

一个数据库至少需要两个重做日志文件。Oracle以循环方式向重做日志文件写入。第一个日志被填满后,就向第二个日志文件写入,然后依次类推。当所有日志文件都被写满时,就又回到第一个日志文件,用新事务的数据对其进行重写。

3.控制文件(CONTROL FILES)

每个Oracle数据库都有一个控制文件,用以记录与描述数据库的外部结构。它们包括:

(1)Oracle数据库名称与建立时间;

(2)数据文件与重置日志文件名称及其所在位置;

(3)日志记录序列码(log sequence number)。

每当数据库被激活时,Oracle会在实例激活后立刻读取控制文件内容,待所有数据库外部结构文件所在信息都收集完毕,数据库才会启动。为了避免控制文件毁损导致数据库系统停止,建议用户至少配置两个控制文件,并存放在不同的硬盘上。

2.1.3 实例

数据库实例(instance)也称作服务器(server),是指用来访问数据库文件集的存储结构(系统全局区,System Global Area,简称SGA)及后台进程的集合。一个数据库可以被多个实例访问,这是Oracle的并行服务器选项。实例与数据库之间的关系如图2.4所示。

图2.4 实例与数据库之间的关系

每当启动数据库时,系统全局区首先被分配,并且有一个或多个Oracle进程被启动。一个实例的SGA和进程为管理数据库数据和为该数据库一个或多个用户服务而工作。在Oracle系统中,首先启动实例,然后由实例装配数据库。

1.系统全局区

当激活Oracle数据库时,系统会先在内存内规划一个固定区域,用来存储每位使用者所需存取的数据以及Oracle运作时必备的系统信息。这个区域就称为系统全局区(SGA)。

SGA又包含数个重要区域,分别是数据块缓存区(Data Block Buffer Cache)、字典缓存区(Dictionary Cache)、重做日志缓冲区(Redo Log Buffer)和共享池(Shared SQL Pool)。图2.5给出了SGA各重要区域之间的关系。

图2.5 SGA各重要区域之间的关系

(1)数据块缓存区。数据块缓存区为SGA的主要成员,用来存放读取自数据文件的数据块复本,或是使用者曾经处理过的数据。其用途在于有效减少存取数据时造成的磁盘读/写动作,进而提升数据存取的效率。数据块缓存区的大小由初始化参数DB_BLOCK_BUFFERS决定。数据块缓存区的大小是固定的,它不可能一次装载所有的数据库的内容。通常,数据块缓存区大小只有数据库大小的1%~2%,Oracle使用最近最少使用算法(LRU)来管理可用空间。当存储区需要自由空间时,最近最少使用的块将被移出,释放的存储区空间被新调入的数据块占用。这种算法能够让最频繁使用的数据保留在存储区中。

(2)字典缓存区。数据库对象的信息存储在数据字典中,这些信息包括用户账号、数据文件名、盘区位置、表说明和权限等。当数据库需要这些信息时,如要验证用户账号时,就要读取数据字典,从中获得需要的信息数据,并且将这些数据存储在SGA的字典缓存区中。

数据字典缓存区也是通过LRU算法来管理的。字典缓存区的大小由数据库内部管理。字典缓存区是SQL共享池的一部分,共享池的大小由SHARED_POOL_SIZE参数设置。

字典缓存区的大小会影响到数据库查询的速度。如果字典缓存区太小,数据库就不得不重复访问数据字典以获得数据库所需的信息,查询速度会大幅降低。

(3)重做日志缓冲区。前面已介绍过,联机重做日志文件用于记录数据库的更改,以便在数据库恢复过程中用于向前滚动。但这些修改并不是马上写入日志文件中的,在被写入联机重做日志文件中之前,事务首先被记录在称做重做日志缓冲区的SGA中。数据库可以周期性地分批向联机重做日志文件中写入修改的内容,从而优化这个操作。

(4)SQL共享池。SQL共享池存储数据字典缓存区及库缓存区(Library Cache),即对数据库进行操作的语句信息。当使用者将SQL指令送至Oracle数据库后,系统将会先解析语法是否正确。解析时所需要的系统信息,以及解析后的结果将放置在共享区内。如果不同的使用者执行了相同的SQL指令,就可以共享已解析的结果,加速SQL指令的执行速度。SQL共享池的大小由参数SHARED_POOL_SIZE决定。

2.后台进程

数据库的物理结构和存储结构之间的关系是由后台进程来维持的。数据库拥有多个后台进程,其数量取决于数据库的配置。这些进程由数据库管理,它们只需要进行很少的管理。每个进程在数据库中执行不同的任务。图2.6显示了后台进程在数据库外部结构、SGA中作用和地位。下面介绍几个常用的后台进程。

图2.6 后台进程在数据库外部结构、SGA中的作用和地位

(1)DBWR(数据库写入进程)。负责将数据块缓存区内变动过的数据块回写至硬盘内的数据文件。Oracle系统预设激活一个DBWR处理程序,但在大型数据库系统下,数据库变动情况可能十分频繁,可依实际需求额外配置其他的DBWR。

(2)LGWR(日志写入进程)。负责将重做日志缓冲区内的数据变动记录循序写入重做日志文件。重做日志缓冲区条目总是包含着数据库的最新状态,因为DBWR进程可以一直等待到数据块缓冲区中的修改数据块写入到数据文件中。

(3)SMON(系统监控进程)。如果因为停电或其他因素导致Oracle数据库不正常关闭,下一次激活数据库时将由SMON进行必要的数据库修复动作。

(4)PMON(进程监控进程)。当某个处理程序异常终止时,PMON清除数据块缓存区内不再使用的空间,并释放该程序之前使用的系统资源。PMON也会定期检查各服务器处理程序以及分配器的状态,如果某个处理程序因故停摆,也是由PMON负责将它重新激活。

(5)CKPT(检查点进程)。检查点是指一个事件或指定的时间。在适当时候产生一个检查点时,CKPT确保缓冲区内经常变动的数据定期被写入数据文件。在检查点之后,因为所有更新过的数据已经回写至磁盘数据文件,万一需要进行实例恢复时,就不再需要检查点之前的重置记录,这样,可缩短数据库重新激活的时间。检查点发生后,CKPT会先通知DBWR将数据块缓存区的改动数据回写到数据文件,然后更新数据文件与控制文件的检查点信息。

(6)RECO(恢复进程)。该进程是在具有分布式选项时所使用的一个进程,用于自动解决在分布式事务中的故障。在Oracle 11g分布式数据库环境中,RECO进程会自动处理分布式操作失败时产生的问题。所谓分布式操作,简单地说,就是针对多个数据库同时进行数据处理动作。

(7)ARCH(归档进程)。LGWR后台进程以循环方式向重做日志文件写入。当Oracle以ARCHIVELOG模式运行时,数据库在开始重写重做日志文件之前先对其进行备份。可以将这些归档文件写入磁盘设备或直接写入磁带设备。这些归档功能由ARCH后台完成。

(8)LCKn(锁进程)。在Oracle并行服务器环境中,为了避免进程间在数据存取时发生冲突,在一个数据库实例访问一个数据库对象时,LCKn进程自动封锁它所访问的数据库对象,访问结束之后再解锁。

(9)Dnnn(调度进程)。调度进程允许用户共享有限的服务器进程,该进程接收用户进程的要求,并将它们放入请求队列中,然后为请求队列中的用户进程分配一个共享的服务器进程。一个数据库实例可以建立多个调度进程。

除了以上几个重要的后台进程之外,Oracle 11g数据库运作时还有其他的后台进程互相配合运作。