2016年3月1日 星期二

Oracle RAC ASM Failure Group 功能測試

Oracle ASM failure group 設定


oracle asm disk group 管理可以執行asmca 的方式透過gui介面去操作


其中 ASM 提供了三種保護等級選項

1.external redundancy 表示資料保護由外部Storage系统去實現, 例如RAID,這邊指定1個disk即可。 
2.normal redundancy 表示Oracle使用2份 mirror 來保護資料,最少使用2個disk
3.high redundancy 表示Oracle使用3份 mirror 來保護資料,最少使用3個disk

normal 以及 high 設定都可以允許其中一個 failure group 損毀

然後設定redundancy後, 就不能更改 

如果在建立ASM disk group 時沒有指定failure group,

那failure groups會自己命名建立, 一個disk就是一個failure groups,也可以指定數個 disk 來建立 failure groups。

運作是像以下的圖這樣









以下是對於 Failure Group 的測試



環境說明與準備


版本 Oracle RAC 11.2.0.1.0

disk group 'DATA02'由兩組 Failure Group 組成
每個Failure Group又是3個disk組成


1.首先先把sdg分割成3個 partition(這邊就先分割一個, 另外一個我之前就分割好了 )



2.3個Partition 分別為 /dev/sdg1、/dev/sdg2、/dev/sdg3  ,各10G




3.建立 ASM Disk





4.利用剛剛所分割的disk,加上我之前已經分割好的disk總共六個Disk, 來建立 DATA02 Disk Group





也可以下指令
CREATE DISKGROUP DATA02 NORMAL REDUNDANCY
  FAILGROUP FG01 DISK
    'ORCL:DATA03' NAME DATA03,
    'ORCL:DATA04' NAME DATA04,
    'ORCL:DATA05' NAME DATA05,
  FAILGROUP FG02 DISK
    'ORCL:DATA06' NAME DATA06,
    'ORCL:DATA07' NAME DATA07,
    'ORCL:DATA08' NAME DATA08,
  ATTRIBUTE 'au_size'='1M',
    'compatible.asm' = '11.2', 
    'compatible.rdbms' = '11.2',
    'compatible.advm' = '11.2';


5.查看crs_stat -t




6.建立 Tablespace 

CREATE TABLESPACE TEST01 DATAFILE

'+DATA02' SIZE 100M AUTOEXTEND ON NEXT 10G MAXSIZE 30G
LOGGING
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;


進來ASM, 確認DATAFILE是在DATA02裡頭



7.建立Table

CREATE TABLE mirror_test
(
  data01  VARCHAR2(10)
)
TABLESPACE TEST01
RESULT_CACHE (MODE DEFAULT)
STORAGE    (
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
NOMONITORING;


環境建立好後, 開始進行以下測試



測試1 Failure Group A 內其中一個disk 損壞, Oracle 是否有影響



1.首先先查看一下 DATA02各Disk狀態 

  SELECT group_number,

         name,
         failgroup,
         header_status,
         PATH,
         total_mb,
         free_mb,
         mode_status
    FROM v$asm_disk
ORDER BY group_number;


SELECT GROUP_NUMBER,

       NAME,
       SECTOR_SIZE,
       BLOCK_SIZE,
       ALLOCATION_UNIT_SIZE,
       STATE,
       TYPE,
       TOTAL_MB,
       FREE_MB,
       REQUIRED_MIRROR_FREE_MB,
       USABLE_FILE_MB,
       OFFLINE_DISKS
  FROM v$asm_diskgroup;



這邊可以看到正常時,各Disks Header_status 都是 Member



2.破壞DATA06



dd if=/dev/zero of=/dev/sdg1 bs=4096 count=1


SQL> insert into vincentyuan.MIRROR_TEST values('123456789');

1 row created.

SQL> /

1 row created.

SQL> commit;

Commit complete.

SQL> 


資料寫入正常

PS:在這邊因為有做 Failure Group 的設定所以資料庫還可運作,但這時千萬不要把RAC關閉,再次啟動會出現無法讀取DATA02的錯誤造成資料庫無法啟動, 請把損毀的disk處理完後,在對RAC動作!!!


3.查看ASM狀態

DATA06  HEADER_STATUS出現了CANDIDATE..... 

4.移除 DATA06

SQL> alter diskgroup DATA02 drop disk DATA06 ;
(這邊可以使用指令停止drop並恢復, alter diskgroup DATA02 undrop disks;
不過我是直接毀損Disk , 所以在這邊無效 )



有時候下完指令後, 會出現以下UNKNOWN狀況... 

在使用指令在移除一次
SQL>  alter diskgroup DATA02 drop disk DATA06 force;
 




UNKNOWN狀況消失


5.移除 ASM disk

[root@node01 ~]# /etc/init.d/oracleasm deletedisk DATA06
Removing ASM disk "DATA06":                            [ OK ]

6.加入ASM disk
[root@node01 ~]# /etc/init.d/oracleasm createdisk DATA06 /dev/sdg1
Marking ASM disk "DATA06" as an ASM disk:              [ Failed ]

出現失敗訊息

加入force指令 (我這邊是等了快10分下指令才成功)

[root@node01 ~]# /usr/sbin/asmtool -C -l /dev/oracleasm -n DATA06 -s /dev/sdg1 -a force=yes
[root@node01 ~]# 
[root@node01 ~]# 

所有node scandisks
[root@node02 ~]# /etc/init.d/oracleasm scandisks
Scanning the system for Oracle ASMLib disks:               [  OK  ]

查看一下disks 是否有建立成功
[root@node02 ~]# /etc/init.d/oracleasm listdisks
DATA01
DATA02
DATA03
DATA04
DATA05
DATA06
DATA07
DATA08
OCR01
OCR02

這時候看一下ASM狀態 會多一個 空的disks 可供使用


7.把新ASM disk 加入diskgroup (這邊我也是等一下,指令才成功)



 成功!!!!!! 加入時ASM 將會自動 Rebalance 

也可以手動  Rebalance 
alter diskgroup DATA02 rebalance power 11 wait;



測試...資料庫功能

SQL> insert into vincentyuan.MIRROR_TEST values('123456789');

1 row created.

SQL> /

1 row created.

SQL> /

1 row created.

SQL> /

1 row created.

SQL> commit;

Commit complete.

SQL> 

寫入正常