■ 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
'Oracle 11g > Oracle DB' 카테고리의 다른 글
49 ORACLE Tablespace, VM Backup, Control File, Redo log file (0) | 2023.12.18 |
---|---|
48 ORACLE ASSM, Tablespace, Undo (0) | 2023.12.14 |
46 ORACLE ASMM, PGA, AMM, Background Process, Control file (0) | 2023.12.12 |
45 ORACLE Parameter, Pfile, SGA, Redo Log Buffer (1) | 2023.12.11 |
44 ORACLE Listener, Alert Log File, Startup, Shutdown (2) | 2023.12.08 |