2021年11月2日 星期二

2. RAC 基礎架構

Oracle RAC 在 Oracle 10g 這個版本開始才比較成熟, Oracle自從 10g 開始有了自己的 Cluster Ware ,搭建 RAC 已經不需要仰賴第三方的 Cluster Ware 。在搭建 RAC 之前,首先要求硬體的基本配置如下:

  • 主機的部分要求兩台或兩台以上的 Server ,需安裝 Oracle Cluster Ware 所支援的作業系統。

  • 網路的部分每台 Server 需要設定兩個網段,一個是對外網段 (Public IP) ,用來提供對外服務的連線所用;另一個是對內網段 (Private IP) ,俗稱心跳線,為 Cluster 成員之間聯繫所用。不論是對內或對外網段,都要求作業系統上所設定的網卡名稱必須相同,例如對外網段的網卡名稱為 eth0 ,那麼所有 Cluster Server 上所設定的對外網卡名稱必須都為 eth0 ;同理若是對內網段的網卡名稱為 eth1 ,那麼所有 Server 的對內網段的網卡名稱必須為 eth1 ,由於心跳線對於 Cluster 來說相對重要,如果有問題的話,很容易發生節點驅逐的情況 (Node Eviction) ,一般來說會針對心跳線做 Redundancy ,例如將兩張網卡綁成一張, eth1 與 eth2 兩個綁成一個 bond0 ,避免單點故障,當然綁成 bond0 之後,所有 Server 上也必須都是 bond0 這個名稱。

  • 存儲 (Storage) 的部分要求共享磁碟,也就是說必須設定 Storage 讓所有的 Server 可以共同存取。


在準備好硬體環境之後,便可以安裝 Oracle Cluster Ware 來搭建 RAC , RAC 搭建完成後會有以下的結構,首先是每台 Server 上面都會運行維持 RAC 運作的 Service Daemon ,對於 RAC 來說,有三個重要的 Daemon 必須存在:


  • CSSD (Cluster Synchronization Services Daemon) : 在作業系統上會運行 ocssd 這個 process ,主要的用途是用來偵測 RAC 節點的成員是否存活,以及自己是否為這個 RAC 成員所屬,當 CSSD 有偵測不到的節點時,就會開始發起仲裁行動,將偵測不到的成員進行驅逐。 CSSD 也是 RAC 啟動時最早執行的 Daemon 。

  • CRSD (Cluster Resource Services Daemon) : 在作業系統上會運行 crsd 這個 process , CRSD 可以說是整個 RAC 架構上的本體,為 RAC 的核心 process , CRSD 用來管理 Cluster 上的所有服務,包括 VIP 、 Database Instance 、 Listener 、 ASM …等, RAC 是否成功啟動,就單看 CRSD 是否有正常運行。

  • EVMD (Event Manager Daemon) : 在作業系統上會運行 evmd 這個 process , EVMD 為事件監控程式,當 RAC 的相關 process 發生異常時, EVMD 便會將這些異常的事件紀錄到 log 當中。


這三個 Daemon 是 RAC 最原始的 Process ,在 RAC 安裝完成後,會於 /etc/init.d 底下設定 init.cssd 、 init.crsd 以及 init.evmd ,也就是說在 Server 開機啟動的時候,同時也啟動這些 RAC 的 Process ,如果不想要 RAC 在 Server 開機的時候啟動,那麼就將這些設定註解掉即可。


在網路的部分, RAC 成功啟動後,每台 Server 都會啟動屬於自己的 VIP , VIP 主要是用來提供對外服務的連線所用,因此 VIP 是設定在對外 (Public) 的網段上, RAC 之所以具有高可用性的特性,就是因為有 VIP 的設定,當 RAC 其中一個節點不可用時,其所在的 VIP 便會轉移到其它節點上,讓 Client 的連線可以繼續運行:

VIP 是在 RAC 成功啟動後才會賦予上去的,在安裝階段,每台 Server 需規劃出一組沒有人在使用的 IP Address 作為將來 VIP 所用。


在 Storage 的部分, RAC 架構上有兩個重要的磁碟, OCR 與 Voting Disk :


  • OCR (Oracle Cluster Repository) : 為 Oracle Cluster 的設定檔,用來記錄 CRS 的設定以及其它 Resource 的狀態等資訊,透過 CRS Daemon 來存取與更新。

  • Voting Disk : 仲裁磁碟,在 Oracle 10g 時可以設定一個或三個 Voting Disk ,當 CSS 偵測到異常節點時,用來決定是否將其驅逐 (Eviction) :

例如在 3 個節點的 RAC 當中,其中第三台的心跳線斷線了,因此 Node1 回報說它只認得節點 1 與 2 ; Node2 回報說它也只認得節點 1 與 2 ;而 Node3 只回報說它只認得節點 3 ,經由這些資訊,便可以知道 Node3 與其它節點失去了聯繫,因此最終會將 Node3 進行驅逐 (Node Eviction) 。


OCR 與 Voting Disk 在 Oracle 10g 時還不能存放在 ASM ,必須額外規劃 RAW Disk 來使用,到了 Oracle 11g 之後就都存放在 ASM 了。


搭建 RAC 在 Shared Storage 的選擇上,可以使用 Raw Volumes (但 Oracle 11g 之後已不支援此方式) 、 Cluster File system (例如 IBM GPFS 、 Veritas VCS 、 OCFS2 …等) ,以及 ASM 。 ASM 是 Oracle 為了因應 RAC 需求所獨創的存儲方式,也是目前使用最多、最建議搭配的 Storage 選項,這樣一來從 Database 、 Cluster Ware ,以及 Storage ,都是 Oracle 自有品牌,整個 RAC 的結構也趨於完整。



2021年10月7日 星期四

1. RAC 介紹

Oracle Real Application Cluster (簡稱 RAC) 是一種資料庫的叢集 (Cluster) 架構,最早在 Oracle 8i 稱作 Parallel Server ,從 Oracle 9i 開始有了 RAC 這個名稱。早在 Oracle 9i 當時, Oracle 還沒有屬於自己的 Cluster Ware ,搭建 RAC 需要配合第三方的 Cluster 軟體來輔助,例如 Sun Cluster 、 IBM 的 HACMP 、 HP 的 Service Guard 、 Veritas Cluster (VCS) …等,到了 Oracle 10g 以後便推出了屬於 Oracle 自己的 Cluster Ware 並配合 ASM 的架構下來搭建 RAC ,從此以後就不再需要第三方的 Cluster 軟體了,到了 Oracle 11g 之後, RAC 改稱為 Grid Infrastructure 直至今日的版本,不論是早期的 Parallel Server 或者是 RAC 、 Grid Infrastructure ,指的都是 Oracle Cluster 架構。


所謂的 Cluster ,指的就是將多台 Server 組成一個 Group ,這個 Group 底下所有的成員用來支撐同一種服務,如果是只有一台 Server ,那麼當這台 Server 有問題的時候,運行在上面的服務也就不能使用;而 Cluster 的好處在於有多台 Server 來支撐服務,所以當其中有一台 Server 發生問題時,這個 Cluster 群組裡還有其它的 Server 可以用來運行服務,此時不會因為單一 Server 發生狀況而導致服務中斷,而多台 Server 如何能夠組成一個 Group ,這時候就是需要叢集軟體 (Cluster Ware) 來達成。



Cluster 在種類上可以分為 Sharing Everything 與 Sharing Nothing 兩大類, Sharing Everything 表示所有的 Server 必須共享一個存儲,這個 Storage 的空間必須共同給所有的 Server 來使用;而 Sharing Nothing 表示每台 Server 都有屬於自己的存儲空間,並且每台 Server 都擁有這項服務的一部分資料。對於 RAC 來說,使用的是 Sharing Everything 架構,所以搭建 RAC 前的其中一項任務,就是要設定好 Shared Storage 來給所有 Server 來使用。



Cluster 架構在服務的提供上,多數的 Cluster 只能做到 Active – Standby 架構,也就是平時只有 Cluster 群組中的一個 Server 來提供服務,如果這台 Server 發生問題的話,再由另一台 Server 接手繼續提供服務:

 


而 Oracle RAC 是少數能夠真正做到 Active – Active 服務的架構,並且不需要額外的 Management Server 來避免叢集發生腦裂 (Split-brain) 的情況。 Active – Active 架構是在叢集中所有的 Server 都能夠用來提供服務,當中如果有 Server 發生問題的話,其餘的 Server 仍然是可以馬上接手提供服務:



有了 Cluster 的概念之後,那麼就可以進一步理解 RAC Database 的構成,傳統單機資料庫來說,是一個 Instance 對應一個 Database :


而 RAC Database ,是多台 Server ,每個 Server 都有一個 Instance ,共同來支撐同一個資料庫:


RAC Database 的優點是,由於有多個 Instance 來支撐這個資料庫,因此不會因為有某台 Server 或某個 Instance 發生問題導致資料庫無法運行,只要其中有一個 Instance 還活著,那麼資料庫就可以正常的運行;其次是可以把服務分散在不同個 Instance 上執行,傳統單一 Server 的狀況下,如果 Server 的負載過重,那麼只能想辦法來增加硬體資源,而 RAC 的好處是有多個 Instance ,把服務分散在這些 Instance 上執行也就等於分散了每台 Server 的負載,萬一所有的 Server 都已經滿載,那麼 RAC 還可以添加 Server 到這一個叢集當中,而這個添加的過程不需要停止資料庫服務。


目前現實環境來說,都希望提供的服務可以不中斷, RAC 就提供了非常好的 HA (High Availability)  機制,為多數企業建置資料庫時的優先選擇,但這邊要注意的是, RAC 的優點在於它的高可用性機制,資料庫的效能不會因為把它轉換為 RAC 然後就會提升,如果使用不好的話很有可能因為 Global Cache 的因素導致效能下降,雖然 RAC 本身提供了 Load Balance 機制,但是建議在 RAC 的使用上,把服務區分並且運行在不同的 Instance 上會是比較好的做法,例如一個 RAC 資料庫 ORCL 提供了 A,B 兩種服務,那麼規劃上把 A 服務運行在 Instance 1 (ORCL1) 、 B 服務運行在 Instance 2 (ORCL2) ,這種使用方式會是比較好的選擇。



2021年10月5日 星期二

11.2 RMAN

RMAN 是 Oracle 用來備份的主要工具,最早起源於 Oracle 8i ,直到目前已經是 Oracle 資料庫主要的備份方式了,不論是冷備份或是熱備份都可以使用 RMAN 來達成, RMAN 進行冷備份必須將資料庫開啟至 mount 狀態下再進行備份,由於資料庫需重新啟動至 mount ,此時不如將資料庫 shutdown 後直接將檔案 copy 備份起來比較直觀,因此很少用 RMAN 來進行冷備份,多數的情況下都是在資料庫運行的過程中,使用 RMAN 來做一個熱備份。RMAN 取代了傳統使用 alter database begin backup 的方式,將備份統一由 RMAN 的介面單一完成,不須像 begin backup 那樣要使用作業系統命令來 copy 資料庫檔案,而且只要撰寫好一個腳本便可以適用所有的資料庫。


透過 RMAN 連線到資料庫便可以進行備份與還原的動作,使用 " rman target / " 或者是 " rman 帳號/密碼@<db_tnsnames> " 就可以進入 RMAN> 的提示符號下進行作業, RMAN 的指令大致上可以作為以下分類:


1. 連線指令: "connect" ,例如 "connect target /" 、 "connect catalog rman/rman@rman" 、 "connect auxiliary sys/welcome1@stby" 。


2. SQL 指令: "sql" ,主要用途是在 RMAN> 介面底下執行 SQL 指令,只需在前面加上 "sql" 就可以執行 SQL 指令,例如 "SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';" 。到了 Oracle 12c 之後, RMAN> 介面可以直接執行 SQL 指令了,不須再加上 "sql" 。


3. 設定 RMAN 參數指令: "configure" ,例如設定 archive log 清理規則 "configure archivelog deletion policy to shipped to all standby" 。


4. 顯示設定內容: "show" ,例如顯示目前 RMAN 所有設定 "show all" 。


5. 備份還原相關指令: 備份 "backup" 、 還原 "restore" ,復原 "recover" ,其中 "restore" 指的是把 Data File 還原回來;而 "recover" 則是用來 apply archive log 。


6. 管理相關指令: "list" 列出備份相關資訊,例如 "list backup of database" ; "report" 用來分析備份與還原資訊,例如列出超過 retention policy 的備份 "report obsolete" 、 列出需要備份的檔案 "report need backup" ; "crosscheck" 用來檢查實際上存在於作業系統的備份檔案與資料庫所記錄的備份資訊是否相符,如果不相符,那麼那些紀錄將會被標示為 expired ,例如 "crosscheck backup" 、 "crosscheck archivelog all" 。


RMAN 指令執行的方式可分為兩種,一種是直接在 RMAN> 底下執行,另外一種是使用批次方式執行,所有命令必須寫在 RUN{} 底下這個區塊。


RMAN 可以將資料庫備份到作業系統的 filesystem ,或者是直接備份到磁帶,在執行備份前必須使用 "allocate channel" 來告訴 RMAN 要備份到哪裡,如果是備份到 filesystem 則執行 "allocate channel ch1 type disk" ;如果是備份到磁帶,則是 "allocate channel ch1 type sbt_tape" ,一個 channel 代表一個 RMAN 的 process ,我們可以 allocate 多個 channel 來讓 RMAN 使用多個 process 來進行備份或還原的任務。


一個完整的 RMAN 資料庫備份必須包含 Data File 、 Control File 、 Archive Log 與 Spfile ,例如備份到 filesystem :

$ rman target /

RMAN> run {

 crosscheck backup;

 crosscheck archivelog all;

 allocate channel ch1 type disk;

 allocate channel ch2 type disk;

 backup database format '/opt/app/dump/rman/fulldb_%s_%t.bak';

 sql 'alter system archive log current';

 backup archivelog all format '/opt/app/dump/rman/archivelog_%t_%s.bak' delete input;

 backup current controlfile format '/opt/app/dump/rman/controlfile_%s_%t.bak';

 backup spfile format '/opt/app/dump/rman/spfile_%t_%s.bak';

 release channel ch1;

 release channel ch2;

}        


其中 %s 用來設定 backup set 的編號; %t 為 backup set 加上時間戳記;備份 Archive Log 可加上 delete input 指令,用途是在備份完成後將 Archive Log 刪除。


如果是備份到磁帶的話,則需將 channel 設定為 type sbt_type ,例如透過 NBU 來做備份:

$ rman target /

RMAN> run {

 allocate channel ch1 type sbt_tape;

 allocate channel ch2 type sbt_tape;

 send 'NB_ORA_SERV=nbubak,NB_ORA_CLIENT=oradb1';

 backup database format '/opt/app/dump/rman/fulldb_%s_%t.bak';

 release channel ch1;

 release channel ch2;

}        


如果在 NBU 的 bp.conf 裡面有設定好 SERVER 與 CLIENT_NAME 的話,那麼在 RMAN 裡面則可以省去 "send 'NB_ORA_SERV=nbubak,NB_ORA_CLIENT=oradb1'" 這一段。


又例如透過 IBM TSM 來做備份,則設定環境變數如下:

$ rman target /

RMAN> run {

 allocate channel ch1 type sbt_tape parms

'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)';

 backup database format '/opt/app/dump/rman/fulldb_%s_%t.bak';

 release channel ch1;

 release channel ch2;

}        


RMAN 備份到不同廠牌的磁帶機設定都略有不同,大體上都是提供磁帶機 library 的位置給 RMAN 就可以備份到磁帶上面。


RMAN 除了做 full database backup 之外,也可以進行 incremental backup ,使用 incremental backup 必須賦予一個 backup level <號碼> ,這個 backup level 是用來對備份做一個旗標,用來告訴 RMAN 需要 incremental backup 的範圍在哪裡,所以在進行 incremental backup 之前必須要做一次 full backup ,往後的備份才有 incremental 的基準,在這邊做 full backup 時必須要特別指定 incremental level 0 ,有了這個 level 0 之後才可以進行 incremental backup:

$ rman target /

RMAN> run {

 allocate channel ch1 type disk;

 backup incremental level 0 database format '/orabak/fulldb_%s_%t.bak';

 release channel ch1;

 }        


有了 incremental level 0 之後就可以進行 incremental backup ,有兩種模式 Differential Incremental Backup 與 Cumulative Incremental Backup 。 Differential 模式所 incremental 的區間為 incremental level 小於或等於前一個 level ;而 Cumulative 模式所 incremental 的區間只有抓與小於前一個 level 。例如每日所設定的 incremental level 如下:


週日進行 incremental level 0 的全備份,週一、二、四、五設定為 incremental level 2 ,週三與週六設定為 incremental level 1 。對於週一來說,它只需找前一個比它 level 小的來作為 incremental 區間,所以週一會備份 incremental 週日 ~ 週一這個區段;對於週二來說,它的設定為 incremental level 2 ,在 Differential 模式下,它會找前一個與它相同或是小於它的 level 來做 incremental 區間,週一同樣為 level 2 ,所以它會 incremental 週一 ~ 週二這段區間 (綠色部分) ,而在 Cumulative 模式下,它只會找前一個比它小的 level ,所以它會 incremental 週日 ~ 週二這段區間 (紅色部分) ,後面以此類推。


預設為 Differential 模式,備份時只需提供 incremental level 就好:

$ rman target /

RMAN> run {

 allocate channel ch1 type disk;

 backup incremental level 2 database format '/orabak/fulldb_%s_%t.bak';

 release channel ch1;

 }        


如果要使用 Cumulative 模式,則需要加上 Cumulative 關鍵字:

$ rman target /

RMAN> run {

 allocate channel ch1 type disk;

 backup incremental level 2 cumulative database format '/orabak/fulldb_%s_%t.bak';

 release channel ch1;

 }


一個完整的資料庫還原,必須逐步的還原 Spfile 、 Control File 與 Data File ,最後再 apply 所需的 archive log , RMAN 提供了特殊的啟動指令 "startup force nomount" ,有了這個指令可以不需要任何的參數檔暫時的啟動 Database Instance ,透過這個暫時的啟動,我們就可以用來還原參數檔 spfile ,還原完 spfile 再正常地將 instance 啟動至 nomount :

$ rman target /

RMAN> startup force nomount;

RMAN> restore spfile from '/orabak/spfile_20211004_470aonnu_1_1';

RMAN> shutdown immediate

RMAN> startup nomount


還原完 spfile 之後,接下來必須要還原 Control File ,由於資料庫的備份資訊都存放在 Control File 裡面,所以必須將 Control File 還原,有了備份資訊,接下來系統才能夠逐步找到備份檔來還原 Data File :

RMAN> restore controlfile from '/orabak/controlfile_132_1085038213';

RMAN> alter database mount;


順帶一提,如果是使用 NBU 備份,則可以使用 NBU 命令 "bplist -t 4 -l -R /" 來檢視備份檔。


還原完 Control File 之後,就可以簡單執行 restore 與 recover 命令來還原整個資料庫,此時系統就會自動的從 Control File 裡面所記錄的備份資訊抓取所需的備份檔來還原:

RMAN> restore database;

RMAN> recover database;


更進階一點,可以使用 set 指令來指定要還原到哪個時間點或 scn , set 指令必須放入 RUN{} 裡面來執行:

RMAN> run {

set until scn 99410585;

restore database;

recover database;

 }

  (指定還原到哪個 SCN)

RMAN> run {

set until time "to_timestamp('20211005 17:00:00','yyyymmdd hh24:mi:ss')";

restore database;

recover database;

 }

  (指令還原到哪個時間點)


還原完畢後就可以將資料庫開啟,完成整個步驟:

$ sqlplus / as sysdba

SQL> alter database open resetlogs;


由於備份紀錄存放在 Control File 當中,因此 Control File 顯得相對重要,如果 Control File 遺失,那麼很有可能就無法還原整個資料庫,為了避免這個問題,我們可以建立一個 Catalog DB ,將備份的紀錄存放在 Catalog DB 當中,如此一來等於多添加了一份保險。


建立 Catalog DB ,實際上就是建立一個 DB ,然後把經由 RMAN 備份的資料庫的備份資訊存放在這個 DB 當中,一個 Catalog DB 可以存放多個 DB 的備份資訊,這邊要注意的是, Catalog DB 的字元集必須要是這些 DB 的 Superset ,且資料庫版本必須要大於或等於這些 DB ,例如經由 RMAN 備份的 DB 有 11.2.0.2 、 10.2.0.4 、 12.1.0.1 …等版本,那麼在 Catalog DB 建置的挑選上,就要選擇使用 12.1.0.1 的版本。


建置 Catalog DB ,首先必須先創立一個 Catalog 的使用者,並授予recovery_catalog_owner 的權限,例如創建一個使用者 RCAT作為 Catalog 的使用者:

SQL> create user rcat identified by welcome1 default tablespace users;

SQL> grant connect,resource,recovery_catalog_owner to rcat;


使用者創建完成後,接下來要創建 Catalog 所使用的物件,使用 RMAN 登入 Catalog DB ,並執行 create catalog 建立物件,這樣就完成 Catalog DB 的建置:

$ rman catalog rcat/welcome1@catalogdb

RMAN> create catalog;


建置完 Catalog DB 後,接下來就是要把需要存放備份資訊的 DB 註冊進來,例如將 orcl 這個資料庫註冊到 Catalog DB:

$ export ORACLE_SID=orcl

$ rman target / catalog rcat/welcome1@catalogdb

RMAN> register database;


註冊完成後,可執行 report schema 來檢查,如果有列出此 DB 的相關資訊,那麼就表示有註冊成功:


有了 Catalog DB 後,那麼在備份的同時就可以將備份紀錄存放到 Catalog DB 當中:

$ rman target / catalog rcat/welcome1@catalogdb

RMAN> run {

 allocate channel ch1 type disk;

 backup incremental level 0 database format '/orabak/fulldb_%s_%t.bak';

 release channel ch1;

 }        


對於資料庫還原來說,我們只需要藉由 Catalog DB 把 Control File restore 回來:

$ rman target / catalog rcat/welcome1@catalogdb

RMAN> startup nomount;

RMAN> restore controlfile;

RMAN> alter database mount;

RMAN> exit;

$ rman target /

RMAN> restore database;

RMAN> recover database;

RMAN> alter database open resetlogs;


Control File 還原回來後,因為所有的備份資訊 Control File 都有紀錄,因此接下來的還原過程就不需要 Catalog DB 了。


目前 RMAN 已經是 Oracle 資料庫最主要的備份還原方式了, DBA 必須要對這項工具非常熟悉才行。