■ Redo log file
- 복구 방식 제공
- 순환형식 구조라서 최소 두개 이상의 그룹 필요 (순환 -> overwrite)
- 그룹이 적고 용량이 작다 > 주기가 짧다 > 성능하락
- log_switch 발생주기 first_time -> 그래프 리포트화

SELECT * FROM v$log;
SELECT * FROM v$logfile;
SELECT * FROM v$log_history;


# Redo log file group 추가
- 운영중 작업 가능

SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /u01/app/oracle/oradata/ora11g/control01.ctl, 
                                                 /u01/app/oracle/fast_recovery_area/ora11g/control02.ctl


ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/oracle/oradata/ora11g/redo04.log',
                                    '/u01/app/oracle/fast_recovery_area/ora11g/redo04.log') size 100M;
>>> 그룹명과 파일명 통일화. 이중화구성


SELECT * FROM v$logfile;


SELECT * FROM v$log;




# Redo log file member 추가
- 운영중 작업 가능

ALTER DATABASE ADD LOGFILE MEMBER
'/u01/app/oracle/fast_recovery_area/ora11g/redo01.log' TO GROUP 1,
'/u01/app/oracle/fast_recovery_area/ora11g/redo02.log' TO GROUP 2,
'/u01/app/oracle/fast_recovery_area/ora11g/redo03.log' TO GROUP 3;


SELECT * FROM v$log;

- 기존 그룹의 용량 그대로 생성된다.


SELECT * FROM v$logfile;

- INVALID : 사용중인 그룹에 멤버를 신규 추가하여 내용이 없다. 



# Redo log file group 삭제
redo log group 상태가 inactive 상태인 그룹(+멤버)에 대해서 삭제할 수 있다.


SELECT * FROM v$log;

ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 3;
SELECT * FROM v$log;

- ACTIVE, CURRENT 상태를 꼭 삭제해야한다면 log switch 발생하여 inactive 상태로 만들자.
    ALTER SYSTEM SWITCH LOGFILE;
- inactive상태여도 최소 2개  파일 구성이 필요하기에 삭제가 안된다. ORA-1567 signalled during

- 그룹을 삭제한 후 물리적인 디렉터리 내 파일도 직접 삭제해야 한다. 꼭!! 해당하는 파일만 지우자. 
/u01/app/oracle/oradata/ora11g/
/u01/app/oracle/fast_recovery_area/ora11g/



# Redo log file member 삭제
redo log group 상태가 inactive 상태인 그룹의 member를 삭제할 수 있다.

ALTER DATABASE ADD LOGFILE GROUP 6 ('/u01/app/oracle/oradata/ora11g/redo06.log',
                                    '/home/oracle/backup/redo06.log') size 100m;
>>> 그룹을 만들다 위치를 잘못 만들었다!!

ALTER DATABASE DROP LOGFILE MEMBER '/home/oracle/backup/redo06.log';
[oracle@oracle backup]$ rm redo06.log
>>> control file 정보만 수정이라 물리적 디렉터리에서도 해당하는 파일만 삭제해야한다.

ALTER DATABASE ADD LOGFILE MEMBER
'/u01/app/oracle/fast_recovery_area/ora11g/redo06.log' TO GROUP 6;

SELECT * FROM v$log;
SELECT * FROM v$logfile;



# 수동으로 log switch 발생
ALTER SYSTEM SWITCH LOGFILE;
SELECT * FROM v$log;

STATUS
- ACTIVE : 체크포인트가 덜 끝났다.
- CURRENT : 사용중
- ACTIVE, CURRENT : 사용중에는 멤버그룹 삭제 안된다.


ALTER SYSTEM SWITCH LOGFILE;
SELECT * FROM v$log;

- INACTIVE 상태의 그룹 중 랜덤으로 CURRENT 한다.

- ALTER SYSTEM SWITCH LOGFILE; 작업 시
[oracle@oracle trace]$ tail -f alert_ora11g.log
...
Thread 1 advanced to log sequence 16 (LGWR switch)
  Current log# 5 seq# 16 mem# 0: /u01/app/oracle/oradata/ora11g/redo05.log
  Current log# 5 seq# 16 mem# 1: /u01/app/oracle/fast_recovery_area/ora11g/redo05.log
...
Thread 1 cannot allocate new log, sequence 21
Checkpoint not complete        --> 잦은 log_switch 발생으로 작업지연
  Current log# 4 seq# 20 mem# 0: /u01/app/oracle/oradata/ora11g/redo04.log
  Current log# 4 seq# 20 mem# 1: /u01/app/oracle/fast_recovery_area/ora11g/redo04.log





■ 오라클은 데이터를 논리적으로 tablespace에 저장하고 물리적으로 data file에 저장한다.

tablespace
- 오라클 데이터베이스는 데이터는 tablespace에 저장
- tablespace는 하나 이상의 data file로 구성한다.
- tablespace는 하나 이상의 segment로 구성한다.
- 일반적으로 업무팀별 구성


data file
- data file은 oracle server에 실행중인 운영체제를 따르는 물리적 구조이다.
- tablespace는 data file이라고 하는 하나 이상의 파일로 구성되어있다.


segment
- segment는 tablespace안의 특정 논리적 저장 영역 구조에 할당된 영역이다.
- TABLE, INDEX, UNDO, LOB 등 오라클이 제공하는 논리적 공간을 의미한다.
- segment는 tablespace에 속한 여러 data file로 확장할 수 있다.


extent
- 하나이상의 extent로 segment를 구성한다.
- extent는 연속된 oracle block 집합


block
- 오라클 데이터베이스의 data(row)는 block에 저장된다.
- 오라클의 최소 I/O 단위
- 오라클이 사용할 수 있는 block 크기는 2k, 4k, 8k, 16k, 32k
- db_block_size 파라미터로 기본 크기를 결정한다.
- 오라클 블록은 하나 이상의 os 블록을 가지고 생성한다.


 




■ 테이블 스페이스 생성

# 로컬로 관리되는 테이블스페이스
- 사용가능한 extent에 대해서 테이블스페이스(자기 스스로)에서 관리하는 방식
- 비트맵은 사용 가능한 확장영역(extent)을 기록하는데 사용한다.

예시)
CREATE TABLESPACE userdata
DATAFILE '/u01/app/oracle/oradata/ora11g/userdata01.dbf' size 100m
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1m;
>>> extent 크기를 균일하게 1mb로 생성하겠다. local 직접관리

SELECT * FROM dba_data_files;
SELECT * FROM dba_tablespaces;
> EXTENT_MANAGEMENT : LOCAL



# 딕셔너리 관리 테이블스페이스 (8i)
- 사용가능한 extent에 대해서 데이터 딕셔너리에서 관리한다.
    fet$ : free extent 정보
    uet$ : 사용한 extent 정보
- extent를 할당하거나 할당이 해제 될 때 딕셔너리 테이블에 대해서 갱신이 발생한다.
- enq : ST - contention : wait event

예시)
CREATE TABLESPACE dict_tab
DATAFILE '/u01/app/oracle/oradata/ora11g/dict_tab01.dbf' size 100m
EXTENT MANAGEMENT DICTIONARY DEFAULT STOREGE(inital 1m next 1m pctincrease 0);
extent 관리를 dictionary로 한다 (1m로 만들어 > 두번째 1m로 만들어>  그다음부터는 앞에꺼를 가지고 균일하게 만들어)
테이블스페이스에 생성 직전 extent   free공간이 있는지 dictionary 공간에서 조회
-> select - commit - ... > extent 생성할 때마다 성능저하

SELECT * FROM uet$;    -- user extent
SELECT * FROM fet$;    -- free extent



# 파일 시스템 정보
[oracle@oracle ~]$ df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             831M     0  831M   0% /dev
tmpfs                850M  287M  563M  34% /dev/shm
tmpfs                850M  9.4M  840M   2% /run
tmpfs                850M     0  850M   0% /sys/fs/cgroup
/dev/mapper/ol-root   47G   19G   29G  40% /
/dev/sda1           1014M  233M  782M  23% /boot
tmpfs                170M   12K  170M   1% /run/user/42
tmpfs                170M     0  170M   0% /run/user/1001





■ FLM (FreeList Management)
- PCTUSED, FREELISTS, FREELISTS GROUPS 사용하는 방식

CREATE TABLESPACE flm_tab
DATAFILE '/u01/app/oracle/oradata/ora11g/flm_tab01.dbf' size 5M
EXTENT MANAGEMENT  UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT MANUAL;

SELECT * FROM dba_tablespaces;
SELECT * FROM dba_data_files;


# 안에 테이블 생성
CREATE TABLE hr.emp
TABLESPACE flm_tab
AS SELECT * FROM hr.employees;

DROP TABLE hr.emp PURGE;

CREATE TABLE hr.emp
PCTFREE 20
PCTUSED 30
STORAGE (FREELISTS 2)
TABLESPACE flm_tab
AS SELECT * FROM hr.employees;



SELECT * FROM dba_tables WHERE owner = 'HR' AND table_name = 'EMP';
TABLE_NAME : EMP
TABLESPACE_NAME : FLM_TAB
PCT_FREE : 10   -- 기존 ROW들의 증가분 때문에 남겨둔 프리공간(UPDATE) (기본값:10%)
                -- transaction slot 생성 여유 공간(23byte)
PCT_USED : 40   -- insert시에 기존 block을 재사용할 수 있는는가를 판단하는 기준.(기본값:40%)
                    기준이하여야 재사용가능.
FREELISTS : 1   -- INSERT 시 필수 체크(header block), 동시 INSERT 작업가능 수
FREELIST_GROUPS : 1


# 수정가능
ALTER TABLE hr.emp
            PCTFREE 30
            PCTUSED 60
            STORAGE (FREELISTS 10);


SELECT * FROM dba_segments WHERE owner = 'HR' AND segment_name = 'EMP';
HEADER_FILE : 7 : header block이 만들어진 데이터파일번호
HEADER_BLOCK : 128 : 헤더블럭번호


SELECT * FROM dba_extents WHERE owner = 'HR' AND segment_name = 'EMP';
EXTENT_ID : 0 : 시퀸스
BLOCK_ID : 128 : 블럭번호, 무작위


SELECT * FROM dba_tables WHERE owner = 'HR' AND table_name IN ('EMP', 'EMPLOYEES');
TABLE_NAME  TABLESPACE_NAME PCT_USED
EMPLOYEES   EXAMPLE         
EMP         FLM_TAB         40


SELECT * FROM dba_tablespaces;
> SEGMENT_SPACE_MANAGEMENT : 세그먼트 공간관리
MANUAL : PCT_USED : 40, FREELISTS : 1
AUTO





https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-the-redo-log.html

 

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


https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/logical-storage-structures.html#GUID-3502CA78-FBC9-4927-B455-0ECB22E53066

 

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