행위

오라클 ASM

DB CAFE

thumb_up 추천메뉴 바로가기


2 ASM 을 사용하는 이유[편집]

2.1 효율적인 디스크 관리[편집]

  1. 디스크 추가/삭제 작업을 보다 쉽게 할 수 있음.
  2. 기존 방식은 디스크 추가 후 DBA가 수동으로 작업을 해야 했지만, ASM 방식은 DB 중단 없이 Oracle이 자동으로 해줌
  3. 관리자가 ASM Disk Group에 새로운 디스크를 추가/제거하기만 하면 나머지 후속 작업은 ASM에서 자동으로 Rebalancing(재배치) 작업을 해줌.

2.2 디스크 I/O의 효과적인 분산[편집]

  1. 기존 방식은 RAID로 구현되어 있어도 디스크가 교체되거나 추가되면 기존 디스크와 신규 디스크 사이에 데이터가 균등하게 분산되지 못하고 한쪽으로 쏠리는 현상 발생.
  2. ASM은 AU(Allocation Unit) 단위로 나누어서 서로 다른 디스크에 균등하게 데이터를 분산시켜 저장
  3. 기존 RAID의 스트라이핑 방식은 디스크 튜닝이 중요 했지만 ASM 방식은 AU로 자동 관리해 주기 때문에 디스크 I/O 성능이 아주 많이 향상 됨.
  4. 오라클에 최적화 되어 있음.

2.3 비용의 절감[편집]

  1. 기존 방식의 경우 고가의 RAID 장비를 별도로 구매해서 설치/운영
  2. ASM을 도입하여 Oracle에서 Software적으로 RAID의 기능들을 구현하기 때문에 별도의 하드웨어나 소프트웨어 구입 비용 없이 디스크 장애 대비, I/O 분산을 통한 성능 향상.

3 ASMcmd 명령어[편집]

3.1 실행명령어[편집]

asmcmd

4 ASM Disk Group[편집]

4.1 ASM Disk Group 개요[편집]

  • ASM에서는 디스크를 여러 개 묶어서 Disk Group으로 관리
  • 1개의 Group에는 최소 2개의 디스크 필요.
  • 데이터가 입력되면 AU 단위로 나누어서 Disk Group 별로 분산시켜 저장.
  • AU는 COARSE-grained 방식과 FINE grained의 두 가지 옵션을 가짐.
    - COARSE : AU 단위는 1MB, 주로 Data File과 Archive Log File에 사용
    - FINE : AU 단위는 128KB, Redo Log File, Control File, Flashback Log File을 디스크에 기록할 때 사용.
  • 11g ASM 부터는 AU의 종류가 1/2/4/8/16/32/64MB로 다양하게 지원되며 Disk Group을 생성할 때 지정할 수 있게 되어 성능 향상.

4.1.1 Redundancy[편집]

  • Disk Group 내의 한 디스크에 장애가 날 경우 전체 Disk Group 내의 데이터를 모두 손실할 수 있기 때문에 안정성(Redundancy)를 위해 Disk Group을 생성할 때 3가지 방법으로 설정할 수 있음.
  1. Normal: 2-way mirroring. 디스크가 2배 필요함
  2. High: 3-way mirroring. 디스크가 3배가 필요함
  3. External: ASM mirroring 기능을 사용하지 않음. 이 경우 반드시 RAID 기능으로 디스크를 보호하고 있을 경우에만 사용 권장.
  • 일반 디스크를 ASM Disk Group으로 사용하기 위해서는 물리적 디스크를 논리적 ASM Disk로 구성해야 함.
    -> 일반 디스크를 특정 파일 시스템으로 포맷하는 것과 동일한 원리
  • ASM Disk에 관리될 수 있는 파일 목록
  1. Control files
  2. Data files, temporary data files, data file copies
  3. SPFILEs
  4. Online redo logs, archive logs, Flashback logs
  5. RMAN backups
  6. Disaster recovery configurations
  7. Change tracking bitmaps
  8. Data Pump dumpsets

4.1.2 ASM Extents[편집]

  • File System 환경에서 Oracle이 디스크에 데이터를 저장할 때 block -> extent 단위로 저장하는 것과 마찬가지로 ASM 환경에서도 Block에 해당되는 AU(Allocation Unit)와 AU가 여러 개 모인 Extent를 사용해 ASM Disk에 데이터 저장
  • ASM 내부에서 데이터를 효과적으로 관리하기 위한 다양한 Extent Size를 제공
    • 최초 2만개: 해당 Disk Group의 AU size와 동일(0 - 19999)
    • 다음 2만개: AU size * 4의 크기입니다. (20000 - 39999)
    • 그 다음 나머지들: AU size * 16 (40000+)
      데이터가 많아질 수록 AU 크기가 증가
      --> 데이터의 양이 많아 지면서 I/O를 줄이기 위함

4.2 datagroup 목록[편집]

ASMCMD> lsdg

4.3 disk 진행사항[편집]

ASMCMD> lsdg

4.4 ASM 작업[편집]

  • 자주 사용하는 오라클 ASM 명령어 (Command)

4.4.1 sqlplus를 사용하여 디스크 그룹 생성 및 삭제[편집]

  • 콘솔 로 sqlplus 접속
bash-4.1$ . oraenv

ORACLE_SID = [TEST] ? +ASM

The Oracle base remains unchanged with value /u01/app

bash-4.1$ sqlplus / as sysasm

SQL*Plus: Release 11.2.0.3.0 Production on Mon Apr 14 14:47:25 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Automatic Storage Management option

SQL>
4.4.1.1 디스크 그룹 생성 (external)[편집]
SQL> create diskgroup ddgroup1 external    
  2  redundancy disk '/dev/rdsk/c7t4d0s6';

Diskgroup created.
4.4.1.2 디스크 그룹 삭제[편집]
SQL> drop diskgroup DDGROUP1 including contents;

Diskgroup dropped.
4.4.1.3 disk group 생성 (normal)[편집]
SQL> create diskgroup ddgrouup1 normal redundancy 
  2  failgroup cont1 disk '/dev/rdsk/c7t4d0s6'
  3  failgroup cont2 disk '/dev/rdsk/c7t5d0s6';

Diskgroup created.
4.4.1.4 disk group 삭제[편집]
SQL> drop diskgroup DDGROUUP1 including contents;

Diskgroup dropped.
4.4.1.5 disk group 생성 (high)[편집]
SQL> create diskgroup ddgrouup1 high redundancy
  2  failgroup cont1 disk '/dev/rdsk/c7t4d0s6'
  3  failgroup cont2 disk '/dev/rdsk/c7t5d0s6'
  4  failgroup cont3 disk '/dev/rdsk/c7t6d0s6';

Diskgroup created.
4.4.1.6 disk 그룹 삭제[편집]
-> disk group 생성 (high)
SQL> drop diskgroup ddgrouup1 including contents;
Diskgroup dropped.
4.4.1.7 디스크 그룹에 디스크 추가[편집]
SQL> alter diskgroup DATA add disk 
  2  '/dev/rdsk/c7t4d0s6' name DATA_0002;

Diskgroup altered.
4.4.1.8 디스크 그룹에 디스크 삭제[편집]
SQL> alter diskgroup DATA drop disk DATA_0002;
Diskgroup altered.

-> 디스크 그룹 삭제하려고 할때 삭제가 완료되기 전 undrop하여 삭제작업 취소

SQL> alter diskgroup  DATA 
  2  drop disk DATA_0002;
Diskgroup altered.

SQL> alter diskgroup DATA undrop disks;
Diskgroup altered.

-> ASM 디스크 그룹을 만들때 속성값을 지정할 수 있다.

SQL> create diskgroup DATA2 normal redundancy
  2  disk '/dev/rdsk/c7t4d0s6','/dev/rdsk/c7t5d0s6'
  3  attribute 'compatible.asm'='11.2';

Diskgroup created.

SQL> drop diskgroup DATA2 including contents;

Diskgroup dropped.


4.4.1.9 sqlplus에서 메타데이터 검색 했을때쿼리[편집]
select f.type, f.redundancy, f.striped, f.modification_date,
       a.system_created, a.name
  from v$asm_alias a, v$asm_file f 
 where a.FILE_NUMBER=f.FILE_NUMBER 
   and a.GROUP_NUMBER=f.GROUP_NUMBER
   and type='DATAFILE';
4.4.1.10 asmcmd에서 메타데이터 검색 했을때[편집]
bash-4.1$ asmcmd
Connected to an idle instance.
 (주의 : 위에처럼 idle instance로 떨어지면 sql이던 asmcmd이건 잘못 접속 된 것이다.)

bash-4.1$ . oraenv
ORACLE_SID = [TEST] ? +ASM

The Oracle base remains unchanged with value /u01/app

bash-4.1$ asmcmd

ASMCMD> 

ASMCMD> ls -l +DATA/TEST/datafile

Type      Redund  Striped  Time             Sys  Name

DATAFILE  UNPROT  COARSE   APR 13 20:00:00  Y    EXAMPLE.265.844406343
DATAFILE  UNPROT  COARSE   APR 13 20:00:00  Y    SYSAUX.257.844406197
DATAFILE  UNPROT  COARSE   APR 13 20:00:00  Y    SYSTEM.256.844406195
DATAFILE  UNPROT  COARSE   APR 13 20:00:00  Y    UNDOTBS1.258.844406197

5 ASM Disk 그룹 조회[편집]

  • V$ASM_DISKGROUP
SELECT GROUP_NUMBER,NAME,STATE,TOTAL_MB,FREE_MB
  FROM V$ASM_DISKGROUP;

6 ASM Disk 조회[편집]

  • GV$ASM_DISK
SELECT GROUP_NUMBER
     , DISK_NUMBER
     , NAME
     , MOUNT_STATUS
     , PATH
     , TOTAL_MB
  FROM GV$ASM_DISK;

7 ASM File 조회[편집]

SELECT GROUP_NUMBER
     , FILE_NUMBER
     , ROUND ((BYTES / 1024 / 1024), 1)     MB
     , REDUNDANCY
     , TYPE
  FROM V$ASM_FILE;

8 ASM Disk 그룹/패스 조회[편집]

  • V$ASM_DISK , V$ASM_DISKGROUP
SELECT G.NAME                       DG_NAME
     , D.PATH                       PATH
     , D.TOTAL_MB                   DISK_SIZE_MB
     , G.DATABASE_COMPATIBILITY     DB_COMPATIBILITY
     , G.COMPATIBILITY              ASM_COMPATIBILITY
  FROM V$ASM_DISK D
     , V$ASM_DISKGROUP G
 WHERE G.GROUP_NUMBER = D.GROUP_NUMBER;

9 테이블 스페이스 정보 조회 SQL[편집]

  • V$ASM_DISK_STAT
-- 그룹별 사용량 
SELECT GROUP_NUMBER
     , NAME
     , TOTAL_MB
     , FREE_MB
 FROM V$ASM_DISK_STAT;
  • V$ASM_DISKGROUP
-- col name format a10
-- col USABLE_FILE_GB format 999,999.00
-- col TOTAL_GB       format 999,999.00
-- col FREE_GB        format 999,999.00
-- col USABLE_CALC_GB format 999,999.00

SELECT GROUP_NUMBER                                      "Group#"
     , NAME
     , TOTAL_MB / 1024                                   TOTAL_GB
     , ROUND ((TOTAL_MB - USABLE_FILE_MB) / 1024, 2)     USED_GB
     , USABLE_FILE_MB / 1024                             USABLE_FILE_GB
     , FREE_MB / 1024                                    FREE_GB
     , 100 - ROUND (FREE_MB / TOTAL_MB * 100)            "usgae(%)"
     , ((FREE_MB - REQUIRED_MIRROR_FREE_MB)) / 1024      USABLE_CALC_GB
     , TYPE
     , STATE
  FROM V$ASM_DISKGROUP;
  • V$ASM_FILE , $ASM_ALIAS , V$ASM_DISKGROUP
SELECT G.NAME                                    "GROUP_NAME"
           -- F.GROUP_NUMBER
           --       , G.TOTAL_MB
           , ROUND (G.FREE_MB / 1024, 1)               "GROUP_FREE(GB)"
           --       , F.FILE_NUMBER
           , ROUND (SPACE / 1024 / 1024 / 1024, 1)     "REAL_SIZE(GB)"
           , ROUND (BYTES / 1024 / 1024 / 1024, 1)     "USABLE_SIZE(GB)"
           --       , A.ALIAS_DIRECTORY
           , MAX (A.NAME)                              "FILE_NAME"
        FROM V$ASM_FILE F, V$ASM_ALIAS A, V$ASM_DISKGROUP G
       WHERE     F.GROUP_NUMBER = A.GROUP_NUMBER
             AND F.FILE_NUMBER = A.FILE_NUMBER
             AND A.GROUP_NUMBER = G.GROUP_NUMBER
             AND SYSTEM_CREATED = 'Y'
    GROUP BY (G.NAME
            , ROUND (G.FREE_MB / 1024, 1)
            , ROUND (SPACE / 1024 / 1024 / 1024, 1)
            , ROUND (BYTES / 1024 / 1024 / 1024, 1))
    ORDER BY G.NAME, MAX (A.NAME);
col gname form a10
col dbname form a10
col file_type form a14

SELECT
    gname,
    dbname,
    file_type,
    round(SUM(space)/1024/1024) mb,
    round(SUM(space)/1024/1024/1024) gb,
    COUNT(*) "#FILES"
FROM
    (
        SELECT
            gname,
            regexp_substr(full_alias_path, '[[:alnum:]_]*',1,4) dbname,
            file_type,
            space,
            aname,
            system_created,
            alias_directory
        FROM
            (
                SELECT
                    concat('+'||gname, sys_connect_by_path(aname, '/')) full_alias_path,
                    system_created,
                    alias_directory,
                    file_type,
                    space,
                    level,
                    gname,
                    aname
                FROM
                    (
                        SELECT
                            b.name            gname,
                            a.parent_index    pindex,
                            a.name            aname,
                            a.reference_index rindex ,
                            a.system_created,
                            a.alias_directory,
                            c.type file_type,
                            c.space
                        FROM
                            v$asm_alias a,
                            v$asm_diskgroup b,
                            v$asm_file c
                        WHERE
                            a.group_number = b.group_number
                        AND a.group_number = c.group_number(+)
                        AND a.file_number = c.file_number(+)
                        AND a.file_incarnation = c.incarnation(+) ) START WITH (mod(pindex, power(2, 24))) = 0
                AND rindex IN
                    (
                        SELECT
                            a.reference_index
                        FROM
                            v$asm_alias a,
                            v$asm_diskgroup b
                        WHERE
                            a.group_number = b.group_number
                        AND (
                                mod(a.parent_index, power(2, 24))) = 0
                            and a.name like '&&db_name'
                    ) CONNECT BY prior rindex = pindex )
        WHERE
            NOT file_type IS NULL
            and system_created = 'Y' )
WHERE
    dbname like '&db_name'
GROUP BY
    gname,
    dbname,
    file_type
ORDER BY
    gname,
    dbname,
    file_type
/