프린트 하기

OS환경 : Oracle Linux 6.8 (64bit)


DB 환경 : Oracle Database 11.2.0.4


방법 : redo log size 를 50MB에서 200MB로 변경하고자 함 + 이중화


리두 로그 추가, redo 추가

Redo Log 파일 사이즈 변경 순서 요약


1. inactive 상태의 리두로그 삭제

2. 신규 리두로그 추가

3. 이중화 리두 추가


--리두로그 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL>
set lines 200
set pages 1000
col member for a60
select l.group#, member, archived, l.status, (bytes/1024/1024) MB
from v$log l, v$logfile f
where f.group# = l.group#
order by 1
/
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        YES INACTIVE             50
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES INACTIVE             50
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        NO  CURRENT             50



--리두로그 조회구문 저장

1
2
3
SQL> save log.sql
 
Created file log.sql



1. 리두로그 상태가 INACTIVE 인 경우

--리두로그 그룹 삭제

1
2
3
SQL> alter database drop logfile group 1;
 
Database altered.



--OS 에서 파일 삭제

1
SQL> !rm /oracle/app/oracle/oradata/ORCL11/redo01.log



--REDO 사이즈 변경 후 다시 추가

1
2
3
SQL> alter database add logfile group 1 '/oracle/app/oracle/oradata/ORCL11/redo01.log' size 200m;
 
Database altered.



--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        YES UNUSED            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES INACTIVE             50
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        NO  CURRENT             50



2. 리두로그 상태가 ACTIVE 인 경우

-- ACTIVE 상태에서 INACTIVE 상태가 될때까지 기다린 후 작업

--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        YES UNUSED            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES INACTIVE             50
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        NO  CURRENT             50



--리두로그 그룹 삭제

1
2
3
SQL> alter database drop logfile group 2;
 
Database altered.



--OS 에서 파일 삭제

1
SQL> !rm /oracle/app/oracle/oradata/ORCL11/redo02.log



--REDO 사이즈 변경 후 다시 추가

1
2
3
SQL> alter database add logfile group 2 '/oracle/app/oracle/oradata/ORCL11/redo02.log' size 200m;
 
Database altered.



--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        YES UNUSED            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        NO  CURRENT             50



3. 리두로그 상태가 CURRENT 인 경우

-- 로그 스위치 진행

1
2
3
SQL> alter system switch logfile; 
 
System altered.



--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        NO  CURRENT            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        YES ACTIVE             50



체크 포인트 실행

1
2
3
SQL> alter system checkpoint;
 
System altered.



--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        NO  CURRENT            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        YES INACTIVE             50



--INACTIVE 상태로 된것을 확인 후 작업

--리두로그 그룹 삭제

1
2
3
SQL> alter database drop logfile group 3;
 
Database altered.



--OS 에서 파일 삭제

1
SQL> !rm /oracle/app/oracle/oradata/ORCL11/redo03.log



--REDO 사이즈 변경 후 다시 추가

1
2
3
SQL> alter database add logfile group 3 '/oracle/app/oracle/oradata/ORCL11/redo03.log' size 200m;
 
Database altered.



--리두로그 재확인

1
2
3
4
5
6
7
SQL> @log.sql
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        NO  CURRENT            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        YES UNUSED            200


--1번 리두부터 이중화를 해보려함

--기존 추가 구문과 다르게 용량을 적지 않아도됨 제일뒤에 group 을 명시해줌

1
2
3
SQL> alter database add logfile member '/oracle/app/oracle/oradata/ORCL11/redo01_2.log' to group 1;
 
Database altered.



--리두로그 재확인

1
2
3
4
5
6
7
8
SQL> @log
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        NO  CURRENT            200
     1 /oracle/app/oracle/oradata/ORCL11/redo01_2.log     NO  CURRENT            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        YES UNUSED            200

--용량을 적지 않았지만 자동으로 기준 redo size인 200M을 할당함



--2번, 3번 group의 redo log파일도 생성

1
2
3
4
5
6
7
SQL> alter database add logfile member '/oracle/app/oracle/oradata/ORCL11/redo02_2.log' to group 2;
 
Database altered.
 
SQL> alter database add logfile member '/oracle/app/oracle/oradata/ORCL11/redo03_2.log' to group 3;
 
Database altered.



--리두로그 재확인

1
2
3
4
5
6
7
8
9
10
11
12
SQL> @log
 
    GROUP# MEMBER                            ARC STATUS             MB
---------- ------------------------------------------------------------ --- ---------------- ----------
     1 /oracle/app/oracle/oradata/ORCL11/redo01.log        NO  CURRENT            200
     1 /oracle/app/oracle/oradata/ORCL11/redo01_2.log     NO  CURRENT            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02_2.log     YES UNUSED            200
     2 /oracle/app/oracle/oradata/ORCL11/redo02.log        YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03_2.log     YES UNUSED            200
     3 /oracle/app/oracle/oradata/ORCL11/redo03.log        YES UNUSED            200
 
6 rows selected.

정삭적으로 redo 그룹이 이중화됨



*LogSwitch(로그 스위치)

모든 트랜잭션을 시간 순서대로 리두 로그 버퍼에 저장. 리두로그버퍼는 매우 작은 원형 큐(circular queue) 의 형태로 구현. 

다음 네가지 상황이 발생하는 경우에 LGWR(log writer)는 리두 로그 버퍼의 리두 엔트리를 로그파일에 내려 씀

1. 트랜잭션이 커밋될 때

2. 리두 로그 버퍼가 1/3이상 채워졌을 때

3. 리두 로그 버퍼에서 변경된 레코드의 크기가 1M을 넘기는 경우

4. DBWR(DB Writer)가 dirty block을 데이터 파일에 저장하기 직전

LGWR이 리두 엔트리를 지정하는 리두 그룹의 상태가 current

LGWR가 다른 그룹을 사용하기 위해 이동하는 것을 로그 스위치(log switch)



*CheckPoint(체크포인트) 종류

체크포인트는 동기화를 의미함

"체크포인트 직후의 데이터 파일은 모든 변경내역을 반영했으므로, 체크포인트 전에 생성된 리두는 불필요하다." 는 것을 의미

로그스위치 체크포인트는 각 로그 파일이 꽉 찼을때 발생.

체크포인트 발생 -> dbwr 데이터 블록을 디스크로 기록 -> 기록 완료시점에 데이터파일 헤더 블록의 SCN변경.

ckpt 는 incremental 체크포인트를 위해 컨트롤파일 내 low RBA (또는 SCN, 혹은 둘다) 를 매 3초마다 변경함



*Oracle Database가 체크 포인트를 시작하는 경우

checkpoint process (CKPT)는 체크 포인트를 data file header 및 control file 에 기록함

checkpoint는은 다양한 상황에서 발생함

예를 들어, Oracle Database는 다음 유형의 checkpoint를 사용함


Thread checkpoints(쓰레드 체크포인트)

데이터베이스는 특정 대상 이전의 특정 스레드에서 redo에 의해 수정된 모든 버퍼를 디스크에 기록함

데이터베이스의 모든 인스턴스에서 Thread checkpoints 집합은 database checkpoint임

Thread checkpoints는 다음 상황에서 발생함

1. 데이터베이스 정상 종료시

2. ALTER SYSTEM CHECKPOINT 구문 실행시

3. Online redo log switch 시

4. ALTER DATABASE BEGIN BACKUP 구문 실행시


Tablespace and data file checkpoints(테이블스페이스 및 데이터 파일 체크포인트)

데이터베이스는 특정 대상 이전에 redo에 의해 수정 된 모든 버퍼를 디스크에 기록함

Tablespace checkpoints는 data file checkpoints 집합으로, 테이블스페이스의 data file에 대해 각각 존재함

이러한 checkpoints는 테이블스페이스를 읽기 전용으로 만들거나 오프라인으로 전환하거나, 데이터 파일을 축소하거나, Alter TABLESPACE BEGIN BEGIN BACE Backup을 실행하는 등 다양한 상황에서 발생함


Incremental checkpoints(증분 체크포인트)

Incremental checkpoints는 온라인 리두 로그 스위치에서 많은 수의 블록을 쓰지 않도록 의도 된 일종의 스레드 체크 포인트입니다.  


Incremental checkpoints는 부분적으로 Online redo log switch 시 많은 수의 블록을 쓰지 않도록 의도된 유형의 스레드 체크포인트임

DBWn 은 최소한 3초마다 점검하여 수행 할 작업이 있는지 확인함

DBWn 은 더티 버퍼를 쓸 때 검사 점 위치를 진행시켜 CKPT가 검사 점 위치를 제어 파일에 기록하지만 데이터 파일 헤더에는 기록하지 않습니다.

DBWn이 더티 버퍼를 쓸 때 checkpoint position를 첨부하여 CKPT가 checkpoint position를 control file에 기록하지만 data file header에는 기록하지 않게함

(checkpoint position: 인스턴스 복구 시작점)


(위 내용은 아래 docs 내용을 구글 번역기의 도움을 받아 발번역한거라 문장이 어색할수 있음)




참조 : https://blog.naver.com/hanajava/220762899503

https://sksstar.tistory.com/104

http://wiki.gurubee.net/pages/viewpage.action?pageId=26745419

https://docs.oracle.com/cd/E11882_01/server.112/e40540/startup.htm#CNCPT89045

https://positivemh.tistory.com/147