RAC Database 是由兩台或以上的 Server 來支撐一個資料庫,每個 Server 都會啟動一個屬於此資料庫的 Instance 且各自獨立,每個 Instance 都擁有屬於自己的 SGA 與 Background Process ,再加上與 Global Service 相關的 Daemon :
這邊複習一下 Oracle 資料庫的組成架構,為 Instance + Database ,對於 RAC Database 來說, Instance 的部分是建構在每一個 RAC 節點上,所以與 Instance 相關的成分是各自獨立的;而 Database 的部分則是 Control File 、 Data File 等結構,這個部分則是共享的並且存放在 Shared Storage 上,比較特殊的是,使用者連線到 RAC 資料庫實際上是連線到 RAC 的某一個 Instance 當中,所以使用者有可能在第一個 Instance 進行交易或是在第二個 Instance 進行交易,因此每個 Instance 都必須要有屬於自己的交易紀錄,所以每個 Instance 都會有一份屬於自己的 Redo Log File ,透過 v$log 與 v$logfile 可以查到各個 Instance 的 Redo Log File :
新增 Redo Log File 必須使用 thread 來指定此 Redo Log 是要新增在哪一個 Instance 上,而刪除 Redo Log File 則只需指定 group number :
同樣的道理對於 Undo Tablespace 來說,每個 Instance 也都必須設定各自的 Undo Tablespace , Undo Tablespace 則是透過資料庫參數來設定,例如將第二個 Instance 的 Undo Tablespace 設定為 UNDOTBS2_1 :
雖然每個 Instance 都有各自的 Redo / Undo ,但 Redo Log File 與 Undo Tablespace 都必須放置在共享的 Shared Disk 上,因為在執行 Instance / Media Recovery 的時候必須要讀取所有的 Redo / Undo 資訊,如果沒有放置在共享磁碟上,那麼就有可能因為讀取不到所有的 Redo / Undo 資訊造成 Recovery 失敗。
RAC Database 的參數檔 Spfile 必須是共享的,而資料庫參數有些是必須所有的 Instance 的設置都要一樣,有些參數則是每個 Instance 可以設置不同,透過 Spfile 產生出 Pfile 可以發現參數內容與 Single Instance Database 略有不同:
參數當中使用 "*." 代表此參數是所有 Instance 的設置都一樣,不一樣的是 "orcl1." 以及 "orcl2." 代表著此參數於這個 Instance 的設定,例如 " orcl1.undo_tablespace='UNDOTBS1' " 表示 orcl1 這個 Instance 設定的 undo_tablespace 為 UNDOTBS1 ,使用 alter system 更改參數時加上 sid= 來指定更改某一個 Instance 的參數,如果不使用 sid= 或者是 sid='*' 則是所有 Instance 都套用此參數,例如 :
在所有的參數當中,有些參數必須所有 Instance 都必須一致而有些參數則是 Instance 之間可以設定不同,例如 compatible 、 control_files 、 db_name 、 db_unique_name …等參數必須所有 Instance 相同; memory_target 、 sga_target …等參數可以每個 Instance 設定不同,大致上來說與 Instance 相關的參數可以個別設定不同,與 Database 相關的參數則是所有 Instance 必須相同,比較特殊的是 thread 、 instance_number 、 undo_tablespace 這幾個參數必須每個 Instance 都不同。
RAC Database 指定 Spfile 的方式可以透過 pfile 於每個 Instance 的 $ORACLE_HOME/dbs 底下設定,例如 initorcl1.ora 的內容設定為 SPFILE='+DATA/orcl/spfileorcl.ora' ,那麼 orcl1 啟動時就會經由 initorcl1.ora 去找到共享的 spfile ,另外一種方式就是設定在 Cluster 裡面,使用 srvctl config database 指令可以查詢目前資料庫於 Cluster 中的設定 :
使用 srvctl 來開啟資料庫時就會由 Cluster 抓取這個設定來開啟,如果要更改 spfile 的設定,則可以使用 srvctl modify database –h 來查詢 srvctl modify 指令需帶入哪個參數來更改。
RAC Database 的啟動與關閉可以透過 sqlplus 或者是 srvctl 來達成,只要是 RAC 其中一個 Instance 啟動就視為此 RAC Database 已經開啟;而 RAC Database 關閉則是要所有的 Instance 都 Shutdown 才視為關閉。使用 sqlplus 操作與一般 single instance 的作法沒有差別,先將其中一個 Instance 開啟後,其它 Instance 再陸續的啟動 :
使用 srvctl 則是經由 Cluster 來發動啟動與關閉的命令 :
建議 RAC Database 統一使用 srvctl 指令來操作,管理上較為方便。
RAC Database 於管理上來說,則是多了 Global View (gv$ 開頭的 view) 可供查詢, v$ 的 view 只能查詢到當前 Instance 的資訊,而 gv$ 的 view 則是可以查詢所有 Instance 的訊息,差別在於 gv$ 多了 inst_id 的欄位,經由 inst_id 可以得知其它 Instance 的資訊,例如我們透過 gv$instance 來檢查所有 Instance 的狀態 :
對於 AWR 來說,每個 Instance 都會建立屬於自己的 AWR Snapshot ,建立 AWR Report 可以選擇每個 Instance 獨立產生自己的 AWR Report ,或者是可以建立 RAC Database 整體的 AWR Report 。建立單獨 Instance 的 AWR Report 與一般 Single Instance 無異,需登入此 Instance 後執行 $ORACLE_HOME/rdbms 底下的 awrrpt.sql 來產生,除此之外可以選擇使用 awrrpti.sql ,它會詢問要產出哪一個 Instance 的 AWR Report ,而 awrrpt.sql 則是直接產出當前連線 Instance 的 AWR Report ;若是要產出整體 RAC Database 的 AWR Report ,則是使用 awrgrpt.sql 產出。
RAC Database 的備份透過 RMAN 與備份 Single Instance Database 時的操作差別不大, 在於 RAC Database 可以將 channel 分佈到多個 Instance 上來處理如此而已,例如三個 Instance 各分配一個 channel 來備份 :
RAC Database 在管理上無須想的太複雜,其實也不就多了幾個 Instance 而已,重點還是在於要了解 RAC 本身的架構,相信對 RAC 架構有一定的了解之後,操作 RAC Database 也一定不是什麼難事。