"오라클 ASM"의 두 판 사이의 차이
DB CAFE
(→테이블 스페이스 정보 조회 SQL) |
(→Redundancy) |
||
34번째 줄: | 34번째 줄: | ||
==== Redundancy ==== | ==== Redundancy ==== | ||
− | * Disk Group 내의 한 디스크에 장애가 날 경우 전체 Disk Group 내의 데이터를 모두 손실할 수 있기 때문에 안정성(Redundancy)를 위해 Disk Group을 생성할 때 3가지 방법으로 설정할 수 있음. | + | * Disk Group 내의 한 디스크에 장애가 날 경우 전체 Disk Group 내의 데이터를 모두 손실할 수 있기 때문에 안정성(Redundancy,중복)를 위해 Disk Group을 생성할 때 3가지 방법으로 설정할 수 있음. |
# Normal: 2-way mirroring. 디스크가 2배 필요함 | # Normal: 2-way mirroring. 디스크가 2배 필요함 | ||
# High: 3-way mirroring. 디스크가 3배가 필요함 | # High: 3-way mirroring. 디스크가 3배가 필요함 | ||
51번째 줄: | 51번째 줄: | ||
# Change tracking bitmaps | # Change tracking bitmaps | ||
# Data Pump dumpsets | # Data Pump dumpsets | ||
+ | |||
==== ASM Extents ==== | ==== ASM Extents ==== | ||
* File System 환경에서 Oracle이 디스크에 데이터를 저장할 때 block -> extent 단위로 저장하는 것과 마찬가지로 ASM 환경에서도 Block에 해당되는 AU(Allocation Unit)와 AU가 여러 개 모인 Extent를 사용해 ASM Disk에 데이터 저장 | * File System 환경에서 Oracle이 디스크에 데이터를 저장할 때 block -> extent 단위로 저장하는 것과 마찬가지로 ASM 환경에서도 Block에 해당되는 AU(Allocation Unit)와 AU가 여러 개 모인 Extent를 사용해 ASM Disk에 데이터 저장 |
2024년 8월 20일 (화) 17:51 기준 최신판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
2 ASM 을 사용하는 이유[편집]
2.1 효율적인 디스크 관리[편집]
- 디스크 추가/삭제 작업을 보다 쉽게 할 수 있음.
- 기존 방식은 디스크 추가 후 DBA가 수동으로 작업을 해야 했지만, ASM 방식은 DB 중단 없이 Oracle이 자동으로 해줌
- 관리자가 ASM Disk Group에 새로운 디스크를 추가/제거하기만 하면 나머지 후속 작업은 ASM에서 자동으로 Rebalancing(재배치) 작업을 해줌.
2.2 디스크 I/O의 효과적인 분산[편집]
- 기존 방식은 RAID로 구현되어 있어도 디스크가 교체되거나 추가되면 기존 디스크와 신규 디스크 사이에 데이터가 균등하게 분산되지 못하고 한쪽으로 쏠리는 현상 발생.
- ASM은 AU(Allocation Unit) 단위로 나누어서 서로 다른 디스크에 균등하게 데이터를 분산시켜 저장
- 기존 RAID의 스트라이핑 방식은 디스크 튜닝이 중요 했지만 ASM 방식은 AU로 자동 관리해 주기 때문에 디스크 I/O 성능이 아주 많이 향상 됨.
- 오라클에 최적화 되어 있음.
2.3 비용의 절감[편집]
- 기존 방식의 경우 고가의 RAID 장비를 별도로 구매해서 설치/운영
- ASM을 도입하여 Oracle에서 Software적으로 RAID의 기능들을 구현하기 때문에 별도의 하드웨어나 소프트웨어 구입 비용 없이 디스크 장애 대비, I/O 분산을 통한 성능 향상.
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가지 방법으로 설정할 수 있음.
- Normal: 2-way mirroring. 디스크가 2배 필요함
- High: 3-way mirroring. 디스크가 3배가 필요함
- External: ASM mirroring 기능을 사용하지 않음. 이 경우 반드시 RAID 기능으로 디스크를 보호하고 있을 경우에만 사용 권장.
- 일반 디스크를 ASM Disk Group으로 사용하기 위해서는 물리적 디스크를 논리적 ASM Disk로 구성해야 함.
- -> 일반 디스크를 특정 파일 시스템으로 포맷하는 것과 동일한 원리
- ASM Disk에 관리될 수 있는 파일 목록
- Control files
- Data files, temporary data files, data file copies
- SPFILEs
- Online redo logs, archive logs, Flashback logs
- RMAN backups
- Disaster recovery configurations
- Change tracking bitmaps
- 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
/