
1.7 Oracle数据库的物理结构
数据库中的数据在逻辑结构上是以表空间、段、区、数据块的形式组织的,而在物理上则表现为存储在磁盘上的文件。数据库的物理结构是指数据在操作系统中的存储方式,是对用户可见的组织形式。数据库的物理结构包括数据文件、控制文件和重做日志文件,这3类文件是数据库正常运行所必需的。另外,数据库中还包括口令文件、参数文件、警告文件和跟踪文件等,这些文件也是Oracle数据库物理结构的组成部分。
1.7.1 数据文件
顾名思义,数据文件是用来存储数据的。在数据文件中存储所有数据库对象的结构和数据,包括表、视图、索引、触发器、存储程序等数据库对象。用户对数据库的访问实际上就是对数据文件的访问,只不过这些文件不能由操作系统直接访问,而必须通过数据库服务器才能访问。
数据文件与一般的文件有所不同。一般的操作系统文件的初始大小可能比较小,随着文件中内容的增加,它的大小也随着增加,同样,它的大小也将随着内容的减少而减少,在任何时候,它的大小与其内容的多少是一致的。数据文件更像是一个空的容器,在创建数据文件时,就按照指定的大小分配了存储空间。在文件被写满之前,无论文件中包含多少数据,它的大小总是固定不变的。
既然数据文件是一种操作系统文件,它在磁盘上必然占用一定数量的操作系统块。在数据库服务器内部,数据读/写的基本单位是数据块,一个数据块对应多个操作系统块。在数据库中读/写一个数据块时,在操作系统中对应着对多个操作系统块的读/写。
数据文件在逻辑上属于表空间,一个表空间可以包含一个或多个数据文件,而一个数据文件只能属于一个表空间。用户在创建数据库对象时,只能指定所属的表空间,而不能指定存储在哪个数据文件上。数据库对象被创建后,它的结构和数据就存储在一个或多个数据文件中。
随着数据库的运行,数据文件中的数据可能越来越多,并最终耗尽数据文件的存储空间。为了存储更多的数据,数据文件的存储空间必须能够扩展。Oracle提供了3种扩展数据文件存储空间的方法。
●在当前表空间中增加新的数据文件,新数据将被存储在新的数据文件中。
●手动扩展表空间中的数据文件,在原来的存储空间的基础上,增加一定数量的存储空间。
●激活数据文件的自动扩展功能,数据库服务器将自动为数据文件分配新的存储空间。
1.7.2 控制文件
控制文件是数据库中另一种重要的文件,它的功能是记录数据库的结构和状态。这是一个二进制文件,用户无法查看和修改文件的内容。数据库在启动时需要根据控制文件的内容,査找数据文件并打开它们。在数据库运行的过程中,对数据库结构所做的任何修改都将记录在控制文件中。
在启动数据库服务器时,首先启动实例,然后才能打开数据库。数据库服务器是通过控制文件在实例和数据库之间建立对应关系的。在控制文件中记录了数据文件的路径、重做日志文件的路径、当前日志序列号、SCN等信息。
如果控制文件丢失或损坏,数据库服务器将无法正常运行。由于控制文件的特殊重要性,对它的存储有特殊的要求。在一个数据库中至少需要一个控制文件,Oracle建议至少创建两个控制文件,并将它们分别存储在两个磁盘上,这两个文件互相镜像,如果一个文件损坏,数据库服务器可以使用另外一个文件。在正常情况下,这两个文件的内容是完全一样的,数据库服务器只需从其中一个文件中读取信息,但是对数据库结构所做的任何修改都必须同时写入两个控制文件。
1.7.3 重做日志文件
重做日志文件是确保数据库安全的一种重要手段。在重做日志文件中记录的是用户对数据库所做的修改,即一条条的DML(Data Manipulation Language,数据操纵语言,主要包括INSERT、UPDATE和DELETE)和DDL(Data Defination Language,数据定义语言,主要包括CREATE、DROP、ALTER等)命令。当数据库服务器发生故障时,数据库管理员可以根据重做日志的内容对数据进行恢复,从而确保数据不会因为故障而丢失。
用户在执行DML或DDL操作时,实际的数据处理是在SGA中进行的。服务器进程首先生成一条重做日志,并将它存储在重做日志缓冲区中,然后在数据库高速缓存中修改相应的缓冲区。
在一定的时机下,DBWR(数据库写进程)将数据库高速缓存中脏缓存区的内容写入数据文件中,LGWR(日志写进程)将重做日志缓冲区中的内容写入重做日志文件。在一般情况下,LGWR(日志写进程)总是先于DBWR(数据库写进程)将重做日志写入重做日志文件。
在重做日志文件中不仅记录重做日志,还记录SCN。如果用户提交事务,SCN将随着重做日志一起被LGWR(日志写进程)写入重做日志文件。这样,如果数据库服务器发生了故障,数据库管理员可以将数据库恢复到最后一个SCN处。如果用户没有提交事务,重做日志也可能被写入重做日志文件,但如果这个事务被回滚,对数据库将不产生任何影响。
在数据库中至少需要两个重做日志文件,数据库服务器以循环的方式将重做日志写入这些文件。当第一个文件写满后,数据库服务器自动进行日志切换,将重做日志写入下一个文件。当最后一个文件被写满时,数据库服务器重新将重做日志写入第一个文件。如此循环往复进行,重做日志文件中以前的内容将被覆盖。
由于重做日志文件的特殊重要性,Oracle建议为每一个重做文件至少建立一个镜像文件。互为镜像的重做日志文件归为一个日志组,同一个日志组中所有文件的内容和大小完全相同。这些文件应尽量分布在不同的磁盘上,以免磁盘发生故障时丢失所有的重做日志。数据库服务器在写重做日志时,必须将重做日志同时写入同一个日志组的所有文件。
为了确保重做日志的安全,应及时对重做日志文件进行归档,产生归档日志文件。归档日志文件可以被备份到磁盘等存储介质上。归档操作必须在数据库的归档模式下进行,并且需要启动一个或多个ARCH(归档日志进程)。在LGWR(日志写进程)向一个重做日志文件写入重做文件之前,该文件必须被归档,否则LGWR(日志写进程)将被挂起,所有的事务都停止执行。
1.7.4 跟踪文件和警告文件
当数据库服务器运行不正常时,将与警告文件和跟踪文件产生一些有用的信息,数据库管理员可以查看这些文件的内容,根据其中记录的信息判断故障发生的原因。跟踪文件用于记录服务器进程和后台进程发生的内部错误信息,每个服务器进程和后台进程都有自己的跟踪文件。后台进程的跟踪文件名为<SID><process>.TRC,其中SID为实例名称,process为后台进程名称。例如,实例TEST中的LGWR(日志写进程)的跟踪文件名为“TESTLGWR.TRC”。服务器进程的跟踪文件名为<SID>_<PID>_ORA.TRC,其中SID为实例名称,PID为服务器进程的进程号。根据文件名称,数据库管理员就可以判断跟踪文件是由哪个进程产生的。
警告文件用于记录实例内部的错误消息以及数据库管理员对数据库所做的维护,另外,在警告文件中还记录非默认的初始化参数。警告文件的名称为ALERT_<SID>.LOG,其中SID为实例名称。
跟踪文件和警告文件都有默认的存储路径,它们的路径由初始化参数指定。如初始化参数USER_DUMP_DEST指定了服务器进程跟踪文件的存储路径,而初始化参数BACKGROUND_DUMP_DEST指定了后台进程跟踪文件和警告文件的存储路径。