ORACLE - DAY 59

BUMSOO·2024년 11월 4일

다른 instance 세션 킬

  1. rac1 node에서 트랜잭션 작업 수행
update hr.employees
	set salary = salary * 1.1
    where employee_id = 100;
   
select b.lock_element_addr, b.status, e.mode_held, e.local
from v$bh b, v$gc_element e
where b.lock_element_addr = e.gc_element_addr
and b.file# = 5
and b.block# = 207;
  1. 개별 세션에 대한 정보
select sid, serial#,event, blocking_instance,blocking_session
from v$session
where event like '%TX%';
  1. 전체 세션에 대한 정보
select inst_id,sid, serial#,event, blocking_instance,blocking_session
from gv$session
where event like '%TX%';
  1. 전체 instance 이름 확인
select instance_name, status from gv$instance;

  1. rac2 node에서 트랜잭션 수행
  • rac1 node에서 동일한 row에 대해 업데이트를 진행하는 중에 다른 node에서 같은 row에 대한 트랜잭션 작업을 수행하면 wait 단계로 빠진다.
update hr.employees
	set salary = salary * 1.1
    where employee_id = 100;

  1. rac1 node에서 현재 lock 상태를 확인할 수 있다.
select inst_id,sid, serial#,event, blocking_instance,blocking_session
from gv$session
where event like '%TX%';

  1. lock을 걸고 있는 세션 확인
select inst_id,sid, serial#,event, blocking_instance,blocking_session
from gv$session
where sid in (select blocking_session from gv$session);

  1. lock을 걸고 있는 세션 킬
  • wait 단계로 빠져있던 rac2 node는 정상적으로 트랜잭션이 수행된다.
    alter system kill session 'sid값,serial#값,@instance_id' immediate;
alter system kill session '24,33,@1' immediate'

Oracle I/O

Application level	 : Cache buffer
File System level	 : File system, raw device
Volume level		 : Logical Volume Manager(LVM), 
					   ASM(Automatic Storage Management)
storage		 		 : Disk

Application level

  • database buffer cache
  • conventional path i/o vs direct path i/o
  • database buffer cache를 효율적으로 사용
    • SQL 최적화
    • 인덱스 최적화
    • Multiple Buffer Pool(default, keep, recycle, nk(2,4,8,16,32))
  • 대량의 데이터 처리 작업시 direct path i/o
    • insert *+ append */... select
    • sql ldr(loader) direct = true
    • parallel query
    • parallel dml

File System Level

  • 일반 file system : os file cache를 통해 i/o 작업 수행
  • direct i/o + file system : os file cache를 사용하지 않고 i/o 작업 수행
  • raw device : file system을 사용하지 않고 i/o 작업, (redo log file,rac)

Volume Level

  • virtual partitioning, striping, mirroring
  • LVM(Logical Volume Manager)
  • ASM(Automatic Storage Management)

이전에는
physical volume -> Logical Volume(LVM)
현재는
physical volume -> Disk Group(ASM)

Striping

  • 모든 디스크에 데이터를 striping
  • 특정 디스크가 hot spot이 되는것을 방지
  • RAID 0
    • 빠른 입출력이 가능하도록 여러 디스크에 동시에 분산 저장
    • 한개의 디스크의 장애시에도 전체 데이터의 손실이 발생
  • strip 크기
    • 32k, 64k, 128k, 1m(vendor 마다 다르다)
    • ASM 기본값(1m)

Mirroring

  • 동일한 데이터를 동시에 다른 디스크에 저장
  • 디스크 장애시 복구 가능
  • 디스크 사용률 낮아진다.

ASM(Automatic Storage Mamangement)

  • 오라클 10g 버전에 출시
  • raw device와 클러스터 파일 시스템의 모든 장점인 볼륨메니저 기능 제공
  • 자동화 로드맵 중 스토리지에 대한 구현 제공
  • 장점 : OS의 RAID기법을 구성하지 않고 오라클이 자동으로 스트라이핑(RAID 0(striping)), 미러링(RAID 1(mirroring))을 지원
    • 스트라이핑 단위는 extent단위(1MB)로 하는거 같다.
  • 단점 : 초창기(10g) 안정성이 떨어져서 버그에 대한 fix를 해야할 일이 많았다.

ASM Instance

  • ASM을 관리하는 전용 메모리 인스턴스
  • 디스크에 대한 I/O를 관리한다.(OS 메모리를 거치지 않음(
  • 오라클 인스턴스와 상하관계는 아니고 의사소통을 하면서 ASM storage를 관리한다.
  • 인스턴스 공간
    • shared pool : 디스크에 대한 메타 데이터 정보
    • large pool : 리밸런싱을위한 병렬 작업에 사용
    • asm cache : 리밸런싱 작업중 읽고, 쓰기 블록 사용
      • 리밸런싱 관련 백그라운드 프로세스
        RBAL : 리밸런싱 작업을 조정하고 ARBn에게 지시
        ARBn : 리밸런싱 데이터를 extent 이동 수행한다.

ASM 제한사항

  • 스토리지는 시스템당 63개의 disk group만 지원
  • ASM DISK당 최대 4petabyte 지원
  • 각 disk group당 최대 백만개 파일 지원
  • 최대 파일 크기
    • normal redundancy(2-way mirroring) : 23petabyte까지 가능
    • high redundancy(3-way mirroring) : 15petabyte까지 가능
    • external redundancy(외부 RAID 방식, 외부 방식을 설정하지 않았으면 NONE) : 140petabyte까지 가능
  • 스토리지는 시스템당 최대 40 exabyte 지원

ASM AU(Allocation Unit)

  • AU 크기는 디스크 그룹 생성시 구성
  • AU_SIZE : 기본값 1M(1,2,4,8,16,32,64)
  • 오라클은 AU 크기를 자동으로 관리한다.
    • 처음부터 2만개 : 기존 AU_SIZE
    • 다음 2만개 : AU_SIZE * 4
    • 다음 나머지 : AU_SIZE * 16

ASM INSTANCE 접속

rac1 node

. oraenv
+ASM1 instance로 접속

vi $GRID_HOME/sqlplus/admin/glogin.sql
set sqlprompt "_user'@'_connect_identifier>"

sqlplus 접속할때 sys role로 접속하는게 아니라 sysasm role로 접속해야한다.
sqlplus / as sysasm

rac2 node

. oraenv
+ASM2 instance로 접속

vi $GRID_HOME/sqlplus/admin/glogin.sql
set sqlprompt "_user'@'_connect_identifier>"

sqlplus 접속할때 sys role로 접속하는게 아니라 sysasm role로 접속해야한다.
sqlplus / as sysasm

- 현재 설정된 asm 그룹 정보 조회
select group_number, name, type, state from v$asm_diskgroup;

- disk 정보 확인

select b.name group_name, a.group_number, a.disk_number, a.name file_name, a.mount_status, a.path, a.total_mb, a.free_mb
from v$asm_disk a, v$asm_diskgroup b
where a.group_number = b.group_number;

- 디스크 그룹에 포함된 asm file 정보

  • redund가 mirror은 이중화되어있다.
  • redund가 unprot는 다중화되어있지 않다.
  • asmprameterfile,parameterfile, controfile, datafile,onlinelog 파일들이 disk 1에 들어있다.
select group_number, file_number, bytes/1024/1024 mb, redundancy, type
from v$asm_file;

show parameter spfile

  • 파일 번호도 알 수 있다.

show sga

  • Variable size = shpared pool + large pool

select * from v$sgainfo;

disk 그룹 삭제

- disk 정보 확인

select b.name group_name, a.group_number, a.disk_number, a.name file_name, a.mount_status, a.path, a.total_mb, a.free_mb
from v$asm_disk a, v$asm_diskgroup b
where a.group_number = b.group_number;

- DATA 디스크 그룹의 디스크 삭제

  • rebalance power 10
    • 디스크 제거 시, 데이터의 재배치(리밸런싱) 작업을 수행하는데, 리밸런싱의 속도를 power 값으로 조정합니다.
    • power 10은 리밸런싱 작업에 높은 우선 순위를 부여하여 작업 속도를 빠르게 합니다.

alter diskgroup data drop disk data_0003 rebalance power 10;

- 삭제된거 확인

  • 0003 디스크가 삭제되어 있다.
select b.name group_name, a.group_number, a.disk_number, a.name file_name, a.mount_status, a.path, a.total_mb, a.free_mb
from v$asm_disk a, v$asm_diskgroup b
where a.group_number = b.group_number;

- 사용할 수 있는 디스크 확인(삭제되었으면 사용할 수 있음)

  • 사용가능 상태 = CLOSED
  • 사용중인 상태 = CACHED
    select path from v$asm_disk where mount_status = 'CLOSED';

disk 그룹 추가

- FRA 디스크 그룹에 디스크 추가
alter diskgroup fra add disk '/dev/oracleasm/disks/ASMDISK04' rebalance power 10;

- 추가한 디스크 확인

select b.name group_name, a.group_number, a.disk_number, a.name file_name, a.mount_status, a.path, a.total_mb, a.free_mb
from v$asm_disk a, v$asm_diskgroup b
where a.group_number = b.group_number;

- 잘못 추가한 디스크 삭제

  • 현재 디스크그룹의 다른 디스크들도 free공간이 많기 때문에 굳이 추가할 필요가 없을때
    alter diskgroup fra drop disk fra_0002 rebalance power 10;

- 현재 사용가능한 디스크 확인
select path from v$asm_disk where mount_status = 'CLOSED';

새로운 disk group 생성

- mirroring 하지 않고 디스크 그룹 생성

  • mirroring 하기 위해서는 최소 2개의 디스크가 필요한데 현재 1개의 디스크 밖에 없기 때문이다.
create diskgroup asm_dg external redundancy disk '/dev/oracleasm/disks/ASMDISK04';

- 전체 디스크 그룹 확인

select group_number, name, type, state from v$asm_diskgroup;

RAC에서 file 관리

- asm instance 종료 후 oracle instance로 접속

- 초기파라미터 위치 확인

  • 초기파라미터는 $ORACLE_HOME/dbs 아래 있어야 하지만, 조회해보면 disk 그룹 안으로 되어있다
  • $ORACLE_HOME/dbs 아래에는 init파일만 있는데 spfile이라는 파라미터를 설정해서 init파일을 바라봐도 disk 그룹에 있는 spfile을 바라볼 수 있다.
  • rac에서는 spfile은 공유디스크 스토리지에 있어야 한다.

cat $ORACLE_HOME/dbs/initracdb1.ora

create pfile = '$ORACLE_HOME/dbs/initcopy.ora' from spfile;

cat /u01/app/oracle/product/11.2.0/dbhome_1/dbs/initcopy.ora

  • copy한 init 파라미터 파일을 보면 각 instance별로 따로 지정해야 하면 앞에 instance 이름.파라미터 로 하면 된다.

- 파일위치를 확인해보면 DATA 디스크 그룹안에 저장되어 있다.

select tablespace_name, file_name, bytes/1024/1024 mb 
from dba_data_files;

- 컨트롤 파일은 이중화 되어 있고 DATA 디스크 그룹 안에서는 삼중화 되어있다.

select name from v$controlfile;

- 다른 instance의 log 그룹도 확인해야 하면 gv$log를 사용한다.

select * from gv$log;

- 멤버가 2개씩 설정되어있는데 나머지 멤버의 저장 위치 확인

select * from gv$logfile;

- asm disk구성을 DB instance에서도 확인 가능하다.

select b.name group_name, a.group_number, a.disk_number, a.name file_name, a.mount_status, a.path, a.total_mb, a.free_mb
from v$asm_disk a, v$asm_diskgroup b
where a.group_number = b.group_number;

- tablespace 생성

create tablespace asm_tbs 
datafile '+ASM_DG' size 10m;

- 생성한 tablespace 확인

select tablespace_name, file_name, bytes/1024/1024 mb 
from dba_data_files;

- 데이터파일을 추가할때 명시적으로 표현하지 않으면 OMF방식으로 만들어 지기 때문에 DATA 디스크 그룹에 추가되었다.

alter tablespace asm_tbs add datafile;

select tablespace_name, file_name, bytes/1024/1024 mb 
from dba_data_files;

- DATA 디스크 그룹에 OMF방식으로 기본 만들어진다.
show parameter db_create_file_dest

- 데이터파일 삭제

alter tablespace asm_tbs drop datafile '+DATA/racdb/datafile/asm_tbs.269.1184165979';

- OMF 디스크 그룹 변경

alter system set db_create_file_dest = '+ASM_DG';

- OMF방식으로 tablespace 생성

  • 기본으로 ASM_DG 디스크 그룹에 생성되었다.
create tablespace insa_tbs;

select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

- 데이터파일 추가

alter tablespace insa_tbs add datafile;

select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

- autoextensible이 no를 yes로 변경

alter database datafile '+ASM_DG/racdb/datafile/asm_tbs.256.1184165877' autoextend on;

select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

- 데이터파일 이름을 직접 설정해서 tablespace 생성

create tablespace temp_tbs datafile '+ASM_DG/racdb/datafile/temp_tbs01.dbf' size 5m;

select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

- tablespace 삭제

drop tablespace temp_tbs including contents and datafiles;
drop tablespace insa_tbs including contents and datafiles;

디스크 그룹 이관

asm_tbs tablespace에 속한 +ASM_DG -> +DATA 그룹으로 이동

  1. 새로운 테이블 생성
create table hr.emp_asm 
tablespace asm_tbs 
as
select * 
from hr.employees;

select tablespace_name, extents, bytes, blocks 
from dba_segments
where owner = 'HR'
and segment_name = 'EMP_ASM';

  1. 현재 테이블스페이스에 대한 상태정보 확인
select tablespace_name, status from dba_tablespaces;

  1. 이동해야하는 테이블스페이스 offline으로 변경(noraml은 checkpoint 발생)
alter tablespace asm_tbs offline normal;
  1. rman에 접속해야한다
    rman target /

  2. 현재 데이터파일 확인
    report schema

  3. disk 그룹에 있는 데이터파일은 물리적으로 이동할 수 없기 때문에 rman을 이용해서 이미지 copy 시킨다

copy datafile '+ASM_DG/racdb/datafile/asm_tbs.256.1184165877' to '+DATA/racdb/datafile/asm_tbs01.dbf'

  1. copy 확인
    list copy
  1. rman 종료 후 oracle 접속
    sqlplus / as sysdba

  2. copy 이미지로 rename

alter tablespace asm_tbs rename datafile '+ASM_DG/racdb/datafile/asm_tbs.256.1184165877' to '+DATA/racdb/datafile/asm_tbs01.dbf';
  1. rename 된거 확인
select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

  1. offline 되어있는 상태를 online으로 변경
alter tablespace asm_tbs online;

select tablespace_name, status from dba_tablespaces;

asm_tbs tablespace에 속한 +DATA -> +ASM_DG 그룹으로 이동

  1. 현재 테이블스페이스에 대한 상태정보 확인
select tablespace_name, status from dba_tablespaces;

  1. 이동해야하는 테이블스페이스 offline으로 변경(noraml은 checkpoint 발생)
alter tablespace asm_tbs offline normal;

select tablespace_name, status from dba_tablespaces;

3.rman에 접속해야한다
rman target /

  1. 현재 데이터파일 확인
    report schema

  2. disk 그룹에 있는 데이터파일은 물리적으로 이동할 수 없기 때문에 rman을 이용해서 이미지 copy 시킨다

copy datafile '+DATA/racdb/datafile/asm_tbs01.dbf' to '+ASM_DG';

  1. copy 확인
    list copy

  2. rman 종료 후 oracle 접속
    sqlplus / as sysdba

  3. copy 이미지로 rename

alter tablespace asm_tbs rename datafile '+DATA/racdb/datafile/asm_tbs01.dbf' to '+ASM_DG/racdb/datafile/asm_tbs.256.1184168445';
  1. rename 된거 확인
select tablespace_name, file_name, bytes/1024/1024 mb, autoextensible 
from dba_data_files;

  1. offline 되어있는 상태를 online으로 변경
alter tablespace asm_tbs online;

select tablespace_name, status from dba_tablespaces;

  1. 데이터파일 이름 확인
select f.file_name
from dba_extents e, dba_data_files f
where f.file_id = e.file_id
and e.segment_name = 'EMP_ASM'
and e.owner = 'HR'

번외 한쪽 node의 dismount상태

+ASM2 instance로 접속
- rac1의 asm에서는 정상 mounted 되어있는데 데이터이관 작업을 하다보면 다른 node에서는 dismounted 되는 현상이 발생된다.

select group_number, name,type,state from v$asm_diskgroup;

- rac2로 접속하는 유저들은 ASM_DG의 디스크 그룹의 데이터에는 접근할 수 없다.

- DISMOUNTED 상태를 MOUNTED로 변경해줘야 한다.

alter diskgroup asm_dg mount;

select group_number, name,type,state from v$asm_diskgroup;

rac의 redo log 파일

  • redo log 파일은 각 node가 따로따로 사용하기 때문에 current한 redo log가 2개 이다.

  • archived log 확인

select thread#, sequence#, name, first_change#, next_change# 
from v$archived_log
order by 1,2;

  • 자동 저장되는 위치 확인
    show parameter db_recovery_file_dest

rac에서 rman 백업 앤 복구

datafile 삭제

  1. rman 접속
    show all;

  2. control file도 자동백업 받게 설정
    CONFIGURE CONTROLFILE AUTOBACKUP ON;

  3. 백업 받기
    backup as compressed backupset database;

  4. 백업 리스트 확인
    list backup

  5. rman 에서 나간 후 ASM1 인스턴스로 접속

  6. 프롬프트 띄운 후 디스크 그룹 확인
    asmcmd
    ls

  7. ASM프롬프트에서 디렉터리 이동

  • 마찬가지로 cd로 이동한다.
  1. 이미지 copy 받아놓은 백업파일 확인
    find / asm_tbs*

  2. 삭제

  • 하지만 ASM에서는 마음대로 online 상태인 파일은 삭제가 안된다.
ASMCMD> rm -f +DATA/RACDB/DATAFILE/asm_tbs01.dbf
ASMCMD> rm -f +DATA/RACDB/DATAFILE/ASM_TBS.269.1184167651
ASMCMD-08002: entry 'ASM_TBS.269.1184167651' does not exist in directory '+DATA/RACDB/DATAFILE/'
ASMCMD> rm -f +ASM_DG/RACDB/DATAFILE/ASM_TBS.256.1184168445
ORA-15032: not all alterations performed
ORA-15028: ASM file '+ASM_DG/RACDB/DATAFILE/ASM_TBS.256.1184168445' not dropped; currently being accessed (DBD ERROR: OCIStmtExecute)
  1. 억지로 삭제하기 위해 online상태인 데이터파일을 offline으로 변경
alter tablespace asm_tbs offline;

select tablespace_name, status from dba_tablespaces;

  1. 다시 ASM프롬프트에서 삭제 시도
ASMCMD> rm -f +ASM_DG/RACDB/DATAFILE/ASM_TBS.256.1184168445
  1. 삭제된 데이터파일의 테이블 스페이스를 online으로 변경 시도
  • 이미 삭제 되어서 online으로 변경할 수 없다.
alter tablespace asm_tbs online;

  1. rman으로 접속

  2. rman에서는 list failure을 지원하지 않는다.
    list failure

  3. 백업 받아놓은 리스트 확인
    list backup;

  4. 백업 파일을 가지고 restore과 recover 진행

restore datafile 7;
recover datafile 7;

  1. 다시 rac2 node에서 online으로 변경 시도
  • 정상적으로 online 으로 변경되었다.
alter tablespace asm_tbs online;

select tablespace_name, status from dba_tablespaces;

  1. 정상적으로 복구되었는지 확인
select count(*) from hr.emp_asm;

번외

asmcmd에서 특정 디스크에서 디렉터리 찾기
find +data asm*

asmcmd에서 모든 디스크그룹에서 디렉터리 찾기
find / asm_tbs*

system file 삭제

  1. rac1 ,rac2 shutdown abort로 서버 강제 종료

  2. asmcmd에서 시스템파일 삭제
    rm -f +data/RACDB/DATAFILE/SYSTEM.256.1183745163

  3. rac1 node에서 다시 startup 해보지만 오류 발생

  4. 오류 확인
    select * from v$recover_file;

  5. rman으로 restore & recover

restore datafile 1;
recover datafile 1;
alter database open;
  1. rac1, rac2 에서 db open 확인
select instance_name, status from v$instance;

0개의 댓글