題目部分
在Oracle中, 資料庫的參數分為哪幾類?
答案部分
Oracle資料庫根據SPFILE或PFILE中設置的參數來啟動資料庫。Oracle中的參數,根據系統使用情況可以簡單分為兩大類:
l普通參數:Oracle系統正常使用的一些參數。
l非凡參數:包括4種,過時參數、強調參數、隱含參數及推導參數。
(一)參數類型介紹
初始化參數有兩種類型。
靜態參數(Static parameters):影響實例或整個資料庫,只能通過更改init.ora或SPFILE的內容來修改。靜態參數要求關閉資料庫後再重新啟動資料庫才能生效。無法對當前實例更改靜態參數。
動態參數(Dynamix parameters):可以在資料庫聯機時更改。有兩種類型的動態參數:
會話級別參數僅影響一個用戶會話。這類參數的示例有國家語言支持(NLS)參數,這些參數可用於指定排序、日期參數等的國家語言設置。這些參數可以在某個給定會話中使用,並且會在該會話結束時失效。
系統級別參數影響整個資料庫和所有會話。這類參數的示例有修改SGA_TARGET值和設置歸檔日誌目標位置。這些參數在指定的SCOPE內保持有效。要使這些參數設置永久有效,必須通過指定SCOPE=BOTH選項或手動編輯PFILE,將這些參數添加到SPFILE。
可以使用ALTER SESSION和ALTER SYSTEM命令更改動態參數。使用ALTER SYSTEM語句的SET子句可以設置或更改初始化參數值。可選的SCOPE子句用於指定更改的作用域,如下所示:
lSCOPE=SPFILE:此更改僅在伺服器參數文件中應用。不會對當前實例進行更改。對於動態和靜態參數,更改在下一次啟動後生效,並且永久保持有效。對於靜態參數來說,只允許指定該SCOPE值。
lSCOPE=MEMORY:此更改僅應用到內存中。會對當前實例進行更改,且更改立即生效。對於動態參數,更改立即生效,但不會永久保持,因為伺服器參數文件不會進行更新。對於靜態參數,不允許指定該值。
lSCOPE=BOTH:此更改會應用到伺服器參數文件和內存中。會對當前實例進行更改,且更改立即生效。對於動態參數,更改永久保持有效,因為伺服器參數文件會進行更新。對於靜態參數,不允許指定該值。
如果實例不是使用伺服器參數文件(SPFILE)啟動的,則指定SCOPE=SPFILE或SCOPE=BOTH是錯誤的。如果實例是使用伺服器參數文件啟動的,則默認值為SCOPE=BOTH;如果實例是使用文本初始化參數文件啟動的,則默認值為MEMORY。
Oracle的推導參數(Derived Parameters)也是初始化參數的一種。推導參數值通常來自於其它參數的運算,依賴其它參數計算得出,例如SESSIONS、DML_LOCKS等參數都屬於推導參數。該類參數在官方文檔中的「Default value」中由關鍵字Derived標識,例如,DML_LOCKS參數的默認值為:Derived: 4 * TRANSACTIONS,說明該參數為推導參數,它的值默認為參數TRANSACTIONS值的4倍。
如何判斷一個初始化參數的值是否是默認參數值?Oracle在視圖V$SYSTEM_PARAMETER或V$PARAMETER中提供了一個列ISDEFAULT,表示當前設置的值是否是資料庫的默認值。
如何判斷一個初始化參數的值是否是延遲生效?是否是動態參數?動態參數指的是可以使用ALTER SESSION或ALTER SYSTEM在資料庫運行時進行修改並能立即生效的參數。靜態參數指的是只能通過修改參數文件且資料庫必須要重啟才能生效的參數。Oracle在視圖V$PARAMETER中提供了一個列ISSYS_MODIFIABLE,若值為IMMEDIATE,代表參數可用ALTER SYSTEM更改,且立刻生效,該參數屬於動態參數;若值為DEFERRED,代表參數可以用ALTER SYSTEM更改,但是在新連接的會話中生效,該參數屬於動態參數;若值為FALSE,代表參數不能使用ALTER SYSTEM更改,但是若當前參數文件使用的是SPFILE,則可以使用ALTER SYSTEM更改,且下次實例啟動生效,該參數屬於靜態參數。
靜態參數示例如下所示:
動態參數示例如下所示:
延遲動態參數(DEFERRED)中,DEFERRED指定系統修改是否只對以後的會話生效(對當前建立的會話無效,包括執行此修改的會話)。默認情況下,ALTER SYSTEM命令會立即生效,但是有些參數不能「立即」修改,只能為新建立的會話修改這些參數。
(二)參數的設置方法
初始化參數的設置方法有很多種:
l通過「ALTER SYSTEM/SESSION SET參數名=參數值SCOPE = MEMORY;」的方式僅在內存裡修改。
l通過「ALTER SYSTEM SET參數名=參數值SCOPE = SPFILE;」的方式只修改SPFILE裡的值。
l通過「ALTER SYSTEM SET參數名=參數值DEFERRED SCOPE = SPFILE;」的方式設置延遲生效,也就是說這個修改只對以後連接到資料庫的會話生效,而對當前會話以及其它已經連接到Oracle的會話不會生效。
l通過「ALTER SYSTEM/SESSION SET參數名=參數值SCOPE = BOTH;」或省略BOTH這個關鍵詞可以同時修改SPFILE和MEMORY中的值。
ALTER SESSION和ALTER SYSTEM的區別如下表所示:
Oracle參數變更生效範圍如下表所示:
在RAC環境中,若想修改所有實例,則可以在ALTER SYSTEM的最後加上「SID='*'」或「SID='實例名'」即可,其中,「*」代表所有實例。
下面詳細來介紹各種參數。
(三)普通參數
普通參數就是Oracle系統正常使用的一些參數。查詢Oracle初始化參數的方式有如下幾種:
表3-13查詢Oracle初始化參數的方式
一般在查詢初始化參數的時候都習慣性地使用SHOW PARAMETER,也就是查詢V$PARAMETER視圖。V$PARAMETER視圖反映的是初始化參數在當前會話中生效的值,而V$SYSTEM_PARAMETER反映的才是實例級上的初始化參數。有關視圖V$PARAMETER的解釋參考下表:
表3-14V$PARAMETER視圖解釋
(四)非凡參數
下面分別講解3種非凡參數。
過時參數(ObsoleteParameters),顧名思義就是在Oracle以前的版本中存在,但在新版本中已經淘汰了的參數,已經不再使用的參數。在視圖V$OBSOLETE_PARAMETER中,包含這些參數的名稱和一個列ISSPECIFIED,該列用來指出這個參數是否在參數文件中已實際設置。下面的SQL腳本列出了當前系統中所有的過時參數名稱以及它們是否在當前系統中設定。
強調參數(Underscored Parameters),是指那些在新版本中保留了下來,但是除非非常需要否則不希望用戶使用的那些參數。強調參數可以通過系統視圖X$KSPPO來查看,該視圖中包含一個名為KSPPOFLAG的欄位。該欄位用來指明該參數在當前版本中是被丟棄還是被強調。若該值為1,則表示該參數已被丟棄,若該值為2,則表示該參數為強調參數。
可以看到HASH_JOIN_ENABLED這個參數為強調參數,在隱含參數中表現為「_HASH_JOIN_ENABLED」,而JOB_QUEUE_INTERVAL已變為了過時參數。
Oracle系統中還有一類參數稱之為隱含參數(Hidden Parameters),在系統中使用,但Oracle官方沒有公布的參數,這些參數可能是那些還沒有成熟或者是系統開發中使用的參數。這些參數在所有Oracle官方提供的文檔中都沒有介紹,它們的命名有一個共同特徵就是都以「_」作為參數的首字符。下面的查詢可以得到當前系統中的所有隱藏參數,需要以SYS用戶登陸,查看兩個視圖:X$KSPPI和X$KSPPCV。下面作者給出具體的SQL語句。
舉個例子,如果需要查詢隱含參數「_LM_DD_INTERVAL」的值,那麼執行上面的代碼後輸入「_LM_DD_INTERVAL」就可以看到該隱含參數的值了,如下所示:
可以看到該隱含參數的值為10。
對於隱含參數而言,修改隱含參數的值的時候需要將隱含參數用雙引號括起來。若要清除SPFILE中的隱含參數,可以使用RESET命令,如下所示:
普通用戶是不具備查詢隱含參數的權限的,可以通過創建視圖和同義詞的方式來解決這個問題,如下所示:
&說明:
有關Oracle參數的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2127338/
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。
優質麥課--
詳細內容可以添加麥老師微信或QQ私聊。
DBA寶典