Oracle Database 11g是一些特殊文件的集合,这些文件是用数据库配置助手创建的,然后用OEM Grid Control完成相关工作。这些数据库文件是通过一组共享内存进程来进行访问的,这组进程称为“实例”。
Oracle数据库组成
Oracle的控制文件是二进制文件,包含有关支持Oracle Database 11g的各种文件的信息。包含的信息描述了数据库文件的名称、位置和大小。
(1)物理组成
Oracle可以采用如下4种文件系统机制机制存储数据:
操作系统文件系统:宿主操作系统的文件系统。Oracle读写磁盘时,OS会缓存信息。
裸设备:原始磁盘,对数据没有任何缓冲,都是直接I/O。
自动存储管理(Automatic Storage Management, ASM):Oracle专门设计的一个数据库的文件系统,可用于单机和集群环境。
集群文件系统(Oracle Cluster File System,OCFS):专用于RAC(Real Application Cluster)环境。

以下的介绍均基于存储机制是宿主操作系统的文件系统的层面来介绍。
Oracle数据库涉及了如下几类文件:

 

参数文件
主要设置数据库的初始化参数,如控制文件的路径,内存结构的大小等。参数文件分遗留参数文件和服务器参数文件,我们比较关注的参数文件是spfile(server parameter file),它的命名方法为:spfile$ORACLE_SID.ora
跟踪文件
提供Oracle运行的调试信息。需要将参数文件里面的SQL_TRACE设置为TRUE。如果采用的是专用服务器,输出信息保存在user_dump_dest参数指定的路径。否则就是共享服务器模式,输出信息保存在background_dump_dest参数指定的路径。
警告文件
又称警告日志,就是数据库的日记。
数据文件
这个应该是数据库最重要的文件之一。保存八戒的个人数据。只从人间发生了陈冠希事件后,八戒将个人隐私数据都保存在数据中,需要密码才能访问。每个数据库的数据文件默认保存在$ORACLE_BASE/oradata/$ORACLE_SID目录下。
临时文件
临时文件是Oracle中一类特殊的数据文件。它被使用来存储大规模排序操作和散列操作的中间结果,如果RAM中没有足够的空间,它还会被用来存储全局临时表数据或结果集数据。永久数据(如表或索引)不会存储在临时文件中。
控制文件
参数文件文件告知控制文件的位置,控制文件则告知实例数据库和在线重做日志文件的位置等信息。里面涉及的两个文件就是数据库中最重要的两个东东了。
八戒又意外的发现它也是二进制文件。
重做日志文件
对于Oracle数据库至关重要。它们是数据库的事务日志。通常用于数据库恢复。它又分在线重做日志文件和归档重做日志文件。两者的关系后面的进程一节会有所涉及。
密码文件
它是一个可选的文件,允许远程sysdba或管理员访问数据库。
修改跟踪文件
跟踪自上一个增量备份以来哪些block已经修改。采用这样的方式,恢复管理工具(Recovery Manager, RMAN)就可以只备份确实有变化的数据库块,而不必读取整个数据库。
闪回日志文件
闪回日志文件(Flashback Log File)简称闪回日志。它包含已修改数据库的“前映像”,可用于将数据库返回到该时间点之前的状态。这有点类似于Windows的系统还原,Mac的Timer。
(2) 逻辑组成

 

Oracle数据库在逻辑上由表空间(tablespace),段(segment),区段(extent),块(block)分层组成。
Database
数据库由一个或多个表空间组成。
Tablesapce
表空间物理上由一个或多个数据文件组成。这些文件可以是文件系统中的文件、原始分区、ASM管理的数据库文件或集群文件系统上的文件。表空间逻辑上由至少一个段组成。
Segment
段就是占用存储空间的数据库对象,如表、索引、回滚段。创建表时,会创建一个表段。创建索引时,就会创建一个索引段。
段本身又由一个或多个区段组成,这些区段可以来自多个数据文件。段在表空间中,但是可以包含在这个表空间中的多个数据文件中的数据。
Extent
区段是数据文件中一个逻辑连续的块。一般来说,数据文件本身在磁盘上并不是连续的,甚至可能跨多个物理磁盘,如RAID。区段在一个表空间中,而且总是属于该表空间的一个数据文件中,不能跨多个数据文件。区段进一步被划分为块,其大小最小为一个Oracle块,最大为2GB。
Block
块是数据库中最小的分配单位,也是数据库使用的最小I/O单位。它由一个或多个操作系统块组成。大小一般是2KB、4KB、8KB、16KB、32KB,其实也可以不是2的幂次大小,不过在计算机世界里面2的幂次数字似乎是一个优等数字
----
Schema
Database从另外一个角度来看,它是由一个或多个schema组成。
schema的官方定义如下:
schema 为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的 schema 下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,schema 里面包含了各种对象如:tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
如果我们访问一个表时,没有指明该表属于哪一个 schema 中的,系统就会自动给我们在表上加上缺省的 shema 名。比如我们在访问数据库时,访问 scott 用户下的 emp 表,通过select * from emp; 其实,这 sql 语句的完整写法为 select * from scott.emp。在数据库中一个对象的完整名称为 schema.object,而不属 user.object。
schema只是将数据库中的对象以某种方式集合起来,再贴上一个标签(user),这个集合里面的对象,也就只有手持这个标签的用户才可见。schema与user的关系,就好象身体与姓名的关系。
说穿了其实user是控制权限的,而schema是个容器,非所有者要访问这个容器下的对象就需要在对象前面写上schema的名字,如果不想写而又没有创建synonym,此时可以通过alter session set current_schema=schema_name来改变当前session的schema,从而在访问对象时省去schema。最终能否访问对象还是要看是否有访问这个对象的权限而和schema无关。
user即oracle中的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;而schema所涵盖的是各种对象,它包含了表、函数、包等等对象的“所在地”,并不包括对他们的权限控制。好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。

图 1 segment、extent、block之间的联系

首先要明确数据库与实例的关系
数据库:磁盘上存储的数据集合,也就是上一节中所说的各种文件组成。
实例:一组后台进程和共享内存。实例“一生”只能装载并打开一个数据库。一个数据库可以由一个或多个实例(使用RAC)装载和打开。Oracle系统中每一个实例都由一个SID(site identity descriptor)值唯一标识。两者的关系有点类似程序与进程之间的关系。下图描述了两者的关系。