
2.3 物理存储结构
与逻辑存储结构相比,物理存储结构相对简单并且更容易理解,但是物理存储结构并不是独立存在的,它与数据库逻辑存储结构之间有着不可分割的联系。从整体上看,Oracle的数据在逻辑上存储在表空间中,而在物理上存储在表空间所对应的数据文件中。数据库逻辑结构与物理结构中的数据文件有着十分密切的联系,如下图所示。

数据库物理存储结构主要包括3类物理文件:数据文件、控制文件和重做日志文件。除此之外,Oracle数据库还具有一些参数文件。
2.3.1 数据文件
数据库中的数据在物理上保存在若干个操作系统文件中,这些操作系统文件就是数据文件。一个表空间在物理上对应一个或多个数据文件,而一个数据文件只能属于一个表空间。数据文件是操作系统文件,Oracle通过表空间创建数据文件,从硬盘中获取存储数据所需的物理存储空间,一个数据文件只能属于唯一的表空间。
在存取数据时,Oracle数据库首先从数据文件中读取数据,并存储在内存中的数据缓冲区中。当用户查询数据时,如果查询的数据不在数据缓冲区中,这时Oracle数据库则启动相应的进程从数据文件中读取数据,并保存到数据缓冲区中。当用户修改数据时,用户对数据的修改保存在数据缓冲区中,然后由Oracle的相应后台进程将数据写入数据文件中。这样的存取方式减少了磁盘的I/O操作,提高了系统的响应性能。
在为数据库创建表空间时,Oracle将同时创建该表空间的数据文件。当用户在表空间中创建数据库对象时,用户是无法指定使用哪一个数据文件来进行存储的,只能由Oracle负责为数据库对象选择一个数据文件,并在其中分配物理存储空间。一个数据库对象的数据可以全部保存在一个数据文件中,也可以分布存放在同一个表空间的多个数据文件中。
随着不断在表空间中创建和更新数据库对象,表空间对应的数据文件中的物理存储空间将被消耗殆尽,这时就需要为表空间分配更多的物理存储空间。数据文件的大小在创建时确定。当表空间中的物理存储空间不足时,可以通过3种方式来增加存储空间。
※ 为表空间追加新的数据文件。
※ 通过手工方式扩大现有的数据文件。
※ 配置数据文件为自动增长方式,当数据文件需要更多的存储空间时,Oracle会自动增大数据文件。
可以通过如下方式查看数据文件。
SQL> select name from v$datafile; NAME ---------------------------------------------- D:\APP\MANAGER\ORADATA\ORCL\SYSTEM01.DBF D:\APP\MANAGER\ORADATA\ORCL\SYSAUX01.DBF D:\APP\MANAGER\ORADATA\ORCL\UNDOTBS01.DBF D:\APP\MANAGER\ORADATA\ORCL\USERS01.DBF D:\APP\MANAGER\ORADATA\ORCL\EXAMPLE01.DBF
从以上代码可以看出,数据文件大致可以分为以下几类。
※ 系统数据文件:系统数据文件SYSTEM01.DBF和SYSAUX01.DBF存放了系统表和数据字典,一般不放用户的数据,但是用户脚本,如过程、函数、包等却是保存在数据字典中的。
※ 撤销段文件:撤销段文件UNDOTBS01.DBF对应撤销表空间。如果数据库进行对数据的修改,那么就必须使用撤销段,撤销段用来临时存放修改前的数据。撤销段通常都放在一个单独的表空间中(撤销表空间),避免表空间碎片化,这个表空间包含的数据文件就是撤销段数据文件。
※ 用户数据文件:用户数据文件USERS01.DBF和EXAMPLE01.DBF用于存放用户数据。其中,EXAMPLE01.DBF文件存放了示例方案中的数据。
需要注意,上面并没有显示临时表空间所对应的临时数据文件。因为临时数据文件是一类比较特殊的数据文件,临时数据文件的信息只能通过数据字典视图DBA_TEMP_FILE和动态性能视图V$TEMPFILE来查看,而不能像普通数据文件一样通过DBA_DATA_FILES和V$DATAFILE视图查看。
SQL> select name from v$tempfile; NAME --------------------------------------------------- D:\APP\MANAGER\ORADATA\ORCL\TEMP01.DBF
2.3.2 控制文件
数据库控制文件是一个很小的二进制文件,其中包含了关于数据库物理结构的重要信息。通过在加载数据库时读取控制文件,Oracle才能找到自己所需的操作系统文件(数据文件、重做日志文件等)。
控制文件对于数据库的成功启动和正常运行是至关重要的,在加载数据库时,实例必须先找到数据库的控制文件。如果控制文件正常,实例才能加载并打开数据库。但是,如果控制文件中记录了错误的信息,或者实例无法找到一个可用的控制文件,数据库将无法加载,当然也无法打开。
在数据库运行的过程中,Oracle会不断更新控制文件中的内容,因此控制文件必须在整个数据库打开期间始终保持可用状态。如果由于某种原因导致控制文件不可用,数据库将会崩溃。
每个数据库必须至少拥有一个控制文件,一个数据库虽然可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库。在数据库的控制文件中包含关于该数据库物理结构的信息,控制文件中的主要信息包括:数据库的名称、检查点信息、数据库创建的时间戳、所有的数据文件、重做日志文件、归档日志文件信息和备份信息等。
有了控制文件中的这些信息,Oracle便可以确定哪些文件属于数据文件了,例如现在的重做日志文件,由于它们是系统的启动和运行的基本条件,因此也属于数据文件。这些都是系统启动和运行的基本条件。由于控制文件非常重要,因此一般采用多个复本的方式来保护控制文件,或采用RAID来保护控制文件。控制文件的丢失,将使数据库的恢复变得很复杂。控制文件信息可以从V$CONTROLFILE中查询获得。
SQL> select name from v$controlfile; NAME ------------------------------------------------- D:\APP\MANAGER\ORADATA\ORCL\CONTROL01.CTL D:\APP\MANAGER\ORADATA\ORCL\CONTROL02.CTL D:\APP\MANAGER\ORADATA\ORCL\CONTROL03.CTL
提示:
控制文件中的内容只能由Oracle本身来修改,任何数据库管理员都不能直接编辑控制文件中的内容。
2.3.3 其他文件
除了上述3种类型的文件外,Oracle还提供了一些其他类型的文件,如参数文件、归档日志文件、跟踪和密码文件等。本节将对这些文件进行简单介绍。
1. 归档日志文件
Oracle利用重做日志文件记录对数据库所做的修改,但是重做日志文件是以循环方式使用的,在重新写入重做日志文件时,原来保存的信息将被覆盖。如果能够将所有的重做记录永久地保留下来,就可以完整地记录数据库的全部修改过程,可以通过对重做日志文件进行归档来实现。
在重做日志文件被覆盖之前,Oracle能够将已经写满的重做日志文件,通过复制操作系统文件的方式保存到指定的位置。保存下来的重做日志文件的集合称为“归档重做日志”,复制的过程称为“归档”。
Oracle数据库可以运行在两种模式中—归档模式和不归档模式。只有数据库处于归档模式下,系统才会对重做日志文件执行归档操作,归档操作由后台进程ACRn自动完成。当数据库运行在归档模式下,归档重做日志文件会占用大量的硬盘空间。也就是说,数据库在归档模式下是以牺牲硬盘空间的方式来获取数据的安全性的。
2. 参数文件
在Oracle数据库系统中,参数文件包含了数据库的配置信息。数据库实例在启动之前,Oracle数据库系统首先会读取这些参数文件中设置的参数,并根据初始化参数文件中设置的参数来配置实例的启动。
参数文件包括文本参数文件和服务器参数文件两种类型。在Windows平台中,服务器参数文件的名称格式为SPFILE<SID>.ora,文本参数的名称格式为init<SID>.ora,其中SID为数据库实例名。
用户可以通过如下3种方法查看数据库中的参数值。
※ 查看init<SID>.ora文件:该参数文件是以文本形式存储参数的,用户可以直接打开该参数文件查看数据库参数。
※ 查询视图V$PARAMETER:可利用该动态性能视图来确定参数的默认值是否修改过,以及是否可以用alter system和alter session命令修改。
提示:
应该特别注意ISMODIFIED、ISDEFAULT、ISADJUSTED、ISSYS_MODIFIABLE和ISSES_MODIFIABLE列中的值。
※ 使用SQL命令:使用*Plus的show parameter命令可查看。
用户通过修改init<SID>.ora文件,可以修改所有的参数,但是必须关闭数据库,然后再重启数据库实例才能生效。另外,也可以使用ALTER SYSTEM、ALTER SYSTEM DEFERRED和ALTER SESSION命令修改参数,修改参数后无须重新启动实例即可立即生效,但是这样不能修改所有参数。
3. 密码文件
在Oracle数据库系统中,用户如果要以特权用户身份(INTERNAL、SYSDBA、SYSOPER)登录Oracle数据库,可以使用两种身份验证方法—使用与操作系统集成的身份验证和使用Oracle数据库的密码文件进行身份验证。因此,对密码文件的管理可以控制授权用户从远端或本地登录Oracle数据库系统。
Oracle密码文件的默认存放位置在%ORACLE_HOME%\Database目录下,密码文件为pwd<SID>.ora,其中SID代表数据库实例名。数据库管理员也可以根据需要,使用工具ORAPWD.exe手工创建密码文件,命令格式如下。
C:\>ORAPWD FILE=<FILENAME> PASSWORD=<PASSWORD> ENTRIES=<MAX_USERS>
各命令参数的含义为:
※ FILENAME:密码文件名。
※ PASSWORD:设置INTERNAL/SYS账户的口令。
※ MAX_USERS:密码文件中可以存放的最大用户数,对应于允许以SYSDBA/ SYSOPER权限登录数据库的最大用户数。
创建密码文件后,需要设置初始化参数REMOTE_LOGIN_PASSWORDFILE来控制密码文件的使用状态。在Oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。该参数的取值包括:
※ NONE:指示Oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证。
※ EXCLUSIVE:指示只有一个数据库实例可以使用此密码文件。
※ SHARED:指示多个数据库实例可以使用此密码文件。在此设置下只有INTERNAL/SYS账户能被密码文件识别,即使文件中存在其他用户的信息,也不允许他们以SYSOPER/SYSDBA的权限登录。
当初始化参数REMOTE_LOGIN_PASSWORDFILE设置为EXCLUSIVE时,系统允许除INTERNAL/SYS以外的用户以管理员身份从远端或本地登录到Oracle数据库系统,并执行数据库管理工作。但是,这些用户名必须存在于密码文件中,这样系统才能识别它们。无论是在创建数据库实例时自动创建的密码文件,还是使用ORAPWD.exe手工创建的密码文件,都只包含INTERNAL/SYS用户的信息。为此,在实际操作中,可能需要向密码文件中添加或删除其他用户账户。
要进行此项授权操作,需使用SYSDBA权限连接数据库,并且初始化参数REMOTE_ LOGIN_PASSWORDFILE必须被设置为EXCLUSIVE。具体操作步骤如下。
① 创建相应的密码文件。
② 修改初始化参数REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE。

③ 使用SYSDBA权限登录。
SQL> connect sys/password as sysdba; 已连接。
④ 向用户授予SYSOPER和SYSDBA权限。
SQL> grant sysdba to hr; 授权成功。
⑤ 现在,用户HR可以以管理员身份登录数据库系统了。
SQL> connect hr/hr as sysdba 已连接。
提示:
收回权限的语句为:REVOKE SYSDBA FROM user_name。
可以通过查询视图V$PWFILE_USERS来获取拥有SYSOPER/SYSDBA系统权限的用户的信息,表中SYSOPER/SYSDBA列的取值TRUE/FALSE,表示此用户是否拥有相应的权限。

4. 预警日志文件
预警日志文件记录了数据库启动、关闭和一些重要的出错信息,这些信息是按照时间顺序存放的。通过使用预警日志文件,数据库管理员可以查看Oracle的内部错误和数据块损坏的错误,还可以监视特权用户的操作,以及监视数据库物理结构的改变。
预警日志文件的位置由初始化参数BACKGROUND_DUMP_DEST确定,名称为alert<SID>. log,其中SID为实例名,并且其信息由服务器进程和后台进程(DBWR、LGWR)写入。例如:
SQL> select value from v$parameter 2 where name ='background_dump_dest'; VALUE ------------------------------------- d:\app\manager\diag\rdbms\orcl\orcl\trace
提示:
因为预警日志文件所记载的消息和错误是按照时间顺序存放的,所以当查看预警日志文件时应从文件尾部查看。由于随着时间的推移,预警日志文件会越来越大,DBA应该定期删除预警日志文件。
5. 后台或用户跟踪文件
后台进程跟踪文件用于记录后台进程的警告或错误消息,每个后台进程都有相应的跟踪文件。后台进程跟踪文件的位置由初始化参数BACKGROUND_DUMP_DEST确定,名称格式为<SID>_<processname>_<SPID>.trc。
用户进程跟踪文件用于记载与用户进程相关的信息,它主要用于跟踪SQL语句。通过用户进程跟踪文件,可以诊断SQL语句的性能,并为调整SQL语句提供支持。同样,用户进程跟踪文件的位置由初始化参数USER_DUMP_DEST确定,名称格式为<SID>_ora_<SPID>.trc。