建立資料表空間、檔案過程中,目錄是否存在和空間是否滿足是我們需要關注的問題。保持系統資料存放區策略一致性,避免出現大的返工動作是這個過程中必須考慮的問題。
很多時候,不謹慎的操作行為會帶來很大影響和問題。比如武斷信任系統部署文檔,沒有切實的去做分析工作,都會給我們的系統帶來很多問題。但是,出現問題的一個積極作用是可以協助我們瞭解更多的知識,理解系統特性和功能。
Oracle OMF 功能詳解
Oracle資料表空間建立刪除,omf,分區表建立
從參數取值看Oracle OMF特性
本篇介紹一個由於錯誤檔案建立而發現的Oracle特性。
1、問題簡述
在巡檢過程中,資料庫日誌中出現如下記錄:
Tue May 13 18:08:58 2014
create tablespace mssite
datafile 'D:\APP\XXX\ORADATA\ORCL\msite.DBF'
size 10240m
autoextend on next 10m maxsize 20480m
Tue May 13 18:09:56 2014
Completed: create tablespace mssite
datafile 'D:\APP\XXX\ORADATA\ORCL\mssite.DBF'
size 10240m
autoextend on next 10m maxsize 20480m
當前系統是10gR2,版本號碼為10.2.0.1。系統OMF特性啟動。
SQL> select * from v$version;
BANNER
---------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
SQL> show parameter db_create
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string /u01/app/oracle/oradata
db_create_online_log_dest_1 string
在Linux系統中,是怎麼建立的“C:\xx”目錄?重要的是,Oracle也正常執行語句,沒有進行報錯。此時,新檔案名稱如下:
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------------------
(篇幅原因,有省略……)
/u01/app/oracle/oradata/DB/datafile/o1_mf_testtbl_9q1h2gq1_.dbf TESTTBL
/u01/app/oracle/product/10.2.0/db_1/dbs/D:APPXXXORADATAORCLmssite.DBF MSSITE
6 rows selected
從dba_data_files視圖中,我們看到其他資料檔案都是遵守Oracle OMF特性,在db_file_create_dest目錄下進行檔案建立。指定的錯誤路徑檔案,被放置在$ORACLE_HOME/dbs目錄中,以路徑壓縮(去除\字元)的方式進行命名。
那麼,這個是否是Oracle的特性呢?我們通過實驗來進行證明。
2、測試實驗
我們選擇在11gR2上進行實驗,兩者在OMF方面差異不大。
SQL> show parameter db_create;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string /u01/app/oradata
db_create_online_log_dest_1 string
db_create_online_log_dest_2 string
建立錯誤目錄檔案資料表空間。
SQL> create tablespace test datafile 'd:\test.dbf' size 10m;
Tablespace created
SQL> select file_name, tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------------------
(篇幅原因,有省略……)
/u01/app/oracle/dbs/d:test.dbf TEST
/u01/app/oradata/ORA11G/datafile/o1_mf_system_9ppkjccb_.dbf SYSTEM
/u01/app/oradata/ORA11G/datafile/o1_mf_users_9pplqldd_.dbf USERS
7 rows selected
相同的現象出現,資料檔案建立在$ORACLE_HOME/dbs,檔案名稱被設定為錯誤目錄結構壓縮版。相同檔案是否可以建立?
SQL> create tablespace test1 datafile 'd:\test.dbf' size 10m;
create tablespace test1 datafile 'd:\test.dbf' size 10m
ORA-01537: 無法添加檔案 'd:\test.dbf' - 該檔案已是資料庫的一部分
SQL> create tablespace test1 datafile 'd:\test1.dbf' size 10m;
Tablespace created
如果是OMF特性,要求在datafile中不寫入檔案名稱資訊。所以,當前現象並不是OMF的結果。而且$ORACLE_HOME/dbs是一個非常古老的重要檔案夾,密碼檔案、參數檔案都駐留於此,在備份過程中,這個目錄也經常充當控制檔案備份所在。
所以,這個現象應該是Oracle在非法檔案名稱出現時候的一種應急反應。如果目錄結構是非法的,Oracle會設法將其轉化為符合單個檔案標準的檔案名稱,存放在$ORACLE_HOME/dbs裡面。
我們刪除這些檔案的時候,OMF特性是不啟動的。所以需要手工刪除或者加入including子句。
SQL> drop tablespace test;
Tablespace dropped
SQL> drop tablespace test1 including contents and datafiles;
Tablespace dropped
[root@SimpleLinux dbs]# ls -l
total 19788
-rw-r-----. 1 oracle oinstall 10493952 May 14 11:15 d:test.dbf
-rw-rw----. 1 oracle oinstall 1544 May 14 08:45 hc_ora11g.dat
-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r-----. 1 oracle oinstall 24 Apr 1 12:39 lkORA11G
-rw-r-----. 1 oracle oinstall 1536 Apr 3 09:07 orapwora11g
-rw-r-----. 1 oracle oinstall 9748480 May 9 10:46 snapcf_ora11g.f
-rw-r-----. 1 oracle oinstall 3584 May 14 11:14 spfileora11g.ora
3、結論
在這個過程中,我們發現了Oracle非OMF檔案建立過程中的規律。如果檔案名稱非法,Oracle會將非法檔案名稱(含目錄)處理為合法檔案名稱,放在$ORACLE_HOME/dbs中。這個過程是不會報錯的。
但是,從管理角度看,我們是不推薦這種做法的。首先這個目錄是一個軟體層級公用的目錄,如果有多個執行個體資料庫,這個檔案夾是比較危險的。另外,這種方式也不符合Oracle OFA要求的管理原則。
歸結到這個功能特性,筆者認為還是不要妄用為好。一個部署營運人員,確認檔案目錄這類基本的能力,還是必要的。