Oracle ASM
ASM이란?
ASM은 데이터베이스 구성 시 기본이 되는 디스크를 효율적으로 관리하기 위하여 오라클 10g에서 새로 선보인 데이터베이스 서비스입니다. ASM은 하나의 SMP 장비뿐만 아니라 클러스터를 구성하는 모든 노드들에 대해서도 지원이 가능합니다. ASM이 관리하는 모든 디스크에 대한 업무 분산 작업을 자동적으로 처리해 줌으로써 특정 디스크에 로드가 집중되는 핫 스팟(hot spot)현상을 최소할 수 있으며 이로 인해 성능을 극대화할 수 있습니다. 또한, 데이터가 디스크에 균등한 크기로 저장 관리되어 fragmentation 현상이 발생하지 않습니다다. 그리고 ASM이 관리하는 영역에서 새로운 디스크가 추가되거나 삭제될 때마다, 기존 데이터들에 대해 재구성 작업이 자동적으로 일어납니다. 또, ASM은 특정 데이터에 대한 복사본을 자기 자신의 디스크에 유지할 수 있기 때문에 소프트웨어 미러링 효과를 볼 수 있습니다.
RAC 환경에서의 ASM 인스턴스
RAC 데이터베이스처럼 ASM 인스턴스들도 자체적으로 클러스터링을 할 수 있습니다. 이는 이미 셋업이 되어 있는 DLM 체계를 사용해서 가능한 것입니다. 일반적으로 클러스터를 이루는 하나의 노드에는 하나의 ASM 인스턴스가 뜨도록 구성합니다. 그리고 RAC 구성처럼 ASM 인스턴스가 관리하는 디스크는 모든 노드에서 인식 가능하도록 구성해야 합니다. 데이터베이스 인스턴스는 오직 동일 노드에 있는 ASM 인스턴스와 상호 통신하게 됩니다. 만약 동일 노드에 서로 다른 데이터베이스 인스턴스가 존재할 경우, 그들은 그 노드에 있는 하나의 ASM 인스턴스를 공유하게 되는 것입니다.
특정 디스크 그룹은 서로 다른 데이터베이스 파일을 저장할 수 있습니다. 이처럼 RAC 환경이 아닌 상태에서 서로 다른 데이터베이스가 동일한 디스크 그룹에 접근하는 것이 가능합니다. 또한, 하나의 데이터베이스는 동일한 ASM 인스턴스에 의해 관리되는 여러 개의 디스크 그룹에 그 데이터베이스 파일을 저장할 수도 있습니다.
Scalability
ASM imposes the following limits:
- 63 disk groups in a storage system
- 10,000 ASM disks in a storage system
- 4 petabyte maximum storage for each ASM disk
- 40 exabyte maximum storage for each storage system
- 1 million files for each disk group
- Maximum files sizes as shown in the following table:
Disk Group Type | Maximum File Size |
External redundancy | 35 TB |
Normal redundancy | 5.8 TB |
High redundancy | 3.9 TB |
ASM을 설치하기 위한 최소 설정
- ASM에 사용할 디스크가 필요합니다.
- 커널 버전에 맞는 ASMLib 파일이 필요합니다.
- Initialization Parameters for ASM Instances
- 수동으로 ASM을 구성을 위해 init파일을 작성을 합니다. 최소 다음의 내용을 작성해야 합니다.
Name | Description |
INSTANCE_TYPE | Type은 반드시 ASM으로 구성해야 합니다.
Note: 반드시 포함되어야 하는 최소한의 옵션입니다.모든 변수에서 기본이 되는 값입니다. |
ASM_POWER_LIMIT | 디스크의 기본이 되는 power해당되는 값입니다.
Default: 1, Range: 0 – 11 See Also: “Tuning Rebalance Operations” |
ASM_DISKSTRING | ASM_DISKSTRING 디스크의 순서를 생각 할 수 있습니다. Diskstring을 아래와 같이 기재하면 자동으로 인식하게 됩니다.
/dev/rdsk/* /dev/rdsk/*s3,/dev/rdsk/*s4 위의 내용을 다음과 같이 간단히 할 수도 있습니다.: /dev/rdsk/*s[34] 기본 값은 NULL이고 필수사항이 아닙니다. 기재하지 않으면 기본값으로 설정됩니다. See Also: “Improving Disk Discovery Time” |
ASM_DISKGROUPS | ASM instance 시작 시에 자동으로 Mount할 디스크 그룹의 목록을 기재하는 항목입니다. 기본 값은 NULL입니다. 만일 설정값에 아무 값도 없다면 no disk 상태로 마운트됩니다. 설정 값이 static이 아닌 dynamic으로 되어 있기 때문에 spfile에 기록해서 자동으로 ASM에 추가할 수도 있습니다.
Note: Issuing the ALTER DISKGROUP…ALL MOUNT or ALTER DISKGROUP…ALL DISMOUNTcommand does not affect the value of this parameter. |
ASM의 장점들
- 디스크 I/O의 효과적인 분산 – 스토리지를 추가하면 이전 스토리지안에 있던 자료들이 자동으로 rebalance되어서 자료들이 분산됩니다.
- VLDB지원(Very Large DB)
ASM의 Disk Group
ASM에서는 디스크를 여러개 묶어서 디스크 그룹으로 관리하는데, 1개의 그룹에는 최소 2개의 디스크가 있어야 합니다.
데이터가 들어올 때 AU라는 단위로 나누어서 각 디스크그룹별로 분산해서 저장하게 되는데,
AU(Allocation Unit)는
- COARSE grained 방식 : 1MB단위로 기록되고, 주로 data, archivelog 파일에 사용
- FINE grained 방식 : 128KB단위로 기록되고, 주로 redo, control, flashback log 파일에 사용
의 두가지 옵션을 가집니다.
(11g ASM부터는 AU의 종류가 1/2/4/8/16/32/64 MB로 다양하게 지원되어, DB운영계획에 따라 적절히 지정하여 성능개선을 할 수 있습니다.)
Rebalance
Filesystem을 사용하게 되면 디스크그룹 내에 새 디스크가 추가되거나 제거되면 성능개선을 하기 위해서는 DBA가 직접 기존 디스크의 내용을 분산하거나, 이동시켜야 합니다.
ASM을 이용하게 되면 이러한 rebalance작업은 자동으로 ASM에서 수행하게 되고, DB부하에 따라 rebalance에 얼마나 많은 CPU%를 배당할지도 지정할 수 있습니다.
SQL> alter diskgroup testdb_dg1 add disk '/dev/sdf1' rebalance power 11;
(1~11 : 1이 rebalance되는 속도가 가장느리고, 11이 가장 빠름. 11로 갈수록 rebalance하는데 더 많은 CPU부하를 일으킵니다.)
ASM에서의 Restrict 옵션
관리자가 disk group 유지보수를 하기 위해 restrict 옵션을 제공하고, 이 옵션으로 디스크그룹을 mount할 경우 일반사용자는 접속할 수 없게되어, 유지관리성능을 더 향상시킬 수 있습니다.
SQL> alter diskgroup data mount restrict;
유지보수종료 후 –> alter diskgroup data dismount; –> alter diskgroup data mount;
- ASM Instance : 디스크그룹에 대한 정보를 수집해서 Database Instance에 제공, ASMB가 교두보역할. ORACLE_SID=+ASM 으로 해당 인스턴스에 접속해서 mount, shutdown 할 수 있음
- RBAL process : 디스크추가 및 삭제 시 디스크그룹에 대한 Rebalance담당, ASM Instance의 요청이 있을 경우 디스크를 열고 닫는 프로세스
- ARBn : RBAL의 명령을 받아 실질적으로 작업을 수행하는 process
ASM parameter
- instacne_type: ASM (default: rdbms)
- db_unique_name: +asm
- asm_power+limit: 1(low)~11(high) 설정 가능. ASM 데이터 리밸런싱 속도 조정 레벨 값 (기본값 1)
- asm_diskgroups: ASM 인스턴스 시작시 구동되는 디스크 그룹
- asm_diskstring: ASM에 사용된 디스크가 포함된 물리적 경로
- asm_preferred_read_failure_groups:I/O 실패가 발생한 그룹을 명시.
ASM SGA 및 주요 parameters
: ASM Instance 를 통해서 입 출력이 되기 때문에 관련 파일과 파라미터들이 있습니다.
주요파라미터
- db_cache_size: ASM Instance 가 사용할 cache 크기 결정. 오라클권장값 64M
- shared_pool: ASM Instance를 관리하는 용도로 사용. 오라클권장값 128M
- Large_pool: Extent Maps 을 저장하는 용도. 오라클권장값 64M
※ 참고 – $ORACLE_HOME/dbs/init+ASM.ora
내용
*.asm_diskgroups=’DATA’,’FRA’ +ASM.asm_diskgroups=’DATA’,’FRA’,’NEW_ASM’#Manual Mount *.background_dump_dest=’/home/oracle/admin/+ASM/bdump’ → alert log file 저장 경로 지정 *.core_dump_dest=’/home/oracle/admin/+ASM/cdump’ → core dump 를 저장할 경로 지정 *.instance_type=’asm’ *.large_pool_size=12M *.remote_login_passwordfile=’SHARED’ *.user_dump_dest=’/home/oracle/admin/+ASM/udump’ |
▶ 위 파라미터 외 다른 파라미터를 잘못 지정 할 경우 ORA_15021 에러 발생 – ASM Instance 가 구동 되지 않습니다.
col "Parameter Name" for a40 col "Instance Value" for a20 select a.ksppinm "Parameter Name", c.ksppstvl "Instance Value" from x$ksppi a, x$ksppcv b, x$ksppsv c where a.indx = b.indx and a.indx = c.indx and ksppinm like '%asm%' order by a.ksppinm;
Parameter Name Instance Value ---------------------------------------- -------------------- _asm_acd_chunks 1 _asm_admin_with_sysdba FALSE _asm_allow_appliance_dropdisk_noforce FALSE _asm_allow_lvm_resilvering TRUE _asm_allow_only_raw_disks TRUE _asm_allow_system_alias_rename FALSE _asm_appliance_config_file _asm_ausize 1048576 _asm_automatic_rezone TRUE _asm_avoid_pst_scans TRUE _asm_blksize 4096 _asm_check_for_misbehaving_cf_clients FALSE _asm_compatibility 10.1 _asm_dba_batch 500000 _asm_dba_spcchk_thld 20000 _asm_dba_threshold 0 _asm_dbmsdg_nohdrchk FALSE _asm_diag_dead_clients FALSE _asm_direct_con_expire_time 120 _asm_disable_amdu_dump FALSE _asm_disable_async_msgs FALSE _asm_disable_multiple_instance_check FALSE _asm_disable_profilediscovery FALSE _asm_disable_smr_creation FALSE _asm_disable_ufg_dump FALSE _asm_disk_repair_time 14400 _asm_emulate_nfs_disk FALSE _asm_emulmax 10000 _asm_emultimeout 0 _asm_evenread 2 _asm_evenread_alpha 0 _asm_evenread_alpha2 0 _asm_evenread_faststart 0 _asm_fail_random_rx FALSE _asm_fd_cln_idle_sess_twait 10000000 _asm_fd_cln_on_fg TRUE _asm_fob_tac_frequency 9 _asm_force_quiesce FALSE _asm_global_dump_level 267 _asm_hbeatiowait 15 _asm_hbeatwaitquantum 2 _asm_imbalance_tolerance 3 _asm_instlock_quota 0 _asm_iostat_latch_count 31 _asm_kfdpevent 0 _asm_kfioevent 0 _asm_kill_unresponsive_clients TRUE _asm_libraries ufs _asm_log_scale_rebalance FALSE _asm_lsod_bucket_size 67 _asm_max_cod_strides 5 _asm_max_redo_buffer_size 2097152 _asm_maxio 1048576 _asm_partner_target_disk_part 8 _asm_partner_target_fg_rel 4 _asm_primary_load 1 _asm_primary_load_cycles TRUE _asm_random_zone FALSE _asm_rebalance_plan_size 120 _asm_rebalance_space_errors 4 _asm_repairquantum 60 _asm_reserve_slaves TRUE _asm_root_directory ASM _asm_runtime_capability_volume_support FALSE _asm_secondary_load 10000 _asm_secondary_load_cycles FALSE _asm_serialize_volume_rebalance FALSE _asm_shadow_cycle 3 _asm_skip_rename_check FALSE _asm_skip_resize_check FALSE _asm_storagemaysplit FALSE _asm_stripesize 131072 _asm_stripewidth 8 _asm_sync_rebalance FALSE _asm_usd_batch 64 _asm_wait_time 18 _asmlib_test 0 _asmsid asm _ges_diagnostics_asm_dump_level 11 _lm_asm_enq_hashing TRUE asm_diskgroups DATA, ACFS asm_diskstring /dev/asm* asm_power_limit 1 asm_preferred_read_failure_groups
ASM datafile name 변경
ASM에서 Datafile 이름은 랜덤숫자가 붙은 형식으로 끝나는데, 이것을 유저친화적 형식으로 알아보기 쉽게 바꾼다면, alias를 사용해야 합니다.
아래는 데이터 파일을 바로 생성하는 것이 아닌 기존 파일을 이용한 alias 생성방법입니다.
alter diskgroup disk_group_1 add alias '+DISK_GROUP_1/oratst1/datafile/my_system_dbf' for '+DISK_GROUP_1/oratst1/datafile/system.1122.764387443';
ASM datafile Copy
$ rman target / Recovery Manager: Release 10.2.0.5.0 - Production on Tue Feb 28 17:50:37 2012 Copyright (c) 1982, 2007, Oracle. All rights reserved. connected to target database: TESTDB (DBID=2559693415) RMAN> copy datafile '+DATA/testdb/datafile/ts_new.266.776453331' to '+FRA'; Starting backup at 28-FEB-12 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=143 devtype=DISK channel ORA_DISK_1: starting datafile copy input datafile fno=00005 name=+DATA/testdb/datafile/ts_new.266.776453331 output filename=+FRA/testdb/datafile/ts_new.260.776454711 tag=TAG20120228T175149 recid=1 stamp=776454711 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03 Finished backup at 28-FEB-12 RMAN> copy datafile '+DATA/testdb/datafile/ts_new.267.776453579' to '+FRA'; Starting backup at 28-FEB-12 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy input datafile fno=00006 name=+DATA/testdb/datafile/ts_new.267.776453579 output filename=+FRA/testdb/datafile/ts_new.261.776454737 tag=TAG20120228T175217 recid=2 stamp=776454738 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 28-FEB-12
※ 참고 – 주의!!!!! RMAN에서 복사해주면 경로만 바뀌는게아니라 파일이름도 함께 바뀝니다.
SQL> alter database rename file '+DATA/testdb/datafile/ts_new.266.776453331' 2 to '+FRA/testdb/datafile/ts_new.266.776453331'; alter database rename file '+DATA/testdb/datafile/ts_new.266.776453331' * ERROR at line 1: ← 그런파일 없다고 에러난다. ORA-01511: error in renaming log/data files ORA-01141: error renaming data file 5 - new file '+FRA/testdb/datafile/ts_new.266.776453331' not found ORA-01110: data file 5: '+DATA/testdb/datafile/ts_new.266.776453331' ORA-17503: ksfdopn:2 Failed to open file +FRA/testdb/datafile/ts_new.266.776453331 ORA-15173: entry 'ts_new.266.776453331' does not exist in directory 'datafile'
▶ 위의 copy과정을 보면 +FRA로 경로가 이동된 파일의 파일 이름도 달라 졌음을 확인할 수 있습니다.
ASM에서 pfile 수정
os filesystem 에다가 만든 pfile 을 수정하고 다시 asm 저장공간에 spfile로 만들려면
SQL> create spfile='+DATA' from pfile; SQL> exit $ asmcmd asmcmd> ls parameterfile spfile.260.672234945 spfile.267.776334921 <-- 요걸로 alias 만듬 asmcmd> rmalias spfileasmdb.ora asmcmd> mkalias +DATA/TESTDB/PARAMETERFILE/spfile.267.776334921 spfiletestdb.ora
ASM 에서 디스크 추가 제거
$ export ORACLE_SID=+ASM1 $ sqlplus / as sysasm;
1. ASM Disk중 사용 안 하는 것 조회
+ASM1> set line 200 col path for a15 select group_number, mount_status, path, total_mb from v$asm_disk where mount_status='CLOSED'; ex) GROUP_NUMBER MOUNT_STATUS PATH TOTAL_MB ------------ -------------- --------------- ---------- 0 CLOSED ASM1 102400 0 CLOSED ASM2 102400 0 CLOSED ASM3 102400
2. ASM Disk 추가
+ASM> alter diskgroup data add disk 'ORCL:ASM1' rebalance power 5;
3. ASM Disk 상태 조회
+ASM> select group_number, disk_number, name, mount_status, path, total_mb from v$asm_disk; GROUP_NUMBER DISK_NUMBER NAME MOUNT_STAT PATH TOTAL_MB ------------ ----------- ---------- ---------- --------------- ---------- 0 4 CLOSED /dev/raw/raw6 54 0 5 CLOSED /dev/raw/raw5 486 0 6 CLOSED /dev/raw/raw4 486 0 7 CLOSED /dev/raw/raw3 486 0 8 CLOSED /dev/raw/raw2 486 0 9 CLOSED /dev/raw/raw1 486 1 0 DATA_0000 CACHED /dev/raw/raw10 126849 1 2 DATA_0002 CACHED /dev/raw/raw8 126849 1 3 DATA_0003 CACHED /dev/raw/raw9 126849 1 1 DATA_0001 CACHED /dev/raw/raw7 126849 1 1 ASM1 CACHED /dev/asm/asm1 102400
4. ASM2,3 추가 (반복)
5. ASM 디스크 상태조회
ASM Disk Group에 디스크 추가
+ASM> alter diskgroup DATA add disk 'ASM1' rebalance power 10; +ASM> alter diskgroup DATA add disk 'ASM2' rebalance power 10; +ASM> alter diskgroup DATA add disk 'ASM3' rebalance power 10;
ASM 디스크 삭제 (구 스토리지의 디스크 삭제 후 rebalance)
+ASM> alter diskgroup data drop disk DATA_0000; +ASM> alter diskgroup data drop disk DATA_0001; +ASM> alter diskgroup data drop disk DATA_0002; +ASM> alter diskgroup data drop disk DATA_0003;
명령실행후 diskgroup altered. 메시지가 보여지나 rebalancing 작업이 내부적으로 진행중이며 다음 v$asm_operation view를 통해 ACTIVE한 상태인지 확인할 수 있습니다.
+ASM> select name,header_status,state,free_mb from v$asm_disk; NAME HEADER_STATUS STATE FREE_MB ---------------- ------------------------ -------------------- ------------ DATA_0000 MEMBER NORMAL 126849 DATA_0001 MEMBER NORMAL 126849 DATA_0002 MEMBER NORMAL 126849 DATA_0003 MEMBER DROPPING 126849 → DROP 진행중
내부적 rebalancing 작업이 완료되면 수행중인 OPERATION 이 없어지며 v$asm_disk view에DISK DATA_0003이 없어진 것을 확인할 수 있습니다.
1 Response
[…] + 더 읽기 […]