Database/Oracle

[Oracle] Compress

2024. 2. 29. 17:37

● 서버 스토리지 부족 시 TBL 압축을 위해 Compress 옵션 사용 (단, DML이 잦으면 역효과일 수 있음)

  Relation Data 처리를 위한 알고리즘으로 DB Block 내 다수의 column의 중복된 값을 제거하여 compression을 수행

  새로운 data를 bulk insert, bulk load 또는 insert, update 시 compression 사용 가능

 

  Compress된 block은 compression과 관련된 meta data를 symbol table에 저장

                 ㄴ uncompressed table과 가장 큰 차이

                                                                       ㄴ symbol table : block의 상단에 위치

 

 

※ 사용 전 테이블의 속성을 파악하여 DML 이력 확인 권고

SQL> SELECT INSERTS, UPDATES, DELETES FROM DBA_TAB_MODIFICATIONS WHERE TABLE_NAME = 'TEST';

   INSERTS    UPDATES    DELETES
---------- ---------- ----------
         0      12657          0

 

 

 

Basic Compression

Direct path I/O 로 생성된 block만 압축함

하나의 segment에 여러 형태의 block이 혼재할 수 있음

                                 ㄴ Compressed block (Direct Path I/O)

                                      Uncompressed block (Conventional Path I/O)

 

Command

ALTER TABLE TEST_NOCOMP MOVE NOCOMPRESS;
ALTER TABLE TEST_BASIC MOVE COMPRESS BASIC;
ALTER TABLE TEST_OLTP MOVE COMPRESS FOR OLTP;

MOVE : 이전에 저장되어 있던 DATA들도 압축

MOVE 생략 시 이후에 들어오는 DATA들에 한하여 압축

SQL> INSERT /*+append*/ INTO ... VALUES ...
SQL> COMMIT;

 

 

 

 

OLTP Compression

Online Transaction Processing

 = 그냥 트랜잭션

'Database > Oracle' 카테고리의 다른 글

[Oracle] Transaction과 Record  (0) 2024.02.21
RMAN  (0) 2023.11.12
[Oracle] 자주 쓰는 명령어  (0) 2023.11.10
[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15

[Oracle] Transaction과 Record

2024. 2. 21. 22:02

 

Transaction

: DB의 데이터를 조작하는 작업의 단위

병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위

사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위

Commit or Not

 

트랜잭션 상태

  • Active : 트랜잭션 실행 중
  • Failed : 트랜잭션 실행에 오류가 발생하여 중단
  • Aborted : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
  • Partially Committed : 트랜잭션의 마지막 연산까지 실패했지만, Commit 실행 직전의 상태
  • Committed : 트랜잭션이 성공적으로 종료되어 Commit 실행 후의 상태

ACID 원칙을 보장해야 함

 ㄴ 지킬수록 동시성은 떨어짐

 ㄴ ∴ 각 Level별 Transaction Lock Level 존재

 

Lock

Row Lock

: Table이 row에 lock을 거는 것

  • Shared Lock : select 시 잠금
  • Exclusive Lock : write 시 잠금

1. 동시에 여러 Tx가 한 row에 Shared Lock을 걸 수 없음

  = 여러 Tx가 동시에 row를 읽을 수 없음

2. Shared Lock이 걸려있는 row에 다른 Tx가 Exclusive Lock을 걸 수 없음

  = 다른 Tx가 row를 읽는 동안 다른 Tx는 수정 및 삭제 불가능

3. Exclusive Lock이 걸려있는 동안 다른 Tx는 Shared/Exclusive 즉 모든 Lock을 걸 수 없음

 

Record Lock

: DB의 Index Record에 걸리는 Lock

  • Shared Lock : select 시 잠금
  • Exclusive Lock : write 시 잠금

Gap Lock

Index Record의 Gap 사이에 걸리는 Lock

record Table에서 인덱스와 인덱스 사이에 존재

 = record가 없는 부분에 걸리는 Lock

 

 

             ┌ 새로운 row의 추가 방지

Record Lock Vs. Gap Lock

 ㄴ이미 있는 row가 변경되지 않게 

 

*Index

Data의 Record에 빠르게 접근하기 위해 <키, 값, 주소> 로 구성된 데이터 구조

 

 

 

Record

  • Table 형태의 데이터 타입
  • 여러 개의 Data Type을 갖는 변수들의 집합
  • 논리적 단위
  • 필드 집합 처리
  • ( ≒ C언어의 Struct)

 

  • 테이블과 다르게 개별 필드 이름 부여 가능
  • 선언 시 초기화 가능
  • 레코드가 가질 수 있는 row의 수는 1개

선언 방식에 따라 커서형, 사용자 정의형, 테이블형 레코드로 나뉨

 

1. 사용자 정의형 레코드

: 선언한 레코드 변수를 통해 내부의 속성들에 접근

테이블의 컬럼에 해당하는 것을 필드라고 한다.

TYPE 레코드명 IS RECORD (
	필드명1 필드1 타입[ [NOT NULL] := 디폴트값 ],
    필드명2 필드2 타입[ [NOT NULL] := 디폴트값 ]
	...
);
레코드변수명 레코드명;

 

예시 1)

DECLARE
    TYPE dept_rect IS RECORD(			-- dep 레코드 타입 선언
      department_id NUMBER := 1,		--혹은 departments.department_id%TYPE
      department_name VARCHAR2(80),		--혹은 departments.department_name%TYPE
      parent_id NUMBER(6),
      manager_id NUMBER(6));
      
    vr_dept_rect dept_rect;				-- 위에서 선언된 타입으로 레코드 변수 선언
    
 BEGIN    
    DBMS_OUTPUT.PUT_LINE(vr_dept_rect.department_id);    
 END;

 

예시 2)

DECLARE
    TYPE emp_type IS RECORD(			-- emp_type 레코드 타입 선언
      emp_no NUMBER(4) NOT NULL := 0,
      ename emp.ename%TYPE,
      JOB VARCHAR2(9)
   	);
    v_emp	emp_type;					-- 위에서 선언된 타입으로 레코드 변수 선언
    
 BEGIN
    v_emp.empno := 9000;
    v_emp.ename :='hong';
    v_emp.job := 'dr';
    
    DBMS_OUTPUT.PUT_LINE('empno' = ' || v_emp.empno);
    DBMS_OUTPUT.PUT_LINE('ename' = ' || v_emp.ename);
    DBMS_OUTPUT.PUT_LINE('job' = ' || v_emp.job);
 END;
 
 
/**************************** 실행 결과
 EMPNO = 9000
 ENAME = HONG
 JOB = DR
 *************************************/

 

 

2. 테이블형 레코드

: 특정 테이블의 모든 컬럼을 받을때 사용하는 레코드 타입이다. %TYPE 대신 %ROWTYPE으로 선언

레코드 변수명 테이블명.%ROWTYPE;

예시 1)

DECLARE
    vr_dept_rect departments%ROWTYPE;
    
    BEGIN
      SELECT * into vr_dept_rect from departments where department_id = 10;
      DBMS_OUTPUT.PUT_LINE(vr_dept_rect.department_id);    

END;

 

 

3. 커서형 레코드

: Cursor를 레코드 변수로 받는 것

커서명%ROWTYPE;
DECLARE
    CURSOR cur_dep IS
        SELECT * from departments;
    vr_dep cur_dep%ROWTYPE;
    
    BEGIN
    OPEN cur_dep;
   	 LOOP
      FETCH cur_dep INTO vr_dep;
      EXIT WHEN cur_dep%NOTFOUND;

      DBMS_OUTPUT.PUT_LINE(vr_dep.department_id);
      DBMS_OUTPUT.PUT_LINE(vr_dep.department_name);

  	  END LOOP;
    
      DBMS_OUTPUT.PUT_LINE(cur_dep%ROWCOUNT);
      --DBMS_OUTPUT.PUT_LINE(vr_dep%ROWCOUNT);
END;

'Database > Oracle' 카테고리의 다른 글

[Oracle] Compress  (0) 2024.02.29
RMAN  (0) 2023.11.12
[Oracle] 자주 쓰는 명령어  (0) 2023.11.10
[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15

RMAN

2023. 11. 12. 20:29
-- sqlplus 접속
sqlplus / as sysdba

ALTER SYSTEM SET log_archive_dest='/ARC_STR' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_format='ARCH_STR_%r_%t_%s.ARC' SCOPE=SPFILE;


-- 아카이브 로그 모드 변경
shutdown immediate;
startup mount;
alter database archivelog;
archive log list;
alter database open

 

 

-- rman 접속
rman target /

-- DB 전체 정보
report schema;

-- DB 파일 상태 점검
validate database;


-- FRA 설정으로 인한 오류
-- ORA-19625: error identifying file /FRA/STR/archivelog/2022_12_16/o1_mf_1_22_ksrogsbd_.arc
-- ORA-27037: unable to obtain file status

rman target /
change archivelog all crosscheck;
-- rman 설정 변경
-- 2일 전의 백업까지 

rman target /

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RMANBKP/control/control_%F';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/RMANBKP/control/snapcontrol_STR.f';

-- rman 설정 원복
CONFIGURE RETENTION POLICY CLEAR;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;

-- rman 설정 확인
show all;
 rman 백업
  oracle 계정
********************************************************/

rman target /


-- %T (YYYYMMDD) 년월일 포멧
-- %U 시스템 생성 고유 파일 이름 8자리

-- 전체 백업
backup database;
backup database format '/RMANBKP/STRDB2_full_n_bkp_%T_%U';

-- 전체 백업 + 압축
backup as compressed backupset database format '/RMANBKP/STRDB2_full_c_bkp_%T_%U';



-- 백업 상태 확인
list backup;
list backup summary;

host 'ls -lh /RMANBKP';
export NLS_DATE_FORMAT="YYYY/MM/DD(DY) HH24:MM:SS"

[Oracle] 자주 쓰는 명령어

2023. 11. 10. 17:00

현재 DB 상태 확인

-- STARTED (NO MOUNT) -> MOUNTED (MOUNT) -> OPEN (OPEN)

SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
STARTED


SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
MOUNTED


SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
OPEN

 

 

SID 확인

SQL> SELECT INSTANCE FROM v$thread;

 

 

Database read only mode

SQL> shutdown immediate;
SQL> alter database open read only;

 


Database status 확인

SQL> select name, open_mode from v$database;

 


Database Primary/Standby 확인

SQL> select database_role from v$database;

 


Control file 상태 확인

  SQL> SELECT controlfile_type FROM V$database;

 


redo group 확인

SQL> select * from v$logfile;



'Database > Oracle' 카테고리의 다른 글

[Oracle] Transaction과 Record  (0) 2024.02.21
RMAN  (0) 2023.11.12
[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Sequence  (0) 2023.03.13

ERROR: ORA-01017 : invalid username/password; logon denied

위와 같은 오류 발생으로 sys 계정 연결 불가 시 아래 쿼리로 비밀번호 변경

 

[oracle@kim ~]$ lsnrctl start
[oracle@kim ~]$ sqlplus / as sysdba

Connected to an idle instance.


SQL> startup

ORACLE instance started.
Database mounted.
Database opened.

SQL> alter user sys identified by [비밀번호];

User altered.

'Database > Oracle' 카테고리의 다른 글

RMAN  (0) 2023.11.12
[Oracle] 자주 쓰는 명령어  (0) 2023.11.10
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Sequence  (0) 2023.03.13
[Oracle] Listener & Oracel DB  (0) 2023.03.12
// root 계정 접속
$ yum -y install epel-release
$ yum list install rlwrap
$ yum -y install rlwrap
 
// oracle 설치 계정 접속
$ vi .bashrc

alias sqlplus="rlwrap sqlplus" <- 추가
 
 
$ source .bashrc

'Database > Oracle' 카테고리의 다른 글

[Oracle] 자주 쓰는 명령어  (0) 2023.11.10
[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] Sequence  (0) 2023.03.13
[Oracle] Listener & Oracel DB  (0) 2023.03.12
[Oracle] SCN, Checkpoint  (0) 2023.03.12

[Oracle] Sequence

2023. 3. 13. 16:33

Sequence ?

자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체

아래와 같은 방법으로 컬럼의 값을 증가 할 수 있음

1. MAX(컬럼) + 1

2. 시퀀스 =  DB에 ROW가 추가 될 때마다 자동으로 +1

 

1. Sequence 생성

CREAT SEQUENCE [스키마명].[시퀀스명]
INCREMENT BY [증감숫자] -- 양수 = 증가 / 음수 = 감소 / default 1
START WITH [시작번호] -- defalut 값은 증가일 때 Minvalue / 감소일 때 Maxvalue
[NOMINVALUE or MINVALUE] [최솟값] 
[NOMAXVALUE or MAXVALUE] [최대값]
-- NOMINVALUE : 디폴트값 설정, 증가일때 1, 감소일때 -1028 
-- MINVALUE : 최소값 설정, 시작숫자와 작거나 같아야하고 MAXVALUE보다 작아야함
-- NOMAXVALUE : 디폴트값 설정, 증가일때 1027, 감소일때 -1
-- MAXVALUE : 최대값 설정, 시작숫자와 같거나 커야하고 MINVALUE보다 커야함
[CYCLE or NOCYCLE] -- 최대값 도달 시 최솟값부터 시작 or not
[CACHE or NOCACHE] -- 메모리에 시퀀스 값을 미리 할당 or not
[ORDER or NOORDER] -- 요청 순으로 값 생성 or not

+ CACHE 설정 시 속도 빠름 / 동시 사용자가 많을 경우 유리

+ ORDER 설정 시 시스템 부하 있을 수 있음

 

--예) 1부터 1씩 증가하여 9999까지 부여
CREATE SEQUENCE TEST_SEQ --시퀀스이름 TEST_SEQ
INCREMENT BY 1 --증가 값 1
START WITH 1 --시작 1
MINVALUE 1 --최소값 1
MAXVALUE 9999 --최대값 9999
NOCYCLE --순환X
CACHE; --메모리에 시퀀스값 미리할당

--예) 1000부터 1씩 감소하여 1까지 부여
CREATE SEQUENCE TEST_SEQ
INCREMENT BY -1
START WITH 1000
MINVALUE 1
MAXVALUE 1000
NOCYCLE
NOCACHE;

 

 

2. Sequence 조회

--전체 sequence 조회
SELECT * FROM SEQ;
SELECT * FROM USER_SEQUENCES;

--현재 sequence 조회
SELECT TEST_SEQ.CURRVAL
  FROM dual;
  
--현재 sequence의 다음 값
--이때, 현 SELECT문으로 시퀀스 값 추가 증가 됨
SELECT TEST_SEQ.NEXTVAL
  FROM dual;
+ CURRVAL은 여러번 실행해도 순번은 증가 X
+ NEXTVAL을 한번 실행한 세션에서만 사용 가능하다. 위의 쿼리만 사용 시 아래 에러 발생
ORA-08002 : emp_seq.CURRVAL은 이 세션에서는 정의 되어있지않습니다

 

* NEXTVAL 및 CURRVAL을 사용할 수 있는 경우
 - 서브쿼리가 아닌 SELECT문
 - INSERT문의 SELECT절
 - INSERT문의 VALUE절
 - UPDATE문의 SET절


* NEXTVAL 및 CURRVAL을 사용할 수 없는 경우
 - VIEW의 SELECT절
 - DISTINCT 키워드가 있는 SELECT문
 - GROUP BY, HAVING, ORDER BY절이 있는 SELECT문
 - SELECT, DELETE, UPDATE의 서브쿼리
 - CREATE TABLE, ALTER TABLE 명령의 DEFAULT값

 

 

3. Sequence 수정

시퀀스는 DDL문으로, ALTER문으로 수정

ALTER SEQUENCE TEST_SEQ INCREMENT BY 2 --증가값을 2로 변경
ALTER SEQUENCE TEST_SEQ MAXVALUE 99999 --최대값을 9999에서 999로 변경

※ STARTWITH (시작값) 변경 불가

 

 

4. Sequence 삭제

DROP SEQUENCE TEST_SEQ

 

 

 

 

 

참고 https://mine-it-record.tistory.com/62 https://coding-factory.tistory.com/420 https://gent.tistory.com/393

'Database > Oracle' 카테고리의 다른 글

[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Listener & Oracel DB  (0) 2023.03.12
[Oracle] SCN, Checkpoint  (0) 2023.03.12
[Oracle] 구조  (0) 2023.03.09

[Oracle] Listener & Oracel DB

2023. 3. 12. 18:33

Listener 리스너

  • 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자
  • 기본 포트 번호 1521 (다른 번호 사용 가능)
  • listener.ora 파일에 텍스트 형식으로 기록

 

listener.ora 파일?

더보기
  • 오라클 서버에서 클라이언트 요청을 듣고, 클라이언트와의 통신 환경을 설정하는 파일
  • 오라클 서버에 존재, 오라클 클라이언트에서 서버로 접속할 때 필요한 프로토콜 및 포트 정보 등을 설정하는 파일
--리스너 관리모드
$ lsnrctl

--리스너 시작
$ lsnrctl start

--리스너 중지
$ lsnrctl stop

--리스너 재시작
$ lsnrctrl reload

리눅스 환경에서는 정확한 경로에 접근해서 해당 프로그램을 실행해야 한다. lsnrctl 프로그램의 정확한 위치는 오라클홈 밑의 bin 디렉터리에 있다.

ex) '/app/oracle/a/bin'

 

 

연결 과정

1. user가 리스너로 연결 요청 (tnsnames.ora 파일 확인 & 리스너의 주소와 포트번호 등 확인)

2. 리스너가 Server process에 연결 요청 (자신이 연결 할 포트번호 등을 listener.ora에서 확인)

3. Server process에서 PGA 메모리 할당(Program Global Area - Process들이 개별적으로 사용하는 메모리 공간)

4. Server process에서 User process에게 Resend 패킷 전송

5. 연결

 

 

tnsnames.ora 파일?

더보기
  • 클라이언트가 오라클 서버에 접속하기 위해 서버 컴퓨터에 작성하는 설정 파일
  • 클라이언트에서 오라클 서버로 접속할 때 필요한 프로토콜 및 포트 번호, 서버 주소, 인스턴스 등을 설정해주는 파일
  • TNS는 TCP 프로토콜만 받을 수 있음
LISTENER_CDB1 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102(PORT = 1521))
 
 
CDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb1)
    )
  )
listener.ora 파일 수정
$vi $ORACLE_HOME/network/admin/listener.ora
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 설정했던 host name 또는 host IP)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )


리스너가 DB를 못 찾을 경우 listener.ora에 아래 내용 추가

SID_LIST_LISTENER =
 (SID_LIST =
  (SID_DESC =
   (GLOBAL_DBNAME = DB명)
   (ORACLE_HOME = ORACLE_HOME 경로
   (SID_NAME = DB명)
  )
 )

 

 

Oracel

+ 먼저 아래 명령어 입력으로 Oracle DB 생성

$dbca

 

> startup

입력 시 문자가 제대로 출력되지 않는다면 아래 내용으로 문자셋 설정 편집

더보기

$ vi .bash_profile

 
$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
 
$ resource .bash_profile
--Oracle 접속
$ sqlplus '/as sysdba'

--인스턴스 시작
> startup

--인스턴스 중지
shutdown

 

'Database > Oracle' 카테고리의 다른 글

[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Sequence  (0) 2023.03.13
[Oracle] SCN, Checkpoint  (0) 2023.03.12
[Oracle] 구조  (0) 2023.03.09

[Oracle] SCN, Checkpoint

2023. 3. 12. 17:46

SCN (System Change Number)

- DB의 변경이 발생한 시점 / Commit이 발생하면 트랜잭션은 고유한 번호를 받음

이때 발생한 번호로 트랜잭션 관리* & 장애 발생 시 복구 키로 이용

*트랜잭션 관리 : 읽기 일관성, 사용자들에게 가장 최근에 커밋된 데이터 보여줌

 

-  Data file, Control file, Redo Log File의 동기화 정보를 맞춤

- Data file : 실제 데이터가 저장되는 디스크 상의 물리적 파일
- Control file : DB의 제어 정보를 가지고 있는 파일
                            (파일이 손상되면 mount, open 불가 -> 2개 이상으로 백업하여 각각 다른 디스크에 보관 권고)

- Redo Log File : DB에서 생긴 모든 변화를 기록한 파일
                                 장애 복구에 가장 핵심 / 작업 내용 유실 X

 

- SCN이 다르다면 DB가 정상적으로 올라오지 않음

∵ Oracle이 startup 된 후 Mount -> Open 시점에 컨트롤파일과 데이터파일의 SCN을 비교해서 DB를 올릴지 판단 함

-- 현재 SCN 확인
SQL> select current_scn from v$database;

 

Checkpoint

- Commit 된 데이터를 어디까지 저장했는지 확인하기 위해 만들어 놓은 개념 (인스턴스 복구를 시작해야 하는 SCN)

   ex) SCN이 100번까지 commit 되었고, checkpoint 정보가 90번이라면 SCN 90번 트랜잭션까지 데이터 파일에 저장된 것

- DBWR이 현재 Buffer Cache 데이터를 디스크로 백업

- Datafile의 복구를 결정하는 기초적인 정보

- 체크포인트를 통해 정기적으로 기록함으로써 롤 포워드(Redo) 시간을 단축 ( 복구 시간 단축 )

- 디스크에 기록된 만큼의 Redo Log 데이타는 삭제

- Control file과 Data file의 Check point 정보를 비교하고 서로 정보가 다르다면, Online Redo/Archived Redo Log를 참조하여 복구

- 체크포인트 발생 시 CKPT가 Control file과 Data file Header에 Checkpoint 기록

- 체크 포인트 발생 → CKPT 에서 DBWn 에 체크포인트 발생 사실 통지 → DBWn 은 블록을 디스크에 기록

 

1. Database / Global Checkpoint

  • DB 버퍼 캐시에 있는 모든 dirty buffe의 내용을 데이터 파일로 저장
  • 저장된 가장 큰 SCN의 번호(Checkpoint SCN)를 Control file과 Data file Header에 기록

 

2. Thred Checkpoint / Logical Checkpoint

  • Log Switch 발생 시 생성
  • RAC 환경일 경우 각 노드별로 다르게 발생, Single Instance일 경우 Database Check point와 같은 역할

 

3. Datafile Checkpoint

  • 특정 data file에만 발생
  • 해당 Tablespace를 오프라인 한다거나, Begin backup 수행 시 발생
  • Control fil과 Data file Header에 기록

 

4. Mini Checkpoint

  • Drop Table과 같이 특정한 DDL 발생 시 특정 블록에만 발생

 

5. Recovery Checkpoint

  • 데이터 파일에 장애 발생 시 백업된 데이터파일 복원 후 Redo Change Vector를 적용 시킨 후 recovery 된 블록을 데이터 파일에 저장 시 발생
-- checkpoint_change# : 가장 마지막 checkpoint의 SCN
SQL> select checkpoint_change# from v$datafile ;

'Database > Oracle' 카테고리의 다른 글

[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Sequence  (0) 2023.03.13
[Oracle] Listener & Oracel DB  (0) 2023.03.12
[Oracle] 구조  (0) 2023.03.09

[Oracle] 구조

2023. 3. 9. 21:08

오라클 서버 (Oracle Server)

 : 메모리와 디스크에 생성되는 구조

└- 인스턴스 (Instance)

     : 메모리 부분에 생성되는 구조

    └- SGA (System Global Area)

          : 실제 작업들이 수행되는 공간

         └- Database Buffer Cache

              : 데이터의 조회와 변경 등 실제 작업이 일어나는 공간

         └- Redo Log Buffer

              : 변경 내용을 기록하는 메모리 공간

         └- Shared Pool

              : 어떤 대상을 공유해서 사용하기 위한 공간

              └- Library Cache

                   : Soft Parse시 사용, SQL과 실행계획 등이 저장된 공간

              └- Data Dictionary Cache

                   : 구문분석이나 실행계획을 세울때 사용하는 Dictionary들이 Cache 되어진 공간

              └- Server Result Cache

                   : 결과값을 Cache 해 두는 공간

         └- Large Pool

         └- Java Pool

         └- Streams Pool

         └- Fixed SGA

    └- 백그라운드 프로세스 (Background Process)

          : Oracle Server 가 잘 운영되도록 하는 역할

         └- DBWR

               : 데이터 파일로 저장하는 역할

         └- LGWR

               : Redo Log Buffer에 있는 내용을 Redo Log File로 저장하는 역할

         └- PMON

               : 모든 서버 프로세스들 감시

         └- SMON

               : Instance Clean Up 역할

               : Instance Recovery 과정에서 누락된 Transaction Recovery 역할

               : 비정상 종료된 Transaction이 사용 중이던 Temporary segment 를 Clean up 역할

               : Dictionary Managed Tablespace 에서 Free extents들을 모아주는 역할

         └- CKPT

               : DBWR에게 Checkpoint 신호를 전달

         └- ETC

    └- PGA (Program Global Area)

          : Process들이 개별적으로 사용하는 메모리 공간

         └- SQL Work Area

              : Sort 관련 작업을 수행하는 공간

         └- Private SQL Area

└- 데이터베이스 (Database)

     : 디스크 (Disk) 에 위치한 파일들의 세트

    └- 데이터 파일 (Data File)

         : 데이터 (Data) 를 저장하는 공간

    └- 컨트롤 파일 (Control File)

         : DB 운영 정보 저장

    └- 리두 로그 파일 (Redo log File)

         : 변경 내용을 기록하는 파일 공간

 

 

출처 오라클 구조 (Oracle Structure) 를 Tree 형식으로 쉽고 간단하게 알아보자~(?) (tistory.com)

 


1. 메모리

1.1 공유 메모리 영역 SGA(System Global Area)

- 운영체제가 제공해준 것. 여러 프로세스가 동시에 엑세스할 수 있는 메모리 영역

- 인스턴스가 복구 될 때마다 메모리에 할당 됨

- Lock을 걸어 베타적 제어*를 하지 않으면 데이터에 손상을 입을 수 있음

*베타적 제어 : 프로세스가 공유 데이터를 변경하고 있는 도중에 다른 프로세스가 해당 공유 데이터를 읽거나 변경하지 못하도록 하는 것

 

Buffer Cache : 디스크파일로부터 데이터 블록을 담는 캐시 영역.
자주 사용하는 데이터를 더 빠르게 가져오기 위해 존재. LRU 알고리즘 *사용

Buffer Cache 상태
pinned : 지금 사용 중인 상태. 다른 사람이 사용을 못하는 lock 상태
unused : startup 이후 한번도 사용하지 않은 상태
free : 변경된 내용이 Disk에 백업이 완료된 상태
dirty : 내용이 수정되었지만 아직 Disk에 백업이 되지 않은 상태. 백업이 되면 다시 free 상태가 됨.

*LRU (Lease Recently Used) 알고리즘 : 가장 최근에 사용하지 않은 데이터부터 캐시아웃

ex) 1 -> 2-> 3 순차 호출

3 → 2 → 1

2번 캐시 호출

2 → 3 → 1

캐시에 4를 새로 씀 / LRU인 1 제거

4 → 2 → 3 → 1

 

 

Cache와 Buffer
Cache : 속도가 다른 두 장치간의 속도 차이를 줄여주기 위한 장치.
데이터 저장소로 이용되므로 데이터를 저장하여 추후에도 계속 사용 가능
Buffer : 데이터를 전송하는 상호간의 장치에서 저속의 장치가 작업을 하는 동안 고속의 장치가 기다려야 하는 현상을 줄여주는 장치. (데이터를 읽어오기 위해 디스크까지 가지 않아도 됨)
데이터 손실 방지 & 사용된 데이터는 삭제 됨

 

 

 

1.2 프로세스 고유 메모리 영역 PGA(Process Global Area)

- 서버 프로세스가 가진 자신만의 메모리 영역. DB에 접속하는 모든 유저에게 할당되는 각각의 서버 프로세스가 독자적으로 사용하는 오라클 메모리 영역.

- SQL의 작업 공간. 정렬 작업을 수행(sort) → PGA 메모리 용량 부족 시 TEMPORARY TABLESPACE를 사용

하나의 유저 프로세스에 하나의 서버 프로세스가 할당되며, 하나의 서버 프로세스는 하나의 PGA를 생성

 

PGA 구조

정렬 공간
Sort Area
유저 프로세서 세션 정보
User Session Data
파싱 정보가 기록된 주소
Cursor State
변수 저장 공간
Stack Space
- Sort Area : Order By 또는 Group By 등의 정렬을 수행하기 위한 공간이며 해당 공간에서만 정렬이 완료된다면 이를 메모리 정렬이라 함
- Session Information : 서버 프로세스에 의해 추출된 결과 값을 전달하기 위해 필요한 유저 프로세스의 세션 정보를 저장
- Cursor State : 해당 SQL의 Parsing 정보가 저장되어 있는 주소를 저장
(Cursor : SQL문을 처리하는 정보를 저장한 메모리 공간)
- Stack Space : SQL문장에 Bind Variable를 사용했을 경우 해당 바인드 변수를 저장하는 공간

 

 

 

1.3 RAC (Real Application Cluster)

  • 하나의 Database에 여러개의 Instance를 구성하는 방식 = 하나의 Instance에 장애가 발생하여도 DB운영에 지장X
  • n개의 Instance에서 동일한 datafile을 공유하여 엑세스
  • CPU나 메모리 등의 자원은 공유X
  • SPFILE* 권장

 

*SPFILE (서버파라미터 파일)

  • 바이너리 형식
  • PFILE을 사용해 수동으로 생성되거나, DB 생성 시 사용하는 DBCA에 의해 자동으로 생성됨
  • NOMOUNT 단계 이상이라면 다시 SPFILE을 쓰기 때문에 제거하거나 이동하면 안됨
spfile$SID.ora
ALTER SYSTEM SET [파라미터명 = 값] [SCOPE]
  • 수정 시 인스턴스 재기동 불필요

*SCOPE 옵션

MEMORY - 변경 즉시 적용 / 재시작 시 원래 설정 값으로 돌아감

SPFILE - SPFILE에만 변경 적용 / 현재 상태에는 영향X

BOTH - 변경 즉시 SPFILE에도 적용 / 재시작 시 변경 내용 반영

 

cf) PFILE (파라미터 파일)

  • 텍스트 형식으로 변경 가능
  • 파일 수정 시 인스턴스 재 기동으로 적용
  • DB 생성이나 장애 발생 시 사용

--pfile

더보기
-- Pfile
$ cd /ORA19/app/.../dbs
$ vi Init$SID.ora

 

+ RAC Ping 현상: Instance 1에서 변경 완료 된 데이터를 Instance 2 로 가져오기 위해 디스크에 저장 후 해당 데이터를 Instance 2 로 복사해오는 작업

 

'Database > Oracle' 카테고리의 다른 글

[Oracle] 관리자 계정(system, sys) 비밀번호 변경  (0) 2023.03.16
[Oracle] 이전 명령어 방향키로 출력  (0) 2023.03.15
[Oracle] Sequence  (0) 2023.03.13
[Oracle] Listener & Oracel DB  (0) 2023.03.12
[Oracle] SCN, Checkpoint  (0) 2023.03.12

+ Recent posts