其实这是错误的,FAILGROUP是用于将磁盘分组,以保证丢失任何一组FAILGROUP磁盘,数据还是完整的
多用于多阵列,通过ASM来完成冗余的环境。(EXTERNAL只能有一个FAILGROUP)
假设有4个阵列,每个阵列3块盘,使用NORMAL REDUNDANCY创建DISKGROUP,4个FAILGROUP
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,一共1025M,2个冗余
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 |
其相关的1026个AU都是可访问的
在看看元数据,元数据每个冗余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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8242091/viewspace-671590/