12c create spfile的警示
在12c中,create spfile命令又有了新的參數變更,引入了as copy選項,這個變化是由於一個Bug引入的。
通過以下的測試和驗證過程,大家會發現新版本中的這個變化,避免在新版本中遭遇陷阱。以下驗證環境為Oracle RAC 12.1.0.2.0,先記錄當前DB的資源配置。
[oracle@rac12-node1 ~]$ srvctl config database -db rac12
Database unique name:rac12
Database name:rac12
Oracle home:/u01/app/oracle/product/12.1.0
Oracle user:oracle
Spfile:+DATA/rac12/spfilerac12.ora
Password file:+DATA/RAC12/PASSWORD/pwdrac12.276.902472499
Domain:
Start option:open
Stop option:immediate
Database role:PRIMARY
Management policy:AUTOMATIC
Server pools:racpool
Disk Groups:DATA
Mount point paths:
Services:racdb
Type:RAC
Start concurrency:
Stop concurrency:
OSDBA group:dba
OSOPER group:dba
Database instances:
Configured nodes:
Database is policy managed
對於RAC環境,一般都推薦使用共享的SPFILE,方便維護初始化參數。下麵的連續測試主要觀察命令執行後對這個參數的影響。
首先測試生成PFILE或者SPFILE,同時指定生成文件的位置,請注意後者直接導致了集群參數文件指向的變更。
SQL>create pfile='/tmp/ffile.ora' from spfile='+DATA/rac12/spfilerac12.ora';
File created. SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:+DATA/rac12/spfilerac12.ora
SQL>create spfile='/tmp/ffile.spfile' from pfile='/tmp/ffile.ora';
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/ffile.spfile
從內存生成PFILE或者SPFILE,同時指定生成文件的位置,後者對於SPFILE同樣更新了集群配置。
SQL> create pfile='/tmp/fmem.ora' from memory;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/ffile.spfile
SQL>create spfile='/tmp/fmem.spfile' from memory;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/fmem.spfile
從文件生成PFILE或者SPFILE,不指定生成文件的位置。
SQL> create pfile from spfile='DATA/rac12/spfilerac12.ora';
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/fmem.spfile
SQL>create spfile from pfile='/tmp/ffile.ora';
File created
SQL>! srvctl config database -db rac12|grep -i'spfile'
Spfile:+DATA/spfilerac12_1.ora
指定生成文件位置,但源文件默認使用默認位置。
SQL> create pfile='/tmp/ffile2.ora' from spfile;
File created.
SQL>!srvctl config database -db rac12|grep -i 'spfile'
Spfile:+DATA/spfilerac12_1.ora
SQL>create spfile='/tmp/ffile2.spfile' from pfile;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/ffile2.spfile
生成文件和源文件均使用默認位置。
SQL>create pfile from spfile;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/ffile2.spfile
SQL>create spfile from pfile;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:+DATA/spfilerac12_1.ora
通過測試可見每一次生成SPFILE,都同時更新了Database資源配置裏麵的SPFILE設定!
由於這個命令執行時沒有任何提示會更新Database資源設定,所以很容易導致SPFILE的設定被更改到某個節點的本地文件係統,這樣有可能會導致其他節點在重啟動之後找不到指定的SPFILE,從而啟動失敗。
幸運的是,通常RAC在安裝完成後,在初始化參數的默認位置($ORACLE_HOME/dbs)一般會創建一個PFILE,裏麵用SPFILE參數指向了共享的SPFILE。
[oracle@rac12-node3 ~] $ cd $ORACLE_HOME/dbs
[oracle@rac12-node3 dbs] $ ls
hc_rac12_3.dat id_rac12_3.dat init.ora initrac12_3.ora
[oracle@rac12-node3 dbs] $ cat initrac12_3.ora
SPFILE='+DATA/rac12/spfilerac12.ora'
[oracle@rac12-node3 dbs] $
這會如果不知情地執行了之前的創建操作,這會導致部分節點使用不同的SPFILE:
在MOS網站上搜索,確認如下Bug,Oracle提供了補丁修正
Bug 18799993 -CREATE SPFILE updates the DB resource by default as of 12.1 (Doc ID 18799993.8)。
在以下Bug描述中,Oracle詳細闡述了這個問題,這是一個僅在RAC環境中出現的問題,並在補丁中提供了AS COPY選項。
As of 12c creating an spfile also updates the spfile location in the cluster. This is different to 11.2 behaviour and can affect scripts that create a local SPFILE that is not accessible to other RAC nodes.
Rediscovery Notes After an spfile is created, the spfile location is updated in the cluster. Other nodes may then be unable to access the new spfile.
Workaround None other than be sure to create SPFILE on a shared disk accessible to all nodes.
Note: This fix extends the CREATE SPFILE syntax to add an "AS COPY" option. If 'AS COPY' is specified the cluster wide spfile location is not updated.
安裝後進行簡單測試。
SQL>create spfile='/tmp/aferpatch_ffile.spfile' from pfile='/tmp/ffile.ora';
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile.spfile
SQL>create spfile='/tmp/aferpatch_fmen.spfile' from memory;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile.spfile
SQL>create spfile='/tmp/aferpatch_ffile2.spfile' from pfile;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile from pfile='/tmp/ffile.ora';
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile from memory;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile from pfile;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
可以看到有一些改變,現在create spfile from pfile命令隻有在指定生成文件路徑才會更新Database資源配置,create spfile from memory不再更新Database資源配置。
繼續來檢查as copy的使用情況。
SQL>create spfile='/tmp/aferpatch_ffile.spfile'from pfile='/tmp/ffile.ora' as copy;
File created.
SQL>! srvctl config database -db rac12|grep -i'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile='/tmp/aferpatch_ffile.spfile' from pfile as copy;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile='/tmp/aferpatch_ffile.spfile' from memory as copy;
ERROR at line 1:
ORA-009333:SQL command not properly ended
SQL>create spfile from pfile='/tmp/ffile.ora' as copy;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile from pfile as copy;
File created.
SQL>! srvctl config database -db rac12|grep -i 'spfile'
Spfile:/tmp/aferpatch_ffile2.spfile
SQL>create spfile from memory as copy;
ERROR at line 1:
ORA-00933:SQL command not properly ended
可以看到from memory不支持as copy選項,同時加了as copy選項後,即使指定了spfile生成文件的路徑,也不再更新Database資源配置。
通過以上測試和驗證過程,得出以下結論。
create spfile from memory:不支持as copy選項,但是也不再更新Database資源配置。
createspfile from pfile:在指定生成文件路徑而且不加as copy選項時,仍然會更新Database資源配置。
通過這個案例可以看出,一個新的版本變化,會改變很多數據庫細節上的行為。如果不關注這些細節,就有可能在運維時遭遇困境。所以當我們使用一個新版本時,需要盡可能關注新特性,並保持對於數據庫修正的持續跟蹤。
文章轉自數據和雲公眾號,原文鏈接
最後更新:2017-07-18 11:32:47