從引數取值看Oracle OMF特性

studywell發表於2015-02-04

 

Oracle 10g以後,在目錄結構和檔案管理方面推出兩個特性OFAOMFOFAOracle Flexiable Architecture)是進行目錄結構約束規範的特性。診斷檔案diag、日誌、資料檔案等目錄結構分佈都是由OFA進行固定下來。OMFOracle Managed File)是針對檔案結構,將原來使用者負責檔案命名和位置轉變為Oracle負責管理。

OMF涉及的專案主要是資料檔案和日誌檔案。我們在進行檔案管理的過程中,比如新增、刪除操作,是不需要關注檔名稱位置細節的。簡單的說,OMF解決了三個問題:

ü  檔案存放位置。OMFOFA是聯動的。從Oracle角度看,符合最佳實踐的檔案部署結構是成功資料庫安裝配置的要點。進入ASM之後,Oracle自身就有很強烈的“管理慾望”。藉助OMF,預設配置路徑就可以滿足大部分需要;

ü  檔案命名和建立。傳統檔案管理中,我們需要顯式的進行檔名稱指定(包含路徑)。藉助OMF,我們從這個工作中解放出來,只需要指定檔案大小(甚至不指定),建立操作就可以實現;

ü  檔案自動刪除。我們傳統資料檔案建立之後,直接刪除表空間drop tablespace xxx,是不能將資料檔案刪除的,除非我們使用including子句。藉助OMFdrop tablespace就可以將資料檔案自動刪除;

OMF中,兩個引數起到決定作用,為db_create_file_destdb_create_online_log_dest_n。這兩個引數在控制OMF行為中起到決定性作用。下面我們透過一系列的引數實驗,驗證兩個引數如何影響資料庫行為。

 

1、環境介紹

 

我們依然選擇Oracle 11gR2進行試驗,具體版本為11.2.0.4

 

SQL> select * from v$version;

 

BANNER

----------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production

PL/SQL Release 11.2.0.4.0 - Production

CORE 11.2.0.4.0 Production

 

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

 

預設系統引數情況如下:

 

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     

db_create_online_log_dest_3          string     

db_create_online_log_dest_4          string     

db_create_online_log_dest_5          string     

 

從官方解釋看,db_create_file_dest是負責通用檔案目錄結構,包括資料檔案和日誌檔案。Db_create_online_log_dest_n是負責線上日誌目錄結構,nonline redo log單個組成員數目。N的取值和建立資料庫時候的maxlogfile確定的數目。

當前資料檔案和日誌情況如下:

 

 

SQL> select file_name, file_id, tablespace_name from dba_data_files;

 

FILE_NAME                                                        FILE_ID TABLESPACE_NAME

------------------------------------------------------------- ---------- ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_users_9mnjs074_.dbf             4 USERS

/u01/app/oradata/ORA11G/datafile/o1_mf_undotbs1_9mnjs068_.dbf          3 UNDOTBS1

/u01/app/oradata/ORA11G/datafile/o1_mf_sysaux_9mnjs04h_.dbf            2 SYSAUX

/u01/app/oradata/ORA11G/datafile/o1_mf_system_9mnjrzty_.dbf            1 SYSTEM

/u01/app/oradata/ORA11G/datafile/o1_mf_system_9ppkjccb_.dbf            5 SYSTEM

 

SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------------------------

         3 /u01/app/oradata/ORA11G/onlinelog/o1_mf_3_9mnjx4n0_.log

         3 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_3_9mnjx54c_.log

         2 /u01/app/oradata/ORA11G/onlinelog/o1_mf_2_9mnjwzpq_.log

         2 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_2_9mnjx15f_.log

         1 /u01/app/oradata/ORA11G/onlinelog/o1_mf_1_9mnjwtj9_.log

         1 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_1_9mnjwvdm_.log

 

6 rows selected

 

當前OMF配置情況下,/u01/app/oradata為頂層檔案結構。資料檔案採用了OMF自動命名機制。Online Redo Log三組,每組兩個成員,一個在/u01/app/oradata目錄中的OFA架構體系下,另一個是在recovery area中。

注意:引數db_create_file_destfile_dest,而不是datafile_dest。這個引數是一個統籌性的引數,位於OMF引數體系上層。如果log沒有指定另外目錄。Db_create_file_dest是負責資料檔案和日誌檔案的。從實際情況看也的確如此。

 

2、預設OMF行為

 

下面我們可以觀察一下預設OMF配置行為。首先是直接新增資料檔案操作。

 

SQL> alter tablespace users add datafile size 100m autoextend off;

Tablespace altered

 

此時,新檔案新增上,Oracle自動給予命名。

 

SQL> select file_name, file_id, tablespace_name from dba_data_files;

 

FILE_NAME                                                        FILE_ID TABLESPACE_NAME

------------------------------------------------------------- ---------- ------------------------------

/u01/app/oradata/ORA11G/datafile/o1_mf_users_9mnjs074_.dbf             4 USERS

/u01/app/oradata/ORA11G/datafile/o1_mf_users_9pplqldd_.dbf             6 USERS

(篇幅原因,有省略……

 

6 rows selected

 

日誌組新增,新增一個新的日誌組。

 

SQL> alter database add logfile group 4 size 50m;

Database altered

 

SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------------------------------------

         (篇幅原因,有省略……

         4 /u01/app/oradata/ORA11G/onlinelog/o1_mf_4_9pplrks5_.log

         4 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_4_9pplrkwh_.log

 

8 rows selected

 

在預設情況下,db_create_log_dest是沒有設定的。故採用延續的db_create_file_dest目錄。並且會在recovery area中保留一個映象備份,形成兩份member成員的結構。

 

3、針對db_create_file_dest實驗

 

下面我們嘗試將db_create_file_dest引數指向一個新的位置。

 

 

[oracle@SimpleLinux app]$ pwd

/u01/app

[oracle@SimpleLinux app]$ mkdir -p /u01/app/oradata2

 

修改引數db_create_file_dest引數,該引數是支援動態修改的,修改之後不需要重新啟動伺服器。

 

 

SQL> alter system set db_create_file_dest='/u01/app/oradata2';

System altered

 

SQL> show parameter db_create_file_dest;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_create_file_dest                  string      /u01/app/oradata2

 

建立資料檔案和日誌檔案,檢視效果。

 

SQL> create tablespace test datafile size 10m autoextend off extent management local uniform size 1m segment space management auto;

 

Tablespace created

 

SQL> select file_name, file_id, tablespace_name from dba_data_files;

 

FILE_NAME                                                        FILE_ID TABLESPACE_NAME

------------------------------------------------------------- ---------- ------------------------------

(篇幅原因,有省略……

/u01/app/oradata2/ORA11G/datafile/o1_mf_test_9ppm1m8w_.dbf             7 TEST

 

7 rows selected

 

注意:OMF不是意味著對於OFA的背離。我們調整了引數取值之後,新檔案建立只是在新的引數位置,使用OFA結構而已。原有的大寫資料庫名稱,型別目錄並沒有改變。

線上日誌測試:

 

 

SQL> alter database drop logfile group 4;

Database altered

 

SQL> alter database add logfile group 4 size 50m;

Database altered

 

新的日誌位置:

 

SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------------------------------------

        (篇幅原因,有省略……

         4 /u01/app/oradata2/ORA11G/onlinelog/o1_mf_4_9ppm2y0x_.log

         4 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_4_9ppm2y3s_.log

 

8 rows selected

 

當更換db_create_file_dest之後,新的日誌建立依然為兩份,在新目錄中一份,在recovery area中一份。

如果我們清空這個引數,將db_create引數都是空的話,是什麼現象?

 

SQL> alter system set db_create_file_dest='';

System altered

 

SQL> show parameter db_create;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_create_file_dest                  string     

db_create_online_log_dest_1          string     

 

此時,我們測試建立資料檔案和線上日誌。

 

SQL> alter tablespace test add datafile size 10m autoextend off;

alter tablespace test add datafile size 10m autoextend off

 

ORA-02236: 檔名無效

 

SQL> alter database drop logfile group 4;

Database altered

 

SQL> alter database add logfile group 4 size 50m;

Database altered

 

資料檔案建立失效,但是online redo log建立成功。

 

SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------------------------------------

  4 /u01/app/fast_recovery_area/ORA11G/onlinelog/o1_mf_4_9ppmd9f8_.log

 

7 rows selected

 

注意:兩遍都清空的時候。資料檔案OMF被關閉,但是online redo log建立還會在recovery area中有涉及動作。有一點需要想到,recovery area的配置是和另一個引數db_recovery_area_dest相關的,如果這個引數同時設定為空,那麼還能成功嗎?

 

SQL> alter system set db_create_file_dest='';

System altered

 

SQL> alter database add logfile group 5;

alter database add logfile group 5

 

ORA-02236: 檔名無效

 

上面實驗說明了,在不配置db_create_log_dest_n系列引數情況下,db_create_file_dest負責了資料檔案、線上日誌的目錄結構。同時,如果recovery area配置有效,online redo log都會維持在recovery area中有一個成員映象檔案。

 

4、針對db_create_log_dest_n實驗

 

下面我們恢復現場,進行對db_create_log_dest的引數測試。同時恢復recovery_area_dest配置。

 

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     

 

我們首先建立目錄。

 

[oracle@SimpleLinux app]$ mkdir -p /u01/app/oradata/ORA11GY/onlinelog

[oracle@SimpleLinux app]$ mkdir -p /u01/app/oradata/onlinelog

 

配置一個db_create_log引數。

 

 

SQL> alter system set db_create_online_log_dest_1='/u01/app/oradata/ORA11GY/onlinelog';

System altered

 

SQL> show parameter db_create;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_create_file_dest                  string      /u01/app/oradata

db_create_online_log_dest_1          string      /u01/app/oradata/ORA11GY/onlinelog

db_create_online_log_dest_2          string     

db_create_online_log_dest_3          string     

db_create_online_log_dest_4          string     

db_create_online_log_dest_5          string     

 

此時建立日誌組:

 

 

SQL> alter database add logfile group 4 size 50m;

Database altered

 

SQL> select group#, member from v$logfile;

 

    GROUP# MEMBER

---------- --------------------------------------------------------------------------------

(篇幅原因,有省略……

 4 /u01/app/oradata/ORA11GY/onlinelog/ORA11G/onlinelog/o1_mf_4_9ppmwmk6_.log

 

7 rows selected

 

我們看到了不同,雖然db_create_file引數設定為/u01/app/oradata,但是作為個性化的配置,新日誌組成員還是使用了db_create_log_dest_1作為基準目錄。同時在這個基準目錄上進行OFA結構設定。另一個不同點是:當前recovery area中自動映象消失了,沒有自動建立!

再新增一個新的目錄位置,檢視效果。

 

SQL> alter system set db_create_online_log_dest_2='/u01/app/oradata/onlinelog';

System altered

 

SQL> show parameter db_create;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_create_file_dest                  string      /u01/app/oradata

db_create_online_log_dest_1          string      /u01/app/oradata/ORA11GY/onlinelog

db_create_online_log_dest_2          string      /u01/app/oradata/onlinelog

db_create_online_log_dest_3          string     

 

嘗試建立新的日誌組:

 

SQL> alter database add logfile group 5 size 50m;

Database altered

 

SQL> select group#, member from v$logfile;

    GROUP# MEMBER

---------- --------------------------------------------------------------------------------

         (篇幅原因,有省略……

         5 /u01/app/oradata/ORA11GY/onlinelog/ORA11G/onlinelog/o1_mf_5_9ppn1178_.log

         5 /u01/app/oradata/onlinelog/ORA11G/onlinelog/o1_mf_5_9ppn119j_.log

 

9 rows selected

 

當設定了db_create_log_dest_n系列引數之後,原有的recovery area映象組成員不會出現了。_n設定的個數就是新日誌組中成員的數目。

 

5、結論

 

從上面實驗,我們可以看到OMF系列引數的設定規則。引數db_create_file_destdb_create_log_dest_nrecovery area三者是相關的。

db_create_file_dest設定,recovery area啟用,但是log_dest沒有設定的時候,資料檔案和online redo logOMF特性是開啟的,而且在recovery area中會有自動的映象成員檔案建立。

db_create_file_dest設定,recovery area不啟用,log_dest也沒有啟用的時候,資料檔案和日誌的OMF開啟,但是不會再recovery area中建立自動成員。

一旦db_create_file_dest被關閉,資料檔案的OMF特性關閉。如果同時recovery arealog_dest也沒有設定,日誌檔案OMF特性失效。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-1426779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章