251202 TIL

2025. 12. 2. 19:21Courses/아이티윌 오라클 DBA 과정

Redo Log File

https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/physical-storage-structures.html#GUID-47557C86-E551-46B5-B28E-28D6C500694E

 

Database Concepts

The physical database structures of an Oracle database are viewable at the operating system level.

docs.oracle.com

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-the-redo-log.html#GUID-BC1F1762-0BB1-4218-B7AF-6160C395AAE4

 

Database Administrator’s Guide

You manage the redo log by completing tasks such as creating redo log groups and members, relocating and renaming redo log members, dropping redo log groups and members, and forcing log switches.

docs.oracle.com

  • 데이터의 모든 변경 사항 기록
  • 복구 방식 제공(instance failure, media failure 발생 시 복구 방식을 제공)
  • 최소 두 개 이상의 파일 필요
select * from v$log;

  • SEQUENCE#이 가장 큰 그룹이 CURRENT
  • Redo Log File의 블록은 OS 블록으로 만들어지기 때문에 512B
  • MEMBERS 는 그룹이 가지는 로그 파일 수
    • 디스크가 깨지더라도 문제가 발생하지 않도록 로그 파일을 다중화하여 여러 디스크에 분산하여 저장

  • ARCHIVED는 Archive 되었는지 여부
  • STATUS는 로그 파일의 상태 정보
  • FIRST_CHANGE#는 해당 그룹에 작성된 Redo Entry 중 가장 작은 SCN
  • NEXT_CHANGE# 전까지의 SCN 가짐
  • Redo Log File이 가득 차면 Log Switch가 발생

Log Switch

  • Redo Log File이 가득차면 LGWR는 다음 Redo Log Group(Inactive 상태)으로 이동해서 write
  • Log Switch 발생
    • Partial Checkpoint 발생
    • Control File 정보 기록

수동으로 Log Switch 발생

  • alter system switch logfile;
SYS@ora19c> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1          7  209715200        512          1 NO  INACTIVE               2272468 26-NOV-25      2374125 26-NOV-25       0
         2          1          8  209715200        512          1 NO  INACTIVE               2374125 26-NOV-25      2467344 27-NOV-25       0
         3          1          9  209715200        512          1 NO  CURRENT                2467344 27-NOV-25   1.8447E+19                 0

# 수동으로 Log Switch 발생
SYS@ora19c> alter system switch logfile;

System altered.

SYS@ora19c> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1         10  209715200        512          1 NO  CURRENT                2574145 02-DEC-25   1.8447E+19                 0
         2          1          8  209715200        512          1 NO  INACTIVE               2374125 26-NOV-25   2467344 27-NOV-25          0
         3          1          9  209715200        512          1 NO  ACTIVE                 2467344 27-NOV-25   2574145 02-DEC-25          0

Log Switch 문제점

  • Log Switch 빈번하게 발생 → Checkpoint가 자주 발생 → Data Buffer Cache의 블록들이 데이터 파일로 내려감 → 물리적 I/O가 많이 발생
    • 기존 Redo Log File의 사이즈가 부족하기 때문 → Redo Log File 사이즈를 늘려줘야 함
  • Log Switch 발생 시 다음 로그 파일이 ACTIVE 상태인 경우 Overwrite 불가
    Checkpoint not complete 오류 발생
    → 체크포인트가 끝날 때까지 DML 불가

Log Group 추가

SYS@ora19c> col member format a50

# 로그 정보 조회
SYS@ora19c> select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b
where a.group# = b.group#;  2    3

    GROUP#  SEQUENCE# MEMBER                                                     MB STATUS           FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- -------------------------------------------------- ---------- ---------------- ------------- ------------
         3         12 /u01/app/oracle/oradata/ORA19C/redo03.log                 200 INACTIVE               2578076      2578079
         2         14 /u01/app/oracle/oradata/ORA19C/redo02.log                 200 CURRENT                2578082   1.8447E+19
         1         13 /u01/app/oracle/oradata/ORA19C/redo01.log                 200 INACTIVE               2578079      2578082

# 로그 그룹 추가
SYS@ora19c> alter database add logfile group 4 '/u01/app/oracle/oradata/ORA19C/redo04.log' size 200m;

Database altered.

SYS@ora19c> select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b
where a.group# = b.group#;  2    3

    GROUP#  SEQUENCE# MEMBER                                                     MB STATUS           FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- -------------------------------------------------- ---------- ---------------- ------------- ------------
         3         12 /u01/app/oracle/oradata/ORA19C/redo03.log                 200 INACTIVE               2578076      2578079
         2         14 /u01/app/oracle/oradata/ORA19C/redo02.log                 200 CURRENT                2578082   1.8447E+19
         1         13 /u01/app/oracle/oradata/ORA19C/redo01.log                 200 INACTIVE               2578079      2578082
         4          0 /u01/app/oracle/oradata/ORA19C/redo04.log                 200 UNUSED                       0            0

# 로그 그룹 추가
SYS@ora19c> alter database add logfile group 5 '/u01/app/oracle/oradata/ORA19C/redo05.log' size 200m;

Database altered.

# 로그 정보 조회
SYS@ora19c> select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b
where a.group# = b.group#;  2    3

    GROUP#  SEQUENCE# MEMBER                                                     MB STATUS           FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- -------------------------------------------------- ---------- ---------------- ------------- ------------
         3         12 /u01/app/oracle/oradata/ORA19C/redo03.log                 200 INACTIVE               2578076      2578079
         2         14 /u01/app/oracle/oradata/ORA19C/redo02.log                 200 CURRENT                2578082   1.8447E+19
         1         13 /u01/app/oracle/oradata/ORA19C/redo01.log                 200 INACTIVE               2578079      2578082
         4          0 /u01/app/oracle/oradata/ORA19C/redo04.log                 200 UNUSED                       0            0
         5          0 /u01/app/oracle/oradata/ORA19C/redo05.log                 200 UNUSED                       0            0

# 로그 파일 생성됨
SYS@ora19c> ! ls -lh $ORACLE_BASE/oradata/ORA19C/*.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 13:51 /u01/app/oracle/oradata/ORA19C/redo01.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:11 /u01/app/oracle/oradata/ORA19C/redo02.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 13:51 /u01/app/oracle/oradata/ORA19C/redo03.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:09 /u01/app/oracle/oradata/ORA19C/redo04.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:10 /u01/app/oracle/oradata/ORA19C/redo05.log

Current Log Group 변경

# Partial Checkpoint 발생, checkpoint 과정이 느림
SYS@ora19c> alter system switch logfile;

System altered.

SYS@ora19c> /

System altered.

SYS@ora19c> select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b
where a.group# = b.group#;  2    3

    GROUP#  SEQUENCE# MEMBER                                                     MB STATUS           FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- -------------------------------------------------- ---------- ---------------- ------------- ------------
         3         12 /u01/app/oracle/oradata/ORA19C/redo03.log                 200 INACTIVE               2578076      2578079
         2         14 /u01/app/oracle/oradata/ORA19C/redo02.log                 200 ACTIVE                 2578082      2579526
         1         13 /u01/app/oracle/oradata/ORA19C/redo01.log                 200 INACTIVE               2578079      2578082
         4         15 /u01/app/oracle/oradata/ORA19C/redo04.log                 200 ACTIVE                 2579526      2579533
         5         16 /u01/app/oracle/oradata/ORA19C/redo05.log                 200 CURRENT                2579533   1.8447E+19

# Full Checkpoint 발생, 강제로 수행하기 때문에 checkpoint 과정이 빠름
SYS@ora19c> alter system checkpoint;

System altered.

SYS@ora19c> select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b
where a.group# = b.group#;  2    3

    GROUP#  SEQUENCE# MEMBER                                                     MB STATUS           FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- -------------------------------------------------- ---------- ---------------- ------------- ------------
         3         12 /u01/app/oracle/oradata/ORA19C/redo03.log                 200 INACTIVE               2578076      2578079
         2         14 /u01/app/oracle/oradata/ORA19C/redo02.log                 200 INACTIVE               2578082      2579526
         1         13 /u01/app/oracle/oradata/ORA19C/redo01.log                 200 INACTIVE               2578079      2578082
         4         15 /u01/app/oracle/oradata/ORA19C/redo04.log                 200 INACTIVE               2579526      2579533
         5         16 /u01/app/oracle/oradata/ORA19C/redo05.log                 200 CURRENT                2579533   1.8447E+19

Redo Log Group Member 추가

[oracle@ora19c ~]$ cd $ORACLE_BASE/fast_recovery_area/ORA19C/onlinelog
[oracle@ora19c onlinelog]$ pwd
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog
# Redo Log Group Member 추가
SYS@ora19c> alter database add logfile member
        '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log' to group 1,
        '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log' to group 2,
        '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log' to group 3,
        '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log' to group 4,
        '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log' to group 5;

Database altered.

SYS@ora19c> ! ls -lh $ORACLE_BASE/fast_recovery_area/ORA19C/onlinelog/
total 1001M
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:44 redo01.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:44 redo02.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:44 redo03.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:44 redo04.log
-rw-r-----. 1 oracle oinstall 201M Dec  2 14:44 redo05.log
-- 로그 정보 조회
select a.group#, a.sequence#, b.member, a.bytes/1024/1024 mb, a.status, a.first_change#, a.next_change#
from v$log a, v$logfile b 
where a.group# = b.group#;

Redo Log Group 및 Member 추가

alter database add logfile group 6 (
    '/u01/app/oracle/oradata/ORA19C/redo05.log', 
    '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log') size 100m;

ORA-01577: '/u01/app/oracle/oradata/ORA19C/redo05.log' 로그 파일은 이미 데이터베이스의 일부이므로 추가할 수 없습니다
alter database add logfile group 6 (
    '/u01/app/oracle/oradata/ORA19C/redo06.log', 
    '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo06.log') size 100m;

Redo Log Group 삭제

alter database drop logfile group 6;

  • CURRENT 나 ACTIVE 상태의 로그 그룹은 삭제 불가
alter database drop logfile group 5;

ORA-01623: 5 로그는 ora19c 인스턴스(1 스레드)에 대한 현재 로그임 - 삭제할 수 없음
ORA-00312: 온라인 로그 5 스레드 1: '/u01/app/oracle/oradata/ORA19C/redo05.log'
ORA-00312: 온라인 로그 5 스레드 1: '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log'
  • Redo Log Group은 최소 2개이상 필요
  • 그룹 삭제 후 물리적 파일을 꼭 삭제해야 함
[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo03.log  /u01/app/oracle/oradata/ORA19C/redo05.log
/u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo04.log  /u01/app/oracle/oradata/ORA19C/redo06.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo06.log

# 물리적 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/oradata/ORA19C/redo06.log /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo06.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo03.log  /u01/app/oracle/oradata/ORA19C/redo05.log
/u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo04.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log

Redo Log Group Member 삭제

alter database drop logfile member '/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log';

주의점

  • CURRENT 나 ACTIVE 상태의 member는 삭제 불가
  • Member를 삭제한 후 물리적 파일을 꼭 삭제해야 함
[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log

# Member File 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo01.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log
  • Member를 삭제하려는 경우 마지막 group 안에 member가 1개인 경우는 멤버를 바로 삭제할 수 없고, 그룹으로 삭제해야 함
alter database drop logfile member '/u01/app/oracle/oradata/ORA19C/redo01.log';

ORA-00361: 마지막 로그 멤버 /u01/app/oracle/oradata/ORA19C/redo01.log는 그룹 1를 옮길수 없습니다

alter database drop logfile group 1;

# 1번 로그 그룹 추가 -> 1번 물리 로그 파일을 삭제하지 않았기 때문에 오류 발생
alter database add logfile group 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' size 50m;

ORA-00301: 로그 파일 '/u01/app/oracle/oradata/ORA19C/redo01.log'를 추가 작성할 수 없습니다
ORA-27038: 생성한 파일이 존재합니다.

# 1번 물리 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/oradata/ORA19C/redo01.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo04.log
/u01/app/oracle/oradata/ORA19C/redo03.log  /u01/app/oracle/oradata/ORA19C/redo05.log

# 1번 로그 그룹 추가 -> 성공
alter database add logfile group 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' size 50m;

삭제하려는 로그 파일 그룹이 CURRENT인 경우

  • INACTIVE 상태의 로그 파일 그룹은 삭제 가능
# 2번 로그 파일 그룹 삭제
alter database drop logfile group 2;

# 2번 물리 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/oradata/ORA19C/redo02.log /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo02.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo04.log
/u01/app/oracle/oradata/ORA19C/redo03.log  /u01/app/oracle/oradata/ORA19C/redo05.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log

# 2번 로그 그룹 추가
alter database add logfile group 2 '/u01/app/oracle/oradata/ORA19C/redo02.log' size 50m;

# 3번 로그 파일 그룹 삭제
alter database drop logfile group 3;

# 3번 물리 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/oradata/ORA19C/redo03.log /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo03.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo04.log
/u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo05.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log  /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log

# 3번 로그 그룹 추가
alter database add logfile group 3 '/u01/app/oracle/oradata/ORA19C/redo03.log' size 50m;

# 4번 로그 파일 그룹 삭제
alter database drop logfile group 4;

# 4번 물리 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/oradata/ORA19C/redo04.log /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo04.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo03.log
/u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo05.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
/u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log

  • ACTIVE 또는 CURRENT 상태의 로그 파일 그룹은 삭제 불가 → 강제로 로그 스위치 및 checkpoint 발생
# 5번 로그 파일 그룹이 CURRENT 상태이므로 삭제 불가
# => 로그 스위치를 수동으로 발생시켜 Partial Checkpoint 수행
# Checkpoint가 오래 걸리기 때문에 ACTIVE 상태임
alter system switch logfile;

# 강제로 Full Checkpoint 발생시켜 5번 로그 파일 그룹의 상태를 빠르게 INACTIVE 로 변경
alter system checkpoint;

# 5번 로그 파일 그룹 삭제
alter database drop logfile group 5;

# 5번 물리 로그 파일 삭제
[oracle@ora19c ~]$ rm /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/redo05.log /u01/app/oracle/oradata/ORA19C/redo05.log

[oracle@ora19c ~]$ ls /u01/app/oracle/oradata/ORA19C/*.log
/u01/app/oracle/oradata/ORA19C/redo01.log  /u01/app/oracle/oradata/ORA19C/redo02.log  /u01/app/oracle/oradata/ORA19C/redo03.log

[oracle@ora19c ~]$ ls /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log
ls: cannot access /u01/app/oracle/fast_recovery_area/ORA19C/onlinelog/*.log: No such file or directory

저장 구조

https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/logical-storage-structures.html

 

Database Concepts

This chapter describes the nature of and relationships among logical storage structures. These structures are created and recognized by Oracle Database and are not known to the operating system.

docs.oracle.com

 

Tablespace

  • 오라클은 데이터를 논리적으로 tablespace에 저장하고 물리적으로 data file에 저장
  • tablespace는 하나 이상의 data file로 구성됨
  • taplespace는 하나 이상의 segment로 구성됨
  • tablespace는 segment를 위한 논리적 저장 공간

Data File

  • data file은 오라클 서버에 실행 중인 운영체제를 따르는 물리적 구조
  • data file은 하나의 테이블스페이스에 속해야 함

Segment

  • 테이블, 인덱스, UNDO, LOB 등 오라클이 제공하는 논리적 공간을 의미
  • 데이터베이스에서 공간을 차지하는 객체를 말하며, 특정한 테이블스페이스에 속함
  • 세그먼트는 테이블스페이스에 속한 여러 데이터 파일로 확장 가능

Extent

  • segment는 하나 이상의 extent로 구성됨
  • extent는 연속된 오라클 블록으로 구성됨
  • segment가 사용하는 공간 영역
  • segment에서 extent 할당
    • create(생성될 경우)
    • extend(확장될 경우)
    • alter(변경될 경우)
  • segment에서 extent 해제
    • drop(삭제될 경우)
    • alter(변경될 경우)
    • truncate(잘릴 경우)

Block

  • 오라클 데이터베이스에서 데이터는 블록에 저장됨
  • 오라클 최소 I/O 단위
  • 오라클이 사용할 수 있는 블록 크기는 2K, 4K, 8K, 16K, 32K
  • db_block_size 파라미터로 기본 크기가 결정됨
    • DB 생성 시 결정됨
SYS@ora19c> show parameter db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
  • 오라클 블록은 OS 블록을 기반으로 생성

테이블스페이스 관리

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-tablespaces.html#GUID-1C162C60-6698-44F2-B2A9-F3E2D2958D88

 

Database Administrator’s Guide

A tablespace is a database storage unit that groups related logical structures together. The database data files are stored in tablespaces.

docs.oracle.com

select * from dba_tablespaces;

select * from dba_data_files;

테이블스페이스 생성

create tablespace userdata
datafile '/u01/app/oracle/oradata/ORA19C/userdata01.dbf' size 10m;

  • EXTENT_MANAGEMENT=LOCAL, SEGMENT_SPACE_MANAGEMENT=AUTO인 것이 좋음 → 공간을 재활용하기 좋음

  • dba_data_files의 AUTOEXTENSIBLE=NO이면 테이블스페이스 자동 확장 X
    • 테이블스페이스 생성 시 지정한 크기(10MB)이상 데이터를 입력하면 더 이상 공간을 할당할 수 없기 때문에 오류 발생

-- emp 테이블 생성
create table hr.emp
tablespace userdata
as select * from hr.employees;

insert into hr.emp select * from hr.emp; -- 오류날 때까지 반복 수행

ORA-01653: HR.EMP 테이블을 128(으)로 USERDATA 테이블스페이스에서 확장할 수 없습니다

테이블스페이스 삭제

drop tablespace userdata including contents and datafiles;
  • including contents : 테이블스페이스 안에 세그먼트를 먼저 삭제
  • and datafiles : 물리적인 데이터 파일 삭제

테이블스페이스 크기 조정

  • 테이블스페이스 생성 시 데이터 파일의 크기를 자동 확장될 수 있도록 설정
create tablespace userdata
datafile '/u01/app/oracle/oradata/ORA19C/userdata01.dbf' size 5m autoextend on;

-- emp 테이블 생성
create table hr.emp
tablespace userdata
as select * from hr.employees;

-- 세그먼트 정보 조회
select * from dba_segments where owner = 'HR' and segment_name = 'EMP';
-- 익스텐트 정보 조회
select * from dba_extents where owner = 'HR' and segment_name = 'EMP';

-- 테이블스페이스 크기를 넘으면 자동으로 공간 확장
insert into hr.emp select * from hr.emp; -- 반복 수행

-- 세그먼트 정보 조회
select * from dba_segments where owner = 'HR' and segment_name = 'EMP';
-- 익스텐트 정보 조회
select * from dba_extents where owner = 'HR' and segment_name = 'EMP';

테이블스페이스 공간 회수

  • 테이블스페이스 공간 확장된 후 데이터를 삭제하더라도 확장된 공간은 그대로 남음
  • 공간을 회수하려면 TRUNCATE TABLE 수행
-- 위의 insert 작업 후 rollback 수행
rollback;

-- 세그먼트 정보 조회 -> 이전 상태와 동일
select * from dba_segments where owner = 'HR' and segment_name = 'EMP';
-- 익스텐트 정보 조회 -> 이전 상태와 동일
select * from dba_extents where owner = 'HR' and segment_name = 'EMP';

truncate table hr.emp;

-- 세그먼트 정보 조회 -> 공간 회수됨
select * from dba_segments where owner = 'HR' and segment_name = 'EMP';
-- 익스텐트 정보 조회 -> 1개만 남고 모두 제거됨
select * from dba_extents where owner = 'HR' and segment_name = 'EMP';

'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글

251205 TIL  (1) 2025.12.05
251203 TIL  (0) 2025.12.05
251201 TIL  (0) 2025.12.01
251128 TIL  (0) 2025.11.28
251127 TIL  (0) 2025.11.27