2021年12月29日 星期三

6. 管理 ASM

ASM 在管理上可以使用 SQL*Plus 、 ASMCA ,與 ASMCMD 。透過 SQL*Plus 可以直接進入 ASM Instance 進行管理,指定 ORACLE_SID 為 +ASM1 (RAC 第一個 node 的 ASM Instance) 並以 sysasm 權限進入:

$ export ORACLE_SID=+ASM1

$ sqlplus / as sysasm

SQL> 


進入後就與一般的 Database Instance 操作無異,可以進行查詢、修改參數…等,對於 ASM Instance 來說,最高權限為 sysasm 而非 sysdba ,使用 sysdba 進入後有些操作會無法進行,例如 create diskgroup 就無法使用 sysdba 進行操作。 ASM Instance 當中比較會異動到的參數為 asm_diskstring 與 asm_power_limit , asm_diskstring 是用來設定讀取 ASM Disk 的路徑,目的是要讓 ASM Instance 知道 ASM Disk 所在的位置,例如 ASM Disk Group 是由 /dev/sda 、 /dev/sdb …等 Disk 所組成,那麼 asm_diskstring 就會設定為 /dev/sd* ; asm_power_limit 是用來設定 ASM Disk Rebalance 的速度,預設為 1 表示最慢,最大可設置為 11 ,如果 ASM Disk Group 的 COMPATIBLE.ASM 屬性設置為 11.2.0.2 以上,則 asm_power_limit 最大可為 1024 ,當有 ASM Disk 新增或移除時, ASM Disk Group 便會進行 Rebalance 的動作,希望它 Rebalance 越快完成, asm_power_limit 就可以設置大一點,然而 Rebalance 越快也代表者需要消耗較多的 I/O 資源在 Rebalance 作業上,對效能具有一定的影響。


進入到 ASM Instance 除了參數的設定外,最常做的就是檢查 ASM Disk Group 與 ASM Disk 的狀態,這些可以透過 v$asm_diskgroup 、 v$asm_disk 與 v$asm_attribute 來進行查詢,例如檢查 ASM Disk Group 的狀態、可用空間…等,就可以使用 v$asm_diskgroup 來查詢:


如果要知道目前 Disk Group 有哪些 ASM Disk 以及是否有可用的 ASM Disk ,則是透過 v$asm_disk 來查詢:


v$asm_attribute 則是用來查詢每個 Disk Group 的屬性,其中比較重要的屬性是 compatible.asm 、 compatible.rdbms 與 disk_repair_time :


compatible.asm 用來設置能夠使用此 Disk Group 的 ASM Instance 最低版本,例如 compatible.asm 設置為 10.1 ,那麼就表示 Oracle 10g 以上版本的 ASM Instance 都可以使用此 Disk Group ,如果 compatible.asm 設置為 11.2 ,那麼由 Oracle 10g 所啟動的 ASM Instance 就無法存取此 Disk Group ,必須要 Oracle 11g 以上版本的 ASM Instance 才可以存取; compatible.rdbms 表示能夠使用此 Disk Group 的資料庫最低版本,例如 compatible.rdbms 設置為 11.2.0 ,那麼只有在 Oracle 11R2 以後版本的資料庫才可以把 Data File 放置在此 Disk Group 當中; disk_repair_time 表示 Disk Group 可容許 ASM Disk 遺失的時間,例如有實體的硬碟損壞,那麼在 Disk Group 當中便會看到此 ASM Disk 狀態為 OFFLINE , ASM 會暫時保留這個 ASM Disk 在 Disk Group 裡面,如果超過了 disk_repari_time 的設定時間還沒有修復好這個損壞的 Disk ,那麼 ASM Disk Group 才會把這個遺失的 Disk 正式移出 Disk Group 。要修改 Disk Group 屬性可以透過 alter diskgroup set attribute 指令修改,例如將 disk_repair_time 修改為 24h :


SQL> alter diskgroup data set attribute 'disk_repair_time' = '24h';


這邊要注意的是,不是每個 attribute 都可以隨意更改,像是 compatible 屬性只能往上調整不能往下調整,例如 compatible.rdbms 已經設置為 11.2.0 就不能修改為 10.1 ,假設此時還有 Oracle 10g 的資料庫存在,那麼就會變得無法使用,因此修改此參數必須謹慎;有些 attribute 是在 Disk Group 建立後就無法更改,例如 au_size ,如果嘗試修改的話便會報錯:


ASMCA 是一個圖形化介面的工具,可以用來新增刪除 Disk Group 、幫 Disk Group 添加或移除 ASM Disk ,以及建立 ACFS 。設定好 XWindow 工具之後執行 asmca 便可以使用,例如新增一個 Disk Group 只需點選 create 以及選擇要加入的 ASM Disk 即可:


透過 asmca 來建立一個 ACFS 也是相當的方便,首先由一個 Disk Group 建立出一個 Volume :


再由此 Volume 建立出 ACFS 即可:


不同版本下的 asmca 介面略有不同,但整體的操作方式是一樣的。


ASMCMD 是一個 command line tool ,由於 ASM Disk Group 不會顯示在作業系統上面,無法使用作業系統的命令來檢視 Disk Group 的內容與狀態,而 ASMCMD 就是用來檢視 ASM Disk Group 所用,首先須設定好 ORACLE_HOME 為 Grid Infrastructure 的安裝目錄, ORACLE_SID 為 +ASM1 ,然後直接執行 asmcmd 就會進入 ASMCMD> 的介面底下,在 ASMCMD> 底下就可以使用作業系統般的指令來檢視 Disk Group 的內容,例如 ls 、 cd …等指令都可在 ASMCMD> 底下執行:


早期 ASM 剛推出的時候,由於在作業系統上不可見,常常被詬病為黑盒子,但有了 asmcmd 這項工具後,檢視 Disk Group 的內容便可以一目了然,在管理上添加了許多便利性。


進入到 asmcmd 以後,可以簡單的執行 lsdg ,這個命令會列出所有 Disk Group 的狀態與可用空間,其實內容就與查詢 v$asm_diskgroup 的內容一樣,只不過透過 asmcmd 查詢更加方便:


其中 Total_MB 表示整個 Disk Group 的總空間; Free_MB 表示整個 Disk Group 剩餘的可用空間,這裡不計算冗餘; Req_mir_free_MB 表示當有 Disk 損壞時,剩下的 Disk 需要保留多少空間才可以維持冗餘的水準; Usable_file_MB 表示在計算有 Disk 損壞的情況下,還能夠維持冗餘水準的可用空間。例如一個 Normal Redundancy 的 Disk Group DATADG ,裡面總共設定三個 Failure Group (FG1,FG2,FG3) ,每個 Failure Group 都有兩顆 Disk ,每個 Disk 100G :

以上 Total_MB 為 600G ;假設已經使用了 50G ,那麼此時的 Free_MB 就為 550G ; Req_mir_free_MB 會從寬計算,會以最大的 Failure Group 大小作為計算值,因此這邊的 Req_mir_free_MB = 200G ,也就是說當有 Disk 損壞時,剩下的可用空間必須要大於 200G 才能夠保持兩份的 Normal Redundancy 冗餘; Usable_file_MB 表示安全可用空間,也就是說在計算當有 Disk 損壞時還能夠保持兩份冗餘的情況下的可用空間,因此這邊的 Usable_file_MB = (Free_MB - Req_mir_free_MB) / 2 (Normal Redundancy 可用空間要除以 2) = (550 – 200)/2 = 175G 。


由於 Usable_file_MB 是在預先考量有 Disk 損壞的情況下所計算出來的,因此當 Free_MB 小於 Req_mir_free_MB 的時候, Usable_file_MB 就會出現負值,此時並不代表空間不足夠,只是說當有 Disk 損壞時無法維持冗餘的水準,如果 Disk Group 的空間足夠的話,建議平時還是維持安全可用空間的水準 (Usable_file_MB > 0) 。


由於 ASM 的架構不同於一般的檔案系統,因此剛推出的時候會讓人覺得陌生,不過經由這些工具的輔助,相信 DBA 也會對這項功能越來越熟悉,管理起來會更得心應手。



5. Oracle ASM 架構

Oracle ASM (Automatic Storage Management) 是從 Oracle 10g 開始推出的新功能,為了用來搭配 RAC 所使用的一種存儲結構,有了 ASM 之後,搭建 RAC 就不再需要第三方的 Cluster File System ,自此 Oracle 便擁有了一套完整的 Cluster 架構。 ASM 一開始於 Oracle 10g 推出的時候,是歸於 Database Home 底下進行管理,而從 Oracle 11g 之後, ASM 就屬於 Grid Infrastructure 的一部分了。


傳統磁碟的使用方式是將磁碟做成 Volume ,然後再將其 Format 成 File System 並掛載在作業系統上,之後就可以存放檔案了;而 ASM 則是完全取代了這一部分,這個部分以 ASM 的 Disk Group取代之,檔案存放在 ASM 的 Disk Group 裡面。


ASM Disk Group 是一種邏輯的存儲概念,一個 Disk Group 由一個或多Disk 所構成,有點類似 Tablespace 與 Data File 這種邏輯與實體結構 :


對於 Oracle 資料庫的邏輯結構來說,底層的 Physical block 會 Format 成 Oracle Block ,多個 Oracle Block 構成 Extent ,多個 Extent 構成 Segment ,最上層的 Tablespace 則是由實體的 Data File 所構成;對於 ASM 來說,首先將實體的 Disk 格式化為 ASM Disk ,一個或多個 ASM Disk 組成一個 Disk Group ,在 Disk Group 裡面存放的檔案稱作 ASM File ,而 ASM File 裡面又可以劃分多個 Allocation Unit (AU) , AU 則是由底層的 Physical Block 所構成。


ASM 的 Allocation Unit (AU) 在建立 Disk Group 的時候就必須決定每個 AU 的大小,在 Oracle 10g 的時候 AU 預設為 1M ,到了 Oracle 12c 之後預設則為 4M ,也是比較建議的大小。一個 ASM File 是由多個 AU 所組成,而 ASM 的特性是會將這些 AU 平均分散在每個 ASM Disk 上面,如果有 ASM Disk 新增或者是移除,它也會動態的平衡 (Rebalance) 到這些新增或者是移除所剩下的 ASM Disk 上面,這個行為有點類似 Storage 的 RAID 0 結構。


ASM 除了動態平衡的特性之外,也可以為 AU 設置冗餘,用途是為了避免當 ASM Disk 損壞時造成資料的遺失,冗餘必須在 Disk Group 建立時決定是否設置, External Redundancy 表示不設置冗餘,所有的 AU 都只有一份 ; Normal Redundancy 表示每一個 AU 都維持兩份, High Redundancy 表示每一個 AU 都複製成三份。當有冗餘設置時,在一個 ASM Disk Group 裡面必須再劃分 Failure Group , Failure Group 的用意在於每一個 AU 的 copy 必須存放在不同的 Failure Group 上面,這樣當一份損毀時,還有另外一份可以用。 Failure Group 的概念就是將一個 ASM Disk Group 裡面的 ASM Disk 進行分組,每一個 AU 的 copy 必須存放在不同組別上,這樣才有保護的作用,在 Normal Redundancy 架構下必須劃分兩個 Failure Group 以上; High Redundancy 則是要劃分三個 Failure Group 以上, Normal Redundancy 可以容許一個 Failure Group 完全損壞,因為所有的 AU 都保留兩份,損壞了一份還有一份可用,同理 High Redundancy 則是可以容許兩個 Failure Group 損壞,如果在建立 Disk Group 時沒有自行將 ASM Disk 分組為 Failure Group ,則預設一個 ASM Disk 自己會做為一個 Failure Group 所使用,例如一個 ASM Disk Group 裡面有四個 ASM Disk ,如果沒有指定哪些 ASM Disk 屬於哪個 Failure Group ,則這四個 ASM Disk 自己都會是一個 Failure Group ,也就是總共會有四個 Failure Group 。 ASM 這種冗餘的概念,有點類似 Storage 的 RAID 1 結構,但不同的是, RAID 1 是 Disk 對 Disk 做 Mirror ,而 ASM 則是以 AU 為單位作為 Mirror ,每一個 AU 的 Primary copy 與 Secondary copy 不一定是在哪個 ASM Disk 上面,可以確定的是,它們只會屬於不同的 Failure Group 。


ASM Disk Group 是由 ASM Disk 所組成,而 ASM Disk 則是由實體的 Disk 格式化成 ASM Disk 而來,實際上 ASM 只會識別作業系統上面所提供的 Disk 名稱,作業系統上面的 Disk ,底層可能是沒有經過分割的裸磁碟,或者是透過 Storage 做成 RAID 之後所形成的 Disk ,這些都可以用來作為 ASM Disk 所用,因此在冗餘的選擇上,底層可以選擇使用裸磁碟,然後只使用 ASM Disk Group 層面的 Normal 或 High Redundancy ;或者是底層已經使用冗餘 (例如 RAID 1+0) ,然後在 ASM Disk Group 層面不使用冗餘 (External Redundancy) ,這兩者都具有資料保護的作用。


ASM 的使用上,必須啟動 ASM Instance , ASM Instance 啟動之後所有的 Disk Group 才可以使用,在 Oracle 10g 的時候, ASM 屬於 Database Home 所管理,所以 ASM Instance 需要透過 DBCA 來額外建立,從 Oracle 11g 以後, ASM Instance 屬於 Grid Infrastructure 的一部分,要使用 ASM 必須要安裝 Grid Infrastructure , ASM Instance 屬於 CRS 的一部分, ASM Instance 跟隨著 CRS 一起啟動,在 ASM Instance 啟動之後, ASM 本身會產生 RBAL 、 ARBn 與 GMON 三個 Background Process :


ASM Instance 的 RBAL process 是用來管理 ASM Disk Rebalance 所用,也就是一個 Rebalance Coordinate Process ; ARBn 則是實際上執行 Disk Rebalance 的 Process ; GMON 為 Disk Group Monitor Process ,用來監控 ASM Disk ,例如新增或刪除 ASM Disk ,或者是 ASM Disk Online 、 Offline 狀態…等。對於 Database Instance 來說,如果要將 Data File 放置於 ASM ,則必須透過 ASMB 與 RBAL 兩個 Process , ASMB 是 Database Instance 用來與 ASM Instance 連線所用,也就是這兩種 Instance 之間溝通的橋樑; RBAL 則是 Database Instance 用來存取 ASM Disk 所用,也就是 Database Instance 與 ASM Disk 之間溝通的橋樑。將 Data File 建立於 ASM 只需簡單的指定 Disk Group 名稱,裡面的檔案均以 OMF 命名,好處是不用特別管理 ASM File ,或者是直接指定 Data File 的名稱也可以,只不過這個名稱對於 ASM 來說只是一個別名,其實底層還是有一個 OMF 的檔案存在:


SQL> create tablespace asm_tbs datafile '+DATADG' size 512M;

      (建立 Tablespace 至 ASM 的 DATADG ,以 OMF 命名)

SQL> create tablespace asm_tbs datafile '+DATADG/ORCL/asm_tbs01.dbf' size 512M;

      (建立 Tablespace 至 ASM 的 DATADG ,自行命名為 asm_tbs01.dbf)


我們除了可以將 Data File 放置在 ASM Disk Group 當中,也可以將其放置在 ACFS 上, ACFS (ASM Cluster File System) 是一種建立在 ASM 結構之上的一種 File System 架構, ASM Disk Group 實際上是一種直接存取 Disk 的架構,並不是像傳統在作業系統上面可以看到的一種 File System , ASM Disk Group 在作業系統上是無法看到的,必須透過 Oracle 的指令來進行查詢,而 ACFS 則是 ASM 一種進階的運用,基於 ASM Disk Group 將其劃分出 Volume ,然後將其格式化之後掛載到作業系統上面,這樣作業系統就可以看到一個 File System 掛載在上面,這個 File System 就稱作是 ACFS ,差別只在於 ACFS 是由 ASM Disk Group 所劃出的 Volume 而來,而一般的 File System 則是由傳統的 Disk Volume 所產生出來,除此之外, ACFS 是一種 Cluster File System ,必須是在 Cluster (RAC) 架構下才可以使用。另外 ACFS 與原始的 Disk Group 差別在於, ASM Disk Group 只能存放 Oracle 相關的檔案,例如資料庫的 Data File 、 Archive Log 、 RMAN 備份 , expdp 的 dump 檔…等,而 ACFS 則是在作業系統上可見的 File System ,與一般的檔案系統無異, ACFS 可以放置任何的檔案。


對於 Disk Group 的規劃,一般建議建立兩個 Disk Group ,一個為 DATADG ,用來放置資料庫的 Data File ,另一個為 RECODG ,用來放置資料庫的 Redo Log 與 Archive Log ,除此之外,可以獨立建立一個 SYSTEMDG 專門來放置 Grid Infrastructure 的 OCR 與 Voting Disk,這些不一定要建立單獨 Disk Group 來存放,可與 DATADG 放置在一起,唯一要注意的是,放置 OCR 與 Voting Disk 的 Disk Group ,如果設置為 Normal Redundancy ,那至少要設定三組以上的 Failure Group ; 如果為 High Redundancy ,那麼至少要設定五組以上的 Failure Group 。