ASM的FAILGROUP

westzq1984發表於2010-08-22
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE以前一直以為NORMAL REDUNDANCY的話,FAILGROUP就是2HIGH REDUNDANCY的話,FAILGROUP就是3

其實這是錯誤的,FAILGROUP是用於將磁碟分組,以保證丟失任何一組FAILGROUP磁碟,資料還是完整的

多用於多陣列,通過ASM來完成冗餘的環境。(EXTERNAL只能有一個FAILGROUP

 

假設有4個陣列,每個陣列3塊盤,使用NORMAL REDUNDANCY建立DISKGROUP4FAILGROUP

CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY

 FAILGROUP controller1 DISK

 'ORCL:ASM01', 'ORCL:ASM02', 'ORCL:ASM03'

 FAILGROUP controller2 DISK

 'ORCL:ASM04', 'ORCL:ASM05', 'ORCL:ASM06'

 FAILGROUP controller3 DISK

 'ORCL:ASM07', 'ORCL:ASM08', 'ORCL:ASM09'

 FAILGROUP controller4 DISK

 'ORCL:ASM10', 'ORCL:ASM11', 'ORCL:ASM12';

 

然後在上面建立一個1G的資料檔案

CREATE TABLESPACE asmtest DATAFILE '+DGROUP1' SIZE 1024M

 

然後看看資料的冗餘程度

SQL> SELECT COUNT(DISTINCT PXN_KFFXP),COUNT(DISTINCT XNUM_KFFXP)

  2    FROM X$KFFXP

  3   WHERE GROUP_KFFXP = 3

  4      AND NUMBER_KFFXP =256

  5      AND xnum_kffxp <> 2147483648;

 

COUNT(DISTINCTPXN_KFFXP) COUNT(DISTINCTXNUM_KFFXP)

------------------------ -------------------------

                    2050                      1025

--資料檔案為1024M,加上一個BLOCK0,一共1025M2個冗餘

 

SQL> SELECT COUNT(DISTINCT PXN_KFFXP),COUNT(DISTINCT XNUM_KFFXP)

  2    FROM X$KFFXP

  3   WHERE GROUP_KFFXP = 3

  4      AND NUMBER_KFFXP =256

  5      AND xnum_kffxp = 2147483648;

 

COUNT(DISTINCTPXN_KFFXP) COUNT(DISTINCTXNUM_KFFXP)

------------------------ -------------------------

                       3                         1

--記錄塊分配的後設資料冗餘3份,其他後設資料也是冗餘3

 

假設出現某個failgroup損壞

SQL> SELECT COUNT (DISTINCT xnum_kffxp)

  2    FROM X$KFFXP a,v$asm_disk b

  3   WHERE GROUP_KFFXP = 3

  4     AND b.group_number=3

  5     AND NUMBER_KFFXP =256

  6     AND a.disk_kffxp = disk_number

  7     AND b.failgroup <> 'CONTROLLER&i'

  8  ;

Enter value for i: 1

old   7:    AND b.failgroup <> 'CONTROLLER&i'

new   7:    AND b.failgroup <> 'CONTROLLER1'

 

COUNT(DISTINCTXNUM_KFFXP)

-------------------------

                     1026

 

SQL> /

Enter value for i: 2

old   7:    AND b.failgroup <> 'CONTROLLER&i'

new   7:    AND b.failgroup <> 'CONTROLLER2'

 

COUNT(DISTINCTXNUM_KFFXP)

-------------------------

                     1026

 

SQL> /

Enter value for i: 3

old   7:    AND b.failgroup <> 'CONTROLLER&i'

new   7:    AND b.failgroup <> 'CONTROLLER3'

 

COUNT(DISTINCTXNUM_KFFXP)

-------------------------

                     1026

 

SQL> /

Enter value for i: 4

old   7:    AND b.failgroup <> 'CONTROLLER&i'

new   7:    AND b.failgroup <> 'CONTROLLER4'

 

COUNT(DISTINCTXNUM_KFFXP)

-------------------------

                     1026

 

其相關的1026AU都是可訪問的

 

在看看後設資料,後設資料每個冗餘3份,任何一個FAILGROUP損壞,都能保證資料是完整的

SQL> SELECT NUMBER_KFFXP, XNUM_KFFXP, COUNT(*)

  2    FROM X$KFFXP

  3   WHERE GROUP_KFFXP = 3

  4     AND NUMBER_KFFXP < 100

  5   GROUP BY NUMBER_KFFXP, XNUM_KFFXP

  6   ORDER BY 1, 2;

 

NUMBER_KFFXP XNUM_KFFXP   COUNT(*)

------------ ---------- ----------

           1          0          3

           1          1          3

           2          0          3

           3          0          3

           3          1          3

           3          2          3

           3          3          3

           3          4          3

           3          5          3

           3          6          3

           3          7          3

           3          8          3

           3          9          3

           3         10          3

           3         11          3

           3         12          3

           3         13          3

           3         14          3

           3         15          3

           3         16          3

           3         17          3

           3         18          3

           3         19          3

           3         20          3

           3         21          3

           3         22          3

           3         23          3

           3         24          3

           3         25          3

           3         26          3

           3         27          3

           3         28          3

           3         29          3

           3         30          3

           3         31          3

           3         32          3

           3         33          3

           3         34          3

           3         35          3

           3         36          3

           3         37          3

           3         38          3

           3         39          3

           3         40          3

           3         41          3

           3 2147483648          3

           4          0          3

           4          1          3

           5          0          3

           6          0          3

 

50 rows selected.

 

SQL> SELECT COUNT(*)

  2    FROM (SELECT DISTINCT NUMBER_KFFXP, XNUM_KFFXP

  3    FROM X$KFFXP A, V$ASM_DISK B

  4   WHERE GROUP_KFFXP = 3

  5     AND B.GROUP_NUMBER = 3

  6     AND NUMBER_KFFXP < 100

  7     AND A.DISK_KFFXP = DISK_NUMBER

  8     AND B.FAILGROUP <> 'CONTROLLER&i') ;

Enter value for i: 1

old   8:    AND B.FAILGROUP <> 'CONTROLLER&i')

new   8:    AND B.FAILGROUP <> 'CONTROLLER1')

 

  COUNT(*)

----------

        50

 

SQL> /

Enter value for i: 2

old   8:    AND B.FAILGROUP <> 'CONTROLLER&i')

new   8:    AND B.FAILGROUP <> 'CONTROLLER2')

 

  COUNT(*)

----------

        50

 

SQL> /

Enter value for i: 3

old   8:    AND B.FAILGROUP <> 'CONTROLLER&i')

new   8:    AND B.FAILGROUP <> 'CONTROLLER3')

 

  COUNT(*)

----------

        50

 

SQL> /

Enter value for i: 4

old   8:    AND B.FAILGROUP <> 'CONTROLLER&i')

new   8:    AND B.FAILGROUP <> 'CONTROLLER4')

 

  COUNT(*)

----------

        50

 

注意,預設建立的DISKGROUP,每個磁碟就是一個單獨的FAILGROUP

如上面的例子,4個陣列,在沒有指定failgroup的情況下,只要一組陣列出現了當機,資料就可能無法訪問,如果指定了failgroup,一組陣列損壞後,資料仍然能保證完整

 

在來看看冗餘報告:

SQL> SELECT NAME,

  2         TYPE,

  3         TOTAL_MB,

  4         FREE_MB,

  5         REQUIRED_MIRROR_FREE_MB,

  6         USABLE_FILE_MB

  7    FROM V$ASM_DISKGROUP

  8   WHERE GROUP_NUMBER = 3;

 

NAME       TYPE           TOTAL_MB    FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

---------- ------------ ---------- ---------- ----------------------- --------------

DGROUP1    NORMAL            12228      12054                    3057           4498

 

如果failgroup失敗,那麼需要3057M的空間來恢復,大概3塊盤

 

如果是不指定failgroup建立DISKGROUP了?

CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY DISK

 'ORCL:ASM01', 'ORCL:ASM02', 'ORCL:ASM03', 'ORCL:ASM04', 'ORCL:ASM05', 'ORCL:ASM06',

 'ORCL:ASM07', 'ORCL:ASM08', 'ORCL:ASM09', 'ORCL:ASM10', 'ORCL:ASM11', 'ORCL:ASM12';

SQL> /

 

NAME       TYPE           TOTAL_MB    FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

---------- ------------ ---------- ---------- ----------------------- --------------

DGROUP1    NORMAL            12228      12057                    1111           5473

 

如果不指定,只允許一個盤損壞,需要1111M來恢復,大概1塊盤

 

USABLE_FILE_MB 不代表能使用的磁碟限制,但當該列小於0時,不能正常DROP DISK,無法完成rebalance

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-671590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章