在创建数据库的过程中,有过这样一个步骤,需要指定创建的数据库文件的位置,其中的一个选项是“使用Oracle管理的文件”,如图5-27所示。
图5-27 指定数据库文件所在位置
这是从Oracle 9i开始引入的一个新特性:Oracle管理的文件,也就是通常所说的OMF(Oracle Managed Files),Oracle通过这个新特性实现了数据文件的自我管理。通过OMF,Oracle将DBA同操作系统的存储分开,DBA在数据库中通过命令操作数据文件,Oracle则通过文件系统接口自动地进行文件创建或删除,也就是说,现在数据文件都处在了Oracle自身的直接管理(Self-Managed)之下。
Oracle Managed Files特性可以将DBA从直接的与操作系统的交互中脱离出来,以前当DBA从数据库中删除一个表空间后,数据文件可能仍然在操作系统上存在,这样DBA可能就需要去操作系统上手工删除文件来释放空间,这个手工操作非常危险,由于误操作删除在用文件的案例很多,最终Oracle认识到需要解决这个问题,于是在Oracle 9i中就有了OMF。
越来越多的文件都可以通过OMF来进行管理,以下各类文件都可以使用OMF管理:Permanent Tablespaces、Temporary tablespaces、Control Files、Redo Log Files、Archive Log Files、Flashback Logs、Block Change Tracking Files和RMAN Backups。
使用OMF需要配置两个初始化参数:DB_CREATE_ONLINE_LOG_DEST_n和DB_CREATE_FILE_DEST。
1.DB_CREATE_ONLINE_LOG_DEST_n
这个参数定义默认联机重做日志和控制文件的文件系统目录位置,该目录必须是已经存在的目录,并且Oracle必须对该目录有读写权限。当在创建OMF形式的联机重做日志和控制文件时,如果没有给出具体文件路径,Oracle将在此目录位置创建联机重做日志和控制文件。对于多路复用的联机重做日志和控制文件,n可以是从1~5的值。
2. DB_CREATE_FILE_DEST
这个参数定义默认的文件系统目录位置,该目录必须是已经存在的目录,并且Oracle必须对该目录有读写权限。当定义了这个参数之后,Oracle会将数据文件创建在这个目录当中,如果未定义DB_CREATE_ONLINE_LOG_DEST_n参数,联机重做日志和控制文件也用它作为默认的文件系统目录。
这两个参数都是动态参数,可以通过ALTER SESSION或者ALTER SYSTEM命令动态修改。数据库可以同时使用Oracle管理的文件和非Oracle管理的文件,两者可以并存。当创建OMF文件时,文件名会被记录在alert.log文件中,以便将来查找和使用。
首先来看一下参数的设置:
SQL> select * from v$version where rownum <2; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production SQL> show parameter db_create_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_create_file_dest string SQL> select name from v$datafile; NAME --------------------------------------------------------------------------------- /opt/oracle/oradata/eygle/system01.dbf /opt/oracle/oradata/eygle/undotbs01.dbf /opt/oracle/oradata/eygle/eygle01.dbf /opt/oracle/oradata/eygle/users.dbf SQL> alter system set db_create_file_dest='/opt/oracle/oradata/eygle'; System altered.
当设置了db_create_file_dest后,就可以使用OMF的特性,现在创建一个表空间非常简单,如果不指定大小,Oracle会自动创建一个100MB大小,可以自动扩展,最大大小不限制(这里的MAXBYTES是32G,因为对于一个8K的small tablespace的数据文件而言,最大只能到32G,这个知识点在5.9.1里有提到)的数据文件:
SQL> create tablespace omf; Tablespace created. SQL> select file_name,bytes,AUTOEXTENSIBLE,round(MAXBYTES/1024/1024/1024) MaxG 2 from dba_data_files where tablespace_name='OMF'; FILE_NAME BYTES AUT MAXG -------------------------------------------------- ---------- --- ---------- /opt/oracle/oradata/eygle/o1_mf_omf_306c4ssl_.dbf 104857600 YES 32
观察警告日志文件,可以发现文件的创建已经被记录:
Fri Mar 23 09:25:53 2007 Created Oracle managed file /opt/oracle/oradata/eygle/o1_mf_omf_306c4ssl_.dbf Completed: create tablespace omf 当DROP一个OMF表空间时,Oracle现在将自动地删除数据文件: SQL> drop tablespace omf; Tablespace dropped. SQL> ! ls /opt/oracle/oradata/eygle/o1_mf_omf_306c4ssl_.dbf ls: /opt/oracle/oradata/eygle/o1_mf_omf_306c4ssl_.dbf: No such file or directory SQL> ! tail -5 $ORACLE_BASE/admin/eygle/bdump/alert_eygle.log Fri Mar 23 09:33:16 2007 drop tablespace omf Fri Mar 23 09:33:17 2007 Deleted Oracle managed file /opt/oracle/oradata/eygle/o1_mf_omf_306c4ssl_.dbf Completed: drop tablespace omf
当然在创建表空间时也可以指定详细的参数设置:
SQL> create tablespace omf datafile size 10M autoextend on maxsize 20M; Tablespace created. SQL> select file_name,file_id,bytes,AUTOEXTENSIBLE,MAXBYTES/1024/1024 MaxM 2 from dba_data_files where tablespace_name='OMF'; FILE_NAME FILE_ID BYTES AUT MAXM -------------------------------------------------- ---------- ---------- --- ---------- /opt/oracle/oradata/eygle/o1_mf_omf_306dcdb8_.dbf 5 10485760 YES 20
通过测试可以看到现在表空间的创建和维护被极大简化,很多选项可以被省略,在创建表空间时也不必再为每个文件输入一次长长的路径信息。
可是在Oracle 9i中,这个特性的使用并不广泛,因为一旦指定了db_create_file_dest,那么所有的数据文件将在这个目录下创建,这就意味着基于I/O存储的优化被大大局限,如果规划不当则可能会导致I/O上的竞争。
直到Oracle 10g的ASM引入之后,OMF的作用进一步体现。在ASM下,Oracle接管了以前由操作系统负责的存储管理,现在可以将存储划分为不同的磁盘组分配给ASM使用,ASM负责在底层进行I/O的均衡、负载的分担、存储的优化,至此OMF可以被放心地使用。
在ASM的管理之下,我们已经无法直接操作数据文件,一切都纳入到了Oracle的管理范畴之内。通过ASM和OMF的结合,Oracle在上层将数据文件进行自我管理,在底层将存储进行自我管理,整个体系结构越来越健全起来。