Namu | 나무 개발자 블로그입니다


[01] 오라클 기본 정리 - 오라클 살펴보기 by namu

post image
image by logos-world.net/oracle-logo/

목차

  1. 기본환경 세팅
  2. 오라클 DB 살펴보기

시리즈

참조



들어가며

관계형 데이터베이스의 대표주자 오라클 데이터베이스에 대한 기본적인 개념들을 정리합니다.

환경은 윈도우10, Oracle 19c 입니다.


1. 기본환경 세팅

Oracle 19c 의 설치는 여기를 참조하세요.

이후 sqlplus 혹은 SQL Developer 접속 세팅까지 완료된 상태에서 진행합니다. (SQL Developer 설치 및 접속, SQL Developer 환경설정)


설치가 완료되었음에도 SQL Developer 접속이 불가한 경우 다음의 사항을 확인하세요.

a. 방화벽 open

b. 오라클 설정 HOST 정보 변경

c. ‘서비스’ 에서 Listener 관련 서비스 실행하기

d. Oracle 환경변수 확인

필요 시 재부팅 후 SQL Developer 접속 설정을 다시 시도해봅니다.


리눅스에서 오라클 환경세팅은 이 글을 참조하세요.



2. 오라클 DB 살펴보기

오라클 데이터베이스의 기본 구조와 테이블 스페이스, 트랜잭션, Redo Log 에 대해 살펴봅니다.


기본 구조

사용자가 저장하는 데이터들은 표면적으로 DBMS 에 의해 자동 관리되는 것으로 보이지만, 결국에는 어딘가 물리적 저장장치에 저장될 것입니다.

또한 물리적으로 저장되는 데이터가 아무렇게나 분포되어 영속성, 정합성이 저하되는 것을 방지하기 위해 논리적 단위로 구분되어 관리될 것입니다.

오라클도 이러한 원리를 따르기 때문에, 만약 중급 이상의 개발자가 되기 원한다면 단순히 쿼리만 실행하는 것이 아니라 오라클의 기본적인 데이터 관리 구조를 이해해야 합니다.

oracle physical storage
structures refer to oracle-world.com

(1) 기본 구조

위 이미지와 같이 오라클 데이터베이스는 물리적 구조와 논리적 구조로 나뉘어 있으며, Database 라 함은 기본적으로 사람이 이해할 수 있는 논리적 구조를 의미합니다.

따라서 물리적으로는 파일 이곳 저곳에 저장된 것으로 보이는 데이터가 DBMS 에 의해 관리될 때는 논리적으로 정제되어 나타나게 됩니다.


(2) 물리적 구조

오라클에서 데이터는 물리적으로 파일에 저장됩니다. 주요한 물리적 파일들은 다음과 같습니다.

a. Data Files: 모든 데이터가 저장됨 (*.dbf)

Data File Structure

  • Data File 은 두 개의 모드가 존재함(영구 및 임시)
    • Online: 접근 가능, 어플리케이션이 read and write 가능, 트랜잭션 정보 저장, 물리적으로 수정 불가
    • Offline: 접근 불가, 파일 관련 작업 가능(corruption investigation, renaming, backing up, …)
  • Data file header: stores general and key information about data inside such as
    • System Change Number (SCN, 트랜잭션이 커밋된 이후 생성되는 incrementing unique number)
    • Size
    • Unique identifier of the data file in a database
    • Unique identifier of the data file in a tablespace
  • Used block: 값은 1
  • Free block: 값은 0. never used(free and never used), previously used(but still free to be reused)

data file structure refer to oracle-world.com

b. Permanent and Temporary Data Files: Data Files 의 일종

c. Control Files: 오라클 데이터베이스의 두뇌 역할. 데이터베이스를 유연하게 운영하기 위해 이 파일이 필요함 (*.ctl)

d. Online Redo Log Files: 데이터베이스 회복(recovery) 을 위해 매우 중요한 Redo Log 파일. 데이터 변경 사항이 저장됨

e. Password file: SYS 계정의 패스워드 저장 (다른 계정의 패스워드는 data file 에 저장됨)

f. Parameter file(PFILE / SPFILE): 인스턴스의 성공적인 시작을 위한 모든 파라미터 저장


Redo Log switching

  • active redo log 파일은 오직 하나(=current), 나머지 하나는 being archived
  • 이 파일에 트랜잭션 상세를 기록하기 위하여 오라클은 Log Writer(LGWR) 프로세스를 사용함
  • active 파일이 가득 차게 되면 오라클은 다른 redo log 파일로 전환함(we called this situation ‘log switching’). 또는 일정 간격으로 강제 전환할 수 있음 redo log switching
  • 데이터베이스가 NOARCHIVELOG 모드인 경우 모든 redo log 파일은 재사용될 수 있음
  • 이는 체크포인트(checkpointing, CKPT, checkpoint process) 쓰기가 완료된 직후에 사용 가능함 (checkpointing 은 DBWR(database writer) 프로세스에 의해 실행됨)
  • 만약 반대로 archive log 모드인 경우 이 redo log 파일은 오직 체크포인트가 작성되고, archived 된 이후에만 사용 가능함
  • 일반적으로 데이터베이스 운영시 redo log 파일의 다중 복제본으로 설정됨 (클러스터링 및 높은 고가용성의 이유)
  • 이 경우 log writer 는 트랜잭션 상세를 여러 개의 redo log 파일들에 동시에 저장함 (다중 파일은 여러 디스크에 거쳐 생성되는게 이상적)

Archived redo log files

  • 아카이빙된 로그 파일은 offline 파일인데, 이는 데이터베이스 회복 또는 대기중인 데이터베이스 업데이트 용도로 사용됨

Redo log 파일의 구조

  • SCN number
  • 변경에 대한 timestamp
  • 트랜잭션 ID
  • 커밋된 트랜잭션의 SCN 및 timestamp (만약 커밋되어 버린다면)
  • Operation type
  • 수정된 data segment 이름 및 타입

추가 참조: Redo Log


(3) 논리적 구조

데이터의 논리적 구조는 사람에게 친숙합니다. 이것은 운영체제 레벨에서는 확인이 불가하며 오직 Database 레벨에서만 관리됩니다.


오라클 데이터베이스의 논리적 구조에서 가장 큰 단위는 Tablespace이며, 순차적으로 Segment, Extent, Data Block으로 세분화됩니다.

a. Data Block: 보통 몇 KB 정도로 크기가 매우 작음

b. Extent: data block 의 연속적인 셋. a group of contiguous free data blocks

c. Segment: 다수의 extent 로 구성되며, 테이블(tables) 또는 인덱스(indexes) 와 같은 데이터베이스 오브젝트(database objects) 로 할당됨. 각 오브젝트는 고유의 segment 를 가짐

d. Tablespace: 복수의 segment 로 구성됨. 하나의 segment 는 오직 하나의 tablespace 에 속함

oracle physical storage
structures refer to oracle-world.com


데이터의 논리적 구조는 Oracle Database 에 의해서만 관리된다고 하였습니다. 논리적 구조 관리기법에는 Locally managed 방식과 Dictionary managed 방식이 있는데 주로 전자가 많이 사용됩니다.

이는 Tablespace 내에서 Segment 에 추가적인 Extent 할당 시, 할당(및 할당 해제) 정보와 관련된 메타데이터(Metadata) 를 어디에 저장하는지와 관련되어 있습니다.

a. Locally managed 방식: 말 그대로 Tablespace 내부, 즉 Tablespace header 에 저장

b. Dictionary managed 방식: Dictionary 에 저장


Locally managed 방식은 Dictionary managed 방식과 비교하여 다음과 같은 이점이 있습니다.
(참조: Comparing locally managed and dictionary managed tablespaces)

a. 재귀적 공간 관리작업 방지

b. extents 의 Local management 는 인접한 여유 공간을 추적하여 여유 범위 병합을 제거함

c. 데이터 사전에 대한 의존도를 줄임


다음으로 논리적 구조의 각 구성요소를 상세히 살펴보겠습니다.

a. Data Blocks: 적은 수의 bits 로 구성된 논리적 최소단위이며, database I/O 작업시 페이지(pages) 로 참조

oracle data block

b. Extents: 여러 data block 의 연속적인 셋. extents 는 세그먼트룰 구성함

c. Segments: 복수의 extents 로 이루어지며 tablespace 내 모든 데이터를 저장함. 기본적인 database object 에 해당함

d. Tablespaces: 세그먼트로 구성되는 가장 큰 논리적 단위. 오라클에서는 다음의 세 가지 타입으로 분류됨

만약 특정 사용자 지정 객체가 필요하다면(새로운 db, table 등이 필요한 경우) 데이터베이스의 기본 운영에 필수적인 기존의 테이블스페이스(SYSTEM, SYSAUX)가 아니라 별도의 전용 테이블스페이스를 생성해야 합니다.

테이블스페이스는 각각이 할당된 고유의 디스크 공간이 있으므로, 목적에 따라 분리하여 서로간에 영향이 없도록 하는 것이 바람직합니다. 테이블스페이스를 분리하면 디스크 공간의 낭비를 줄이고, 부분적인 할당 및 해제, 백업, 암호화 on/off 등에 유리합니다.

자세한 테이블 스페이스 생성 및 관리는 다음 글 내용을 참조하세요


데이터베이스? 인스턴스?

일반적으로 데이터베이스에 ‘접속’한다고 생각하지만 실제로는 그렇지 않습니다.
리스너(Listener) 를 통해 인스턴스(Instance) 에 접속한다는 것이 올바른 이해입니다.


데이터베이스와 인스턴스의 차이점

  • 데이터, 스키마, 메타데이터 등 실제 저장되는 요소들은 데이터베이스
  • 그러한 데이터베이스에 접속하여 특정 용도로 사용되는 것은 인스턴스
  • 따라서 동일한 데이터베이스로 목적에 따라 각각 다른 여러 인스턴스가 성립될 수 있음
  • 하나의 인스턴스는 오직 하나의 데이터베이스만 열 수 있음
  • 사용자가 접속을 해제해 인스턴스가 끊어져도 데이터베이스의 데이터는 손상되지 않음


(1) 리스너와 인스턴스

a. 리스너: 사용자의 접속 요청(requests)을 받아들여 지정된 인스턴스에 연결

b. 인스턴스: 데이터베이스와 통신하는 프로세스, 메모리의 전체 모음


dirty buffer

  • DBWR 에 의해 data file(물리적 파일)에 기록되기 이전에 SGAbuffer cache 에 존재하는 변경 사항을 의미함
  • 변경 사항의 커밋 여부와는 무관함!
  • 따라서 uncommitted 데이터가 data file 에 기록될 수도 있는데,
  • 만약 데이터베이스 충돌이 발생한 경우 instance recovery 가 커밋되지 않은 변경 사항을 정리하게 됨


리스너가 사용자와 인스턴스 간 연결을 성공시키기 위해 필요한 요소는 다음과 같습니다.


인스턴스와 인스턴스의 동작에 대한 상세 설명은 Oracle Docs - Oracle Database Instance 를 참조하세요.

사용자 프로세스 - 서버 프로세스(PGA) - 인스턴스(SGA) 의 연결 흐름은 다음을 참조하시기 바랍니다. (PGA: 하나의 프로세스에 할당되는 메모리 영역)

oracle database instance refer to ittutorial.org


(2) SGA

전역 공유 메모리 영역인 SGA(System Global Area) 의 값은 오라클 데이터베이스 생성 시 설정됩니다. 또한 설정된 값에 따라 인스턴스 시작 시 오라클에 의해 운영체제로부터 물리적 메모리가 할당되며, 인스턴스가 종료되면 release 됩니다.

SGA 값의 정확하고 최적의 구성은 오라클 성능에 직접적인 영향을 미칩니다.

-- SGA 값 조회
SHOW PARAMETER SGA;  -- NAME(sga_max_size, sga_min_size, sga_target, lock_sga, pre_page_sga, ...), TYPE, VALUE


SGA 에는 다음 세 개의 주요한 구성요소가 있습니다.

a. Shared Pool: 데이터베이스 운영 대부분의 영역에서 사용되는 중요한 메모리 영역

b. Data Buffer Cache: 물리적 저장장치로부터 읽어들인 모든 데이터가 적재되는 메모리 공간.

c. Redo Log buffer

SGA 각 메모리 파라미터에 할당된 값의 합이 SGA_MAX_SIZE 값의 이하가 되도록 해야합니다.


(3) PGA

PGA(Program Global Area) 는 오라클 인스턴스에서 프로세스가 시작될 때 서버에서 할당되는 물리적 메모리 공간입니다. 하나의 프로세스는 특정 어플리케이션이나 사용자의 데이터베이스 인스턴스 접속 시 만들어지며, 이 프로세스가 종료될 때 메모리도 release 됩니다.

-- PGA 값 조회
SHOW PARAMETER PGA;  -- NAME(pga_aggregate_target, pga_aggregate_limit, ...), TYPE, VALUE
SHOW PARAMETER WORKAREA_SIZE_POLICY;  -- default AUTO (or MANUAL)
SHOW PARAMETER SORT_AREA_SIZE;  -- VALUE is 65536 (byte)
SHOW PARAMETER PGA_AGGREGATE_TARGET;  -- VALUE is 2437M


PGA 의 구성요소는 다음과 같습니다.

a. Sort Area: Order by 또는 Group by 등의 정렬 수행 공간. 메모리 정렬 이후 공간이 부족하면 디스크 추가 활용함
b. Session Information: 접속된 사용자 프로세스의 세션 정보
c. Cursor State: 해당 SQL 의 구문 해석 정보(parsing info)가 저장된 주소를 지칭하는 커서
d. Stack Space: 변수 저장 공간. bind variable 할당정보 저장


다음의 파라미터의 값을 설정함으로써 PGA 용량을 관리할 수 있습니다.

a. WORKAREA_SIZE_POLICY(MANUAL or AUTO, default AUTO)

b. SORT_AREA_SIZE: 정렬시 사용되는 메모리 용량을 설정. 세션별로 정해진 크기의 PGA 가 할당됨
c. PGA_AGGREGATE_TARGET: 모든 세션의 PGA 크기의 합. AUTO 설정시 자동으로 관리됨

PGA_AGGREGATE_TARGET 설정 시 주의사항

  • WORKAREA_SIZE_POLICYAUTO 로 설정하고 PGA_AGGREGATE_TARGET 값을 지정할 때는 각별한 주의가 필요함
  • 만약 한 세션이 큰 정렬작업을 수행하여 PGA_AGGREGATE_TARGET 용량을 전부 자동으로 할당받아 사용하게 된다면,
  • 추가로 접속하는 사용자 세션에 할당 용량 부족으로 인한 에러가 발생할 수 있음
  • 따라서 몇 명의 사용자가 각각 한 번에 얼마 정도씩 메모리를 사용할지 미리 파악하여 PGA_AGGREGATE_TARGET 값을 정확히 지정해야 함
  • 평소 사용되는 PGA 크기 확인 > V$PROCESS 데이터 딕셔너리 뷰에서 조회
    • 조회시 현존하는 여러 PGA 데이터가 나타남
    • PGA_USED_MEM(현재 사용중), PGA_ALLOC_MEM(할당된 크기), PGA_MAX_MEM(사용했던 최대 크기)


다음글인 [02] 오라클 기본 정리 - DB 생성, 쿼리 로 이어집니다.