1. 程式人生 > >oracle 12.2 local temp的原理和實現

oracle 12.2 local temp的原理和實現

從Oracle資料庫12c開始可以將Oracle Clusterware和Oracle RAC配置在大型叢集中,稱為Oracle Flex叢集。 這些叢集包含兩種型別的節點:Hub節點和Leaf節點。 Hub節點緊密連線,可以直接訪問共享儲存,並作為一個或多個Leaf 節點的錨點。 leaf 節點與Hub節點鬆動連線,可能無法直接訪問共享儲存。

隨著12.2的釋出,如果是FLEX叢集,可以在LEAF NODE建立read only例項,從而引入了local temp表空間的概念。

local temp和local undo的概念不一樣,首先pdb必須使用自己的temp表空間,local temp指的是RAC環境下,可以在各自的節點上建立local temp表空間,擁有各自的temp表空間就跟擁有各自的PGA一樣,對於只讀節點來說大的排序需要用到temp時就不需要去看這塊空間另外一個節點有沒有使用,另外避免了兩邊同時使用temp表空間產生的爭用。 


首先,PDB不能使用CDB的temp表空間,PDB和CDB上temp檢視查出來的結果都不一樣: 連線到PDB1,並檢視當前的臨時表空間

PDB

建立新的臨時表空間,設定為預設,並刪掉原來的臨時表空間

測試最初的臨時表空間不存在

檢視當前的臨時表空間

以sysdba連線,再次查詢

sysdba

dba_temp_files的SHARED欄位中表明瞭型別,local有兩種型別,RIM是read_only例項,ALL是所有例項

SHARED: for shared temporary tablespace
LOCAL_ON_ALL: for local temporary tablespace on all instances
LOCAL_ON_RIM: 

for local temporary tablespace on read-only instances

官方給的建立語句有兩處問題,一是未指定tempfile的大小,二是local temp是BIGFILE型別,所以不能指定AUTOEXTEND,也不能新增第二個tempfile。

先來看LOCAL_ON_ALL,建立語句如下,(由於沒有RAC環境只能在單例項上測試)

查詢資料庫當前的大檔案表空間,臨時檔案和臨時表空間

資料庫

從作業系統層面檢視

從上面可以看到,理論上會建立各自的tempfile,在指定檔名結尾加上_1和_2,但是不知V$TEMPFILE檢視中為什麼沒有標明詳細的檔名。
LOCAL_ON_RIM由於需要read only的例項,建立會報錯ORA-32778

[[email protected] ~]$ oerr ORA 32778
32778, 00000, “DDL operations are disabled on local temporary tablespaces FOR LEAF.”
// *Cause: A DDL operation on a local temporary tablespace FOR LEAF was
// attempted in a system without any read-only running instances.
// *Action: Add at least one read-only instance to the cluster.

read writ的例項會優先使用shared的臨時表空間,再使用local的臨時表空間 ;read only的例項優先使用local的臨時表空間,再使用shared的臨時表空間 

其他操作都類似,具體可以參考官方文件
http://docs.oracle.com/database/122/RACAD/introduction-to-oracle-rac.htm#RACAD-GUID-E84E3BA2-7F36-406B-B630-CD651E0C856F

文章來自微信公眾號:資料和雲