검색결과 리스트
Oracle 참고서적 정리/오라클 관리실무에 해당되는 글 12건
- 2015.07.30 7.Tablespace와 Datafile 관리하기 - Undo Tablespace / 1
- 2015.07.27 7. Tablespace와 Datafile 관리하기 - Data file 이동 / 테이블스페이스 삭제
- 2015.07.16 7. Tablespace와 Data File 관리하기.
- 2015.07.16 6. Redo Log 관리하기 - SCN과 Checkpoint
- 2015.07.16 6-3. Redo Log 관리하기 - 실습
- 2015.06.18 6-2. Redo Log File 구성 및 관리하기.
- 2015.06.18 6-1 Redo Log 관리하기(Redo Log 생성원리)
- 2015.06.17 5. Control File 관리하기
- 2015.06.15 4.Oracle 시작하기와 종료하기.
- 2015.06.14 3. Oracle Background Processes
글
Tablespace와 Datafile 관리하기.
1.Undo Tablespace
- Undo Data : 사용자가 DML을 수행할 경우 발생하는 원본데이터.
- Undo Segment: Undo Data만 저장하는 Segment
- Undo Tablespace: Undo Segment를 저장하는 Tablespace
Undo Data만 저장 가능하며, Oracle Server process가 직접관리한다.
1-1) Undo Tablespace의 특징.
- Oracle server process는 이 테이블 스페이스에 Undo Segment를 생성하고 각 사용자별로 Undo Segment를 할당하여 undo data를 관리하며 사용자는 관여할 수 없다.
- Undo Tablespace는 Instance당 여러 개가 존재할 수 있으나, 사용되는것은 한번에 1개뿐.
- 관리방법으로는 자동 모드와 수동 모드가 있으며, 9i버젼부터 Automatic Undo Management(AUM)을 권장한다.
사용하기 위해서는 초기화 파라미터 파일에 Undo_management = auto로 설정하고 수동 mode 관리를 위해서는 manual로 설정하면된다.
- 자동모드가 기본이며, manual값은 주로 장애가 발생될 경우 복구용도로 사용된다. 변경 후 적용을 위해서는 Instance를 재기동 해야한다.
SYS@PROD>show parameter undo
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 |
1-2) Undo Tablespace의 사용목적.
- Transaction Rollback : 사용자가 Rollback 명령어를 사용하면, 이곳에 저장된 Undo Data를 사용하여 Rollback 수행.
- Read Consistency : CR 작업을 통해 트랜잭션이 끝나지 않은 데이터는 변경 전 데이터를 보여준다.
* CR 작업 : 1. 데이터를 DB Buffer Cache로 복사
2. Redo Log Buffer에 변경내용기록
3. Undo Segment에 기록
4. DB Buffer cache의 원본 변경
*읽기 일관성 실습
- 터미널 1에서 EMPNO 7369의 이름을 GOOD BOY로 변경
DB BUFFER CACHE에 이름이 변경되고, LOCK이 설정되어 터미널1에서 COMMIT 이나 ROLLBACK 수행 전까지는 터미널2에서 변경된 데이터를 볼 수 없음.
- 터미널 2에서 변경된 데이터에 대한 조회를 수행
사용자의 SERVER PROCESS는 UNDO에 있는 데이터를 DB BUFFER CACHE로 복사해서 사용자에게 제공
터미널 1 | 터미널2 | ||
SCOTT@PROD> select EMPNO, ENAME from EMP;
EMPNO ENAME ---------- ---------- 7369 HELLO 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER |
| ||
SCOTT@PROD> UPDATE EMP SET ENAME ='GOODBOY' WHERE EMPNO=7369;
|
| ||
SCOTT@PROD> select EMPNO, ENAME from EMP;
EMPNO ENAME ---------- ---------- 7369 GOODBOY 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER | SCOTT@PROD> select EMPNO, ENAME from EMP;
EMPNO ENAME ---------- ---------- 7369 HELLO 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER | ||
SCOTT@PROD> COMMIT; |
| ||
SCOTT@PROD> select EMPNO, ENAME from EMP;
EMPNO ENAME ---------- ---------- 7369 GOODBOY 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER | SCOTT@PROD> select EMPNO, ENAME from EMP;
EMPNO ENAME ---------- ---------- 7369 GOODBOY 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE 7782 CLARK 7788 SCOTT 7839 KING 7844 TURNER 7876 ADAMS 7900 JAMES 7902 FORD 7934 MILLER |
- Transaction Recovery (Instance Recovery라고도함)
운영중인 DB서버가 비정상적으로 종료가 되었을 때 Roll Forward와 Roll back 작업을 수행해서 Dirty database를 Clean Database로 만들어주는 과정에서 Undo Data 사용
1-3) Undo Segment 할당되는 원리
- Undo Tablespace의 특징 중 하나는 Undo Data File의 크기가 증가만 되고 줄어들지는 않는다.
- Undo Tablespace 안에 4개의 Undo Segment 가 할당되어 있다.
- E라는 사용자가 신규접속하여 DML을 수행할 경우 E 사용자의 Server Process는 가장먼저 Undo Segment를 할당받게된다.
기존에 만들어져 있던 Segment 중 트랜잭션이 완료된것이 있는지를 우선적으로 확인 후, 그시점에 A가 Commit 을 수행하여 트랜잭션이 끝났다면, A가 사용했던 Undo Segement를 덮어쓰게된다.
- F 라는 사용자가 접속하여, DML을 수행하려하는데 Commit 이나 Rollback을 수행하지 않아서 트랜잭션이 완료된게 없는 경우 새로운 Undo Segment를 하나 더 생성해서 기록한다.
- Undo Segment가 Data file의 저장공간이 허용하는 범위까지 늘어나다가 Data File에 더 공간이 없게되면 하나의 Segment에 두개 세션이상의 Undo Data를 함께 기록하다가 그 조차도 공간이 없으면 해당 트랜잭션은 에러가나게됨.
* Undo Data가 늘어나도 늘어난 데이터파일의 크기를 줄일 수는 없다. Commit을 수행해도 Undo Segment안에 Undo Data는 지워지지 않고 남아있기 때문.
* Commit 수행 시 다른 서버 프로세스가 덮어 쓸 수 있게 해주는 것일 뿐 Undo Segment 안의 자료를 지우는것은 아니다.
* Undo Tablespace 크기가 비정상적으로 클 경우에는 관리자가 다른 작은 Undo Tablespace를 신규로 만들고, Undo Tablespace를 신규 Undo Tablespace로 변경시킨 후 기존 Undo Tablespace를 삭제해 주어야한다.
1-4) Undo tablespace 변경하기.
1. Undo 상태확인. SYS@PROD>show parameter undo;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 => 현재 인스턴스의 Undo tablespace 는 UNDOTBS1로 지정되어 있다. 2. 신규 Undo Tablespace 생성 SYS@PROD>create undo tablespace undo01 datafile '/u01/app/oracle/oradata/PROD/undo01.dbf' size 10M autoextend on; 3. 현재 Tablespace 목록 확인 TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /home/oracle/systemdest/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE UNDO01 10 /u01/app/oracle/oradata/PROD/undo01.dbf YES ONLINE
6 rows selected. => UNDO01 Tablespace가 생성됨. 4. 새로 생성한 Undo Tablespace로 변경
SYS@PROD>alter system set undo_tablespace=undo01; => Pfile인 경우 이 작업 이후 파라미터파일의 내용도 변경해야 DB 재시작 후 장애가 없음. (작업환경은 SPFILE 사용) ** 참고(value에 경로 없을경우 SPFILE 사용 경로 있을 경우 Pfile사용) SYS@PROD>show parameter pfile
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string 5. 변경된 Undo Tablespace 확인. SYS@PROD>show parameter undo
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDO01 |
1-5) Undo 사용세션 확인.
1) 확인스크립트
select s.sid, s.serial#, s.username, r.name "ROLLBACK SEG" from v$session s, v$transaction t, v$rollname r where s.taddr=t.addr and t.xidusn=r.usn; |
2) 실습
터미널1 (SYS 계정) | 터미널 2 (SCOTT 계정) |
SYS@PROD>@undo_ses
no rows selected |
|
| SCOTT@PROD>update emp set job='DBA' where empno=7369;
1 row updated. |
SYS@PROD>@undo_status SID SERIAL# USERNAME USED_UREC USED_UBLK ---------- ---------- ------------------------------ ---------- ---------- 34 93 SCOTT 1 1
|
|
| SCOTT@PROD>update emp set JOB='ADMIN' where empno=7499 ; |
SYS@PROD>@undo_status
SID SERIAL# USERNAME USED_UREC USED_UBLK ---------- ---------- ------------------------------ ---------- ---------- 34 93 SCOTT 2 1 |
|
| SCOTT@PROD> commit; |
SYS@PROD>@undo_ses
no rows selected |
|
* 추가 테스트 1. 다른 세션에서 SCOTT 계정으로 변경작업을 시도할 경우
SID SERIAL# USERNAME USED_UREC USED_UBLK ---------- ---------- ------------------------------ ---------- ---------- 45 60 SCOTT 1 1 34 93 SCOTT 3 1 32 103 SCOTT 1 1
|
* 추가 테스트 2. SID 34 세션에서 Commit 이나 Rollback을 수행하지 않고 종료할 경우
SID SERIAL# USERNAME USED_UREC USED_UBLK ---------- ---------- ------------------------------ ---------- ---------- 45 60 SCOTT 1 1 32 103 SCOTT 1 1
|
1-6) Undo 관련 주요 파라미터.
- UNDO_RETENTION(초단위)
COMMIT 수행 후에도 해당 UNDO SEGMENT 내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 막아주는 시간.
그러나, Undo segment 여분이 있을 경우에만 적용되며, 만약 모든Undo Segment가 사용중일 경우에는 적용되지않는다.
* ORA-01555. Snapshot too old
사용자 A: 1시간정도 수행되는 특정 데이터의 집계작업을 수행중
사용자 B: 사용자A가 집계중인 데이터를 update 한 후 commit할 경우
사용자 A: 사용자 B가 변경전의 데이터를 Undo Segment에서 찾아서 집계하게됨.
만약 B가 Commit 한 후 사용자 C가 사용자 B의 Undo Segment를 덮어 썻다면 사용자 A는 집계쿼리를 완성할 수 없고. 이때 발생하는 에러가 Snap shot too old Error 이다.
- UNDO_RETENTION_GURANTEE
UNDO_RETENTION이란 파라미터는 UNDO SEGMENT양이 부족하면 설정된 시간이 무시되고 UNDO SEGMENT가 재사용되지만, UNDO_RETENTION_GURANTEE 파라미터를 설정하면, 설정된 시간동안 재활용을 하지않고 지켜준다.
* 이 기능을 사용할 경우 COMMIT을 수행해도 UNDO SEGMENT를 특정 시간동안 재사용 하지 않음으로써, UNDO TABLESPACE의 용량이 증가될 수 있기 때문에 기본값은 NOGURANTEE 이다.
SYS@PROD>select tablespace_name, retention from dba_tablespaces;
TABLESPACE_NAME RETENTION ------------------------------ ----------- SYSTEM NOT APPLY SYSAUX NOT APPLY UNDOTBS1 NOGUARANTEE TEMP NOT APPLY USERS NOT APPLY EXAMPLE NOT APPLY UNDO01 NOGUARANTEE |
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
7. Tablespace와 Datafile 관리하기 - Data file 이동 / 테이블스페이스 삭제 (0) | 2015.07.27 |
---|---|
7. Tablespace와 Data File 관리하기. (0) | 2015.07.16 |
6. Redo Log 관리하기 - SCN과 Checkpoint (0) | 2015.07.16 |
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
설정
트랙백
댓글
글
Tablespace와 Datafile 관리하기
1. Data File 이동
- 특정 디스크에 있는 데이터 파일들의 용량이 점점 증가하여 다른 더 큰 용량의 디스크를 설치 한 후 Data file을 이동시 사용.
- 절대 Datafile을 사용중일 때는 절대로 이동시키거나 복사하면 안된다.
* Tablespace를 Offline 하거나, Shutdown 한 후 작업.
1-1 Tablespace Offline 후 경로변경.
- 기존 경로 : /u01/app/oracle/oradata/PROD/
- 변경 경로 : /home/oracle/datamovedest1
/home/oracle/datamovedest2
1. 디렉토리 생성 [oracle@edydr1p0-PROD ~]$ pwd /home/oracle [oracle@edydr1p0-PROD ~]$ mkdir datamovedest1 [oracle@edydr1p0-PROD ~]$ mkdir datamovedest2 2. DB 접속 후 테이블 스페이스 Off Line 변경.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
SYS@PROD>alter tablespace haksa offline;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf OFFLINE HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected.
3. Off Line 이후 해당 옮기는 경로로 데이터파일 복사
[oracle@edydr1p0-PROD script]$ cp /u01/app/oracle/oradata/PROD/haksa01.dbf /home/oracle/datamovedest1 [oracle@edydr1p0-PROD script]$ cp /u01/app/oracle/oradata/PROD/haksa02.dbf /home/oracle/datamovedest2 4. DB에서 테이블스페이스 설정경로 확인 및 변경.
SYS@PROD>select name from v$datafile;
NAME --------------------------------------------------------------- /u01/app/oracle/oradata/PROD/system01.dbf /u01/app/oracle/oradata/PROD/sysaux01.dbf /u01/app/oracle/oradata/PROD/undotbs01.dbf /u01/app/oracle/oradata/PROD/users01.dbf /u01/app/oracle/oradata/PROD/example01.dbf /u01/app/oracle/oradata/PROD/haksa01.dbf /u01/app/oracle/oradata/PROD/haksa02.dbf
7 rows selected. => Haksa data file기존경로
SYS@PROD>alter tablespace haksa rename datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' to '/home/oracle/datamovedest1/haksa01.dbf';
Tablespace altered.
SYS@PROD>alter tablespace haksa rename datafile '/u01/app/oracle/oradata/PROD/haksa02.dbf' to '/home/oracle/datamovedest2/haksa02.dbf';
Tablespace altered.
SYS@PROD>select name from v$datafile;
NAME ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /u01/app/oracle/oradata/PROD/system01.dbf /u01/app/oracle/oradata/PROD/sysaux01.dbf /u01/app/oracle/oradata/PROD/undotbs01.dbf /u01/app/oracle/oradata/PROD/users01.dbf /u01/app/oracle/oradata/PROD/example01.dbf /home/oracle/datamovedest1/haksa01.dbf /home/oracle/datamovedest2/haksa02.dbf
7 rows selected. => 경로 설정 변경된것 확인
4. 해당 Tablespace 다시 Online으로 변경. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /home/oracle/datamovedest1/haksa01.dbf OFFLINE HAKSA /home/oracle/datamovedest2/haksa02.dbf OFFLINE
7 rows selected.
SYS@PROD>alter tablespace haksa online;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /home/oracle/datamovedest1/haksa01.dbf YES ONLINE HAKSA 20 /home/oracle/datamovedest2/haksa02.dbf NO ONLINE
7 rows selected.
5. 정보조회가 가능한지 확인. SYS@PROD>select count(*) from scott.iphak;
COUNT(*) ---------- 650000 |
1-2 Offline 안되는 테이블스페이스의 Datafile이동
- System Tablespace, 사용중인 Undo Tablespace, default temporary tablespace 해당 테이블스페이스는 Offline이 불가능 하므로, DB 종료 후 진행해야한다.
- Off Line 불가능 확인
SYS@PROD>alter tablespace system offline; alter tablespace system offline * ERROR at line 1: ORA-01541: system tablespace cannot be brought offline; shut down if necessary
SYS@PROD>alter tablespace undotbs1 offline; alter tablespace undotbs1 offline * ERROR at line 1: ORA-30042: Cannot offline the undo tablespace
|
- 실습
1. DB종료 및 Mount 단계까지 기동.
SYS@PROD>shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SYS@PROD>startup mount
ORACLE instance started.
Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 83886080 bytes Redo Buffers 4288512 bytes Database mounted. 2. 변경할 디렉토리 생성 및 System datafile 복사 SYS@PROD>!mkdir /home/oracle/systemdest
SYS@PROD>!cp /u01/app/oracle/oradata/PROD/system01.dbf /home/oracle/systemdest
SYS@PROD>select instance_name from v$intance; select instance_name from v$intance * ERROR at line 1: ORA-01219: database not open: queries allowed on fixed tables/views only * MOUNT 상태기 때문에 조회불가능.
3. 기존 Data file 경로 확인 및 Data file 경로변경. SYS@PROD>select name from v$datafile;
NAME --------------------------------------------------------------- /u01/app/oracle/oradata/PROD/system01.dbf /u01/app/oracle/oradata/PROD/sysaux01.dbf /u01/app/oracle/oradata/PROD/undotbs01.dbf /u01/app/oracle/oradata/PROD/users01.dbf /u01/app/oracle/oradata/PROD/example01.dbf /home/oracle/datamovedest1/haksa01.dbf /home/oracle/datamovedest2/haksa02.dbf
7 rows selected.
SYS@PROD>alter database rename 2 file '/u01/app/oracle/oradata/PROD/system01.dbf' 3 to '/home/oracle/systemdest/system01.dbf';
Database altered.
SYS@PROD>select name from v$datafile;
NAME -------------------------------------------------------------- /home/oracle/systemdest/system01.dbf /u01/app/oracle/oradata/PROD/sysaux01.dbf /u01/app/oracle/oradata/PROD/undotbs01.dbf /u01/app/oracle/oradata/PROD/users01.dbf /u01/app/oracle/oradata/PROD/example01.dbf /home/oracle/datamovedest1/haksa01.dbf /home/oracle/datamovedest2/haksa02.dbf
7 rows selected.
SYS@PROD>alter database open;
Database altered. |
1-3 Redo Log File 이동
- Redo Log File 또한 Offline 불가능 하므로 Database를 Mount 상태로 변경 후 작업해야함.
1. Redo log file 경로 확인 및 DB MOUNT 상태로 변경 SYS@PROD>@log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 27 CURRENT NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 25 INACTIVE YES 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 26 INACTIVE NO
SYS@PROD>select status from v$instance;
STATUS ------------ OPEN
SYS@PROD>shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SYS@PROD>startup mount ORACLE instance started.
Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 83886080 bytes Redo Buffers 4288512 bytes !Database mounted. 2. 경로 이동할 디렉토리 생성 및 Redo log file 복사 SYS@PROD>! mkdir /home/oracle/redodest
SYS@PROD>! rmdir /home/oracle/redodest
SYS@PROD>! mkdir /home/oracle/redodest1
SYS@PROD>! mkdir /home/oracle/redodest2 SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo01a.log cp: missing destination file operand after `/u01/app/oracle/oradata/PROD/redo01a.log' Try `cp --help' for more information.
SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo01a.log /home/oracle/redodest1/redolog01_a.log
SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo02a.log /home/oracle/redodest1/redolog02_b.log
SYS@PROD>!cp /u01/app/oracle/oradata/PROD/redo03a.log /home/oracle/redodest1/redolog03_c.log 3. Redolog file 경로 변경. SYS@PROD>alter database rename 2 file '/u01/app/oracle/oradata/PROD/redo01a.log' 3 to '/home/oracle/redodest1/redolog01_a.log';
Database altered.
SYS@PROD>alter database rename 2 file '/u01/app/oracle/oradata/PROD/redo02a.log' 3 to '/home/oracle/redodest1/redolog02_b.log' 4 ;
Database altered. SYS@PROD>alter database rename 2 file '/u01/app/oracle/oradata/PROD/redo03a.log' 3 to '/home/oracle/redodest1/redolog03_c.log';
Database altered. 4. Redo log 경로 변경 확인
SYS@PROD>select member from v$logfile;
MEMBER --------------------------------------------- /home/oracle/redodest1/redolog01_a.log /home/oracle/redodest1/redolog02_b.log /home/oracle/redodest1/redolog03_c.log
SYS@PROD>@log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /home/oracle/redodest1/redolog01_a.log 100 27 CURRENT NO 2 /home/oracle/redodest1/redolog02_b.log 100 25 INACTIVE YES 3 /home/oracle/redodest1/redolog03_c.log 100 26 INACTIVE NO
|
1-4 Tablespace 삭제하기.
- 테이블스페이스에 테이블이 하나라도 있으면 그냥 안지워진다.
- including contents and datafiles 옵션을 통해 삭제.
SYS@PROD>drop tablespace haksa; drop tablespace haksa * ERROR at line 1: ORA-01549: tablespace not empty, use INCLUDING CONTENTS option
SYS@PROD>drop tablespace haksa including contents and datafiles;
Tablespace dropped.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---- -------------------------------------------------- --- ------- SYSTEM 400 /home/oracle/systemdest/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE => 학사 테이블스페이스 제거 확인.
|
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
7.Tablespace와 Datafile 관리하기 - Undo Tablespace / (1) | 2015.07.30 |
---|---|
7. Tablespace와 Data File 관리하기. (0) | 2015.07.16 |
6. Redo Log 관리하기 - SCN과 Checkpoint (0) | 2015.07.16 |
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
설정
트랙백
댓글
글
Tablespace와 Data File 관리하기.
1. 개요
- 오라클은 데이터를 저장하고 작업할 때 메모리에 논리적으로는 Tablespace라는 공간을 만들어서 작업하며, 물리적으로는 Data File을 만들어서 저장한다.
- 사용자가 SQL을 수행하면 해당 데이터는 반드시 메모리에 있는 Tablespace에 존재해야 한다.
- 메모리에 존재하지 않을 경우 Server Process는 데이터가 저장되어있는 Data File에 가서 해당 데이터가 있는 Block을 찾아서 Tablespace로 가져온 후 사용자가 원하는 데이터를 전달한다.
- Oracle에서는 Database Buffer chache에 Tablespace를 생성하며 사용하는 메모리 공간이 클수록 일반적으로 수해속도가 빨라진다.
2. Tablespace의 종류 및 특징.
1) SYSTEM Tablespace.
- 데이터 딕셔너리들이 저장되어있음.
* 데이터 딕셔너리: 오라클 서버의 모든 정보를 저장하고있는 아주 중요한 테이블이나 뷰를말함.
- 데이터 딕셔너리는 Base Table과 Data Dictionary View로 나눌 수 있다.
- Base Table은 데이터베이스를 생성할 때 생성됨.
- Data Dictionary View는 dbca로 database 생성 시 자동생성 되지만, 수동 생성 경우 catalog.sql을 수행해주어야 한다.
[oracle@edydr1p0-PROD dbhome_1]$ cd $ORACLE_HOME [oracle@edydr1p0-PROD dbhome_1]$ find . -type f -name catalog.sql ./rdbms/admin/catalog.sql |
- Data dictionary에 있는 정보.
1. 데이터베이스의 논리적인 구조와 물리적인 구조 정보들.
2. 객체의 정의와 공간 활용 정보 등
3. 제약조건에 관련된 정보 등
4. 사용자에 관련된 정보 등
5. Role, Priviledge 등에 관련된 정보 등
6. 감사 및 보안에 관련된 정보 등
- Data Dictionary는 크게 Static Dictionary와 Dynamic Dictionary로 나눌 수 있다.
1. Static Dictionary
- 수동으로 업데이트를 해야 정보가 갱신된다.
- 인스턴스가 OPEN 되었을 경우 조회가능
* 딕셔너리 내용 업데이트 쿼리.
SQL> analyze table stest compute statistics;
* 딕셔너리 조회쿼리
select table_name, num_rows
from user_tables
where table_name='테이블명' ;
실습.
SQL> conn scott/tiger
Connected. - Scott 계정접속. SQL> create table stest (no number); - Tablespace
SQL> begin 2 for i in 1..100 loop 3 insert into stest values (i); 4 end loop; 5 commit; 6 end;
7 / - stest 테이블에 값 추가. SQL> select count(*) from stest 100 rows selected. SQL> select table_name, num_rows 2 from user_tables 3 where table_name='STEST';
TABLE_NAME NUM_ROWS ------------------------------ ---------- STEST
- NUM_ROWS 결과가 업데이트 되지 않았음을 확인. - STATIC Dictionary는 수동으로 업데이트해야함.
SQL> analyze table stest compute statistics;
Table analyzed.
SQL> select table_name, num_rows 2 from user_tables 3 where table_name='STEST';
TABLE_NAME NUM_ROWS ------------------------------ ----------
STEST 100 통계정보 업데이트 후 조회. NUM_ROWS 업데이트 된것을 확인할 수 있다. |
* 딕셔너리 정보를 업데이트 하기위한 방법으로, DBMS_STATS라는 패키지도 많이 사용한다.
** Analyze 명령어나 DBMS_STATS 패키지는 해당 테이블을 전체 스캔하는 명령어 이므로 서버의 성능에 아주 나쁜 영향을 줄 수있으므로, 함부로 사용해서는 안되는 명령어이다.
- Static 딕셔너리 분류.
USER_XXX | 해당 사용자가 생성한 내용만 볼 수 있는 딕셔너리. ex) USER_TABLE USER_INDEXES |
ALL_XXX | 해당 사용자가 생성한 것과 생성하지 않았더라도 접근이 가능한 내용을(Select권한을 받은내용) 볼 수 있는 딕셔너리. ALL_INDEXES |
DBA_XXX | 데이터 베이스에 생성되어 있는 내용을 다 볼 수 있는 딕셔너리. ex) DBA_TABLES DBA_INDEXES |
2. Dynamic Performance View
- 실시간으로 변경되는 내용을 볼 수 있는 뷰
- 사용자가 조회할 경우 그 시점의 Control File 이나 메모리에서 데이터를 가져와 보여줌.
- v$로 시작되며, Database가 Nomount 상태일 때 부터 조회가능
2) SYSAUX Tablespace
- 주로 오라클 서버의 성능 튜닝을 위한 데이터들이 저장되어 있음.
- 9i 버전까지는 튜닝관련 딕셔너리들은 SYSTEM Tablespace에 있었으나, 10g버젼부터 성능 튜닝과 관련된 딕셔너리들이 이곳에 별도로 저장이 되었으며, 10g에 새로 등장한 자동튜닝 기능들 AWR, ADDM, ASH 등이 이곳의 정보를 사용한다.
3) 일반 Tablespace
- 일반적으로 많이 사용되는 Tablespace로 관리자가 필요에 의해 만드는 Tablespace.
*** 실습 ***
- Tablespace 생성.
SQL>create tablespace haksa datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' size 1M;
Tablespace created. |
- Tablespace 생성 확인
SQL> select tablespace_name, status, contents, extent_management, segment_space_management from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS EXTENT_MAN SEGMEN ------------------------------ --------- --------- ---------- ------ SYSTEM ONLINE PERMANENT LOCAL MANUAL SYSAUX ONLINE PERMANENT LOCAL AUTO UNDOTBS1 ONLINE UNDO LOCAL MANUAL TEMP ONLINE TEMPORARY LOCAL MANUAL USERS ONLINE PERMANENT LOCAL MANUAL EXAMPLE ONLINE PERMANENT LOCAL AUTO HAKSA ONLINE PERMANENT LOCAL AUTO
7 rows selected. |
- Data file 실제 사용량 확인
- 조회 스크립트 생성. set lines 200; col file# for 999; col ts_name for a10; col total_blocks for 9999999; col used_blocks for 9999999; col pct_used for a10; select distinct d.file_id file#, d.tablespace_name ts_name, d.bytes /1024 / 1024 MB, d.bytes / 8192 MB, sum(e.blocks) used_blocks, to_char(nvl(round(sum(e.blocks)/(d.bytes/8192),4),0)*100,'09.99')|| ' %' pct_used from dba_extents e, dba_data_files d where d.file_id = e.file_id(+) group by d.file_id , d.tablespace_name , d.bytes order by 1,2; |
SQL> @tablespaces
FILE# TS_NAME MB MB USED_BLOCKS PCT_USED ----- ---------- ---------- ---------- ----------- ---------- 1 SYSTEM 400 51200 32280 63.05 % 2 SYSAUX 200 25600 14264 55.72 % 3 UNDOTBS1 200 25600 25216 98.50 % 4 USERS 50 6400 120 01.88 % 5 EXAMPLE 100 12800 7320 57.19 % 6 HAKSA 1 128 00.00 % |
# HAKSA Table space Full 만들어서 장애유도.
SQL> conn scott/tiger Connected. SQL> create table iphak (stduno number) tablespace haksa; Table created. SQL> begin 2 for i in 1..50000 loop 3 insert into iphak values(i); 4 end loop 5 ; 6 commit ; 7 end; 8 /
PL/SQL procedure successfully completed. SQL> / begin * ERROR at line 1: ORA-01653: unable to extend table SCOTT.IPHAK by 8 in tablespace HAKSA ORA-06512: at line 3
|
조치방안 1. Tablespace에 Datafle 추가
- 테이블 스페이스 사용량 확인. SQL> @tablespaces
FILE# TS_NAME MB MB USED_BLOCKS PCT_USED ----- ---------- ---------- ---------- ----------- ---------- 1 SYSTEM 400 51200 32280 63.05 % 2 SYSAUX 200 25600 14336 56.00 % 3 UNDOTBS1 200 25600 25216 98.50 % 4 USERS 50 6400 120 01.88 % 5 EXAMPLE 100 12800 7320 57.19 % 6 HAKSA 1 128 120 93.75 %
6 rows selected.
- 권한 없는 계정으로 테이블스페이스 용량 추가 시도 시 실패. SQL> conn scott/tiger Connected. SQL> alter tablespace haksa 2 add datafile '/u01/app/oracle/oradata/PROD/haksa02.dbf' size 20M 3 ; alter tablespace haksa * ERROR at line 1: ORA-01031: insufficient privileges
- SYSTEM 계정으로 생성. SQL> alter tablespace haksa 2 add datafile '/u01/app/oracle/oradata/PROD/haksa02.dbf' size 20M;
Tablespace altered.
- 테이블 스페이스 용량 재 확인 SQL> @tablespaces
FILE# TS_NAME MB MB USED_BLOCKS PCT_USED ----- ---------- ---------- ---------- ----------- ---------- 1 SYSTEM 400 51200 32280 63.05 % 2 SYSAUX 200 25600 14336 56.00 % 3 UNDOTBS1 200 25600 25216 98.50 % 4 USERS 50 6400 120 01.88 % 5 EXAMPLE 100 12800 7320 57.19 % 6 HAKSA 1 128 120 93.75 % 7 HAKSA 20 2560 00.00 % - 다시 데이터 Insert 후 테이블스페이스 사용률 확인
SQL> conn scott/tiger Connected. SQL> SQL> SQL> SQL> SQL> begin 2 for i in 1..50000 loop 3 insert into iphak values(i); 4 end loop; 5 commit; 6 end; 7 /
PL/SQL procedure successfully completed.
SQL> conn SYSTEM/oracle Connected. SQL> @tablespaces
FILE# TS_NAME MB MB USED_BLOCKS PCT_USED ----- ---------- ---------- ---------- ----------- ---------- 1 SYSTEM 400 51200 32280 63.05 % 2 SYSAUX 200 25600 14336 56.00 % 3 UNDOTBS1 200 25600 25472 99.50 % 4 USERS 50 6400 120 01.88 % 5 EXAMPLE 100 12800 7320 57.19 % 6 HAKSA 1 128 120 93.75 % 7 HAKSA 20 2560 136 05.31 %
7 rows selected.
|
조치 2. 데이터파일 Resize
- 93.75% 사용률의 haksa01 데이터파일 리사이즈.
SYS@PROD>@tablespaces
FILE# TS_NAME MB MB USED_BLOCKS PCT_USED FILE_DIR ----- ---------- ---------- ---------- ----------- ---------- ------------------------------------------------------------------------- 1 SYSTEM 400 51200 32280 63.05 % /u01/app/oracle/oradata/PROD/system01.dbf 2 SYSAUX 200 25600 14368 56.13 % /u01/app/oracle/oradata/PROD/sysaux01.dbf 3 UNDOTBS1 200 25600 25472 99.50 % /u01/app/oracle/oradata/PROD/undotbs01.dbf 4 USERS 50 6400 120 01.88 % /u01/app/oracle/oradata/PROD/users01.dbf 5 EXAMPLE 100 12800 7320 57.19 % /u01/app/oracle/oradata/PROD/example01.dbf 6 HAKSA 1 128 120 93.75 % /u01/app/oracle/oradata/PROD/haksa01.dbf 7 HAKSA 20 2560 136 05.31 % /u01/app/oracle/oradata/PROD/haksa02.dbf |
- 데이터파일 리사이즈 후 사용률 확인
SYS@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' resize 20M; Database altered. SYS@PROD>@tablespaces FILE# TS_NAME MB MB USED_BLOCKS PCT_USED FILE_DIR ----- ---------- ---------- ---------- ----------- ---------- -------------------------------------------------------------------------- 1 SYSTEM 400 51200 32280 63.05 % /u01/app/oracle/oradata/PROD/system01.dbf 2 SYSAUX 200 25600 14368 56.13 % /u01/app/oracle/oradata/PROD/sysaux01.dbf 3 UNDOTBS1 200 25600 25472 99.50 % /u01/app/oracle/oradata/PROD/undotbs01.dbf 4 USERS 50 6400 120 01.88 % /u01/app/oracle/oradata/PROD/users01.dbf 5 EXAMPLE 100 12800 7320 57.19 % /u01/app/oracle/oradata/PROD/example01.dbf 6 HAKSA 20 2560 120 04.69 % /u01/app/oracle/oradata/PROD/haksa01.dbf 7 HAKSA 20 2560 136 05.31 % /u01/app/oracle/oradata/PROD/haksa02.dbf 7 rows selected. |
조치 3. Data file 사이즈 자동증가
- 32 bit용 오라클 경우 파일 1개의 크기는 16GB 까지 가능
- 64 bit용 오라클 경우 파일 1개의 크기는 32GB 까지 가능
- Auto extend 옵션 추가. SYSTEM@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' autoextend on;
Database altered. - auto extend 상태 확인.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE |
Tablespace Offline
- tablespace 오프라인은 더이상 해당 테이블 스페이스를 사용하지 못하게 하는 것.
- 특정 tablespace만 shutdown 시킨다는 의미.
- 데이터파일의 위치를 이동하거나, 특정 Tablespace가 장애가 나서 복구해야할 때 사용함.
1)테이블 스페이스를 Offline으로 하는 방법
1-1) 일반적으로 사용하는 Normal Mode
- haksa 라는 테이블 스페이스를 offline 으로 변경.
- 변경 결과 해당 테이블스페이스를 사용하는 오브젝트 즉, Scott의 iphak 테이블의 조회또한 불가능.
- 온라인으로 변경하면, 조회가능. (당연하지만..ㅋㅋ)
SYS@PROD>alter tablespace haksa offline;
Tablespace altered. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf OFFLINE HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected.
SYS@PROD>select * from scott.iphak; select * from scott.iphak * ERROR at line 1: ORA-00376: file 6 cannot be read at this time ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/haksa01.dbf' SYS@PROD>alter tablespace haksa online;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
SYS@PROD>select count(*) from scott.iphak;
COUNT(*) ----------
650000 |
1-2) Temporary mode.
- 현재 오프라인 시키고자 하는 테이블스페이스의 데이터파일이 하나라도 이상이 생기게 되면 Offline 수행 불가능한데, 이럴 경우 사용하는 것이 offline Temporary
SYS@PROD>alter tablespace haksa offline temporary;
Tablespace altered.
|
1-3) Immediate Mode
- 반드시 Archive Log mode일 경우에만 사용해야함. (이유는..?)
- 데이터파일이 장애가 나서 데이터를 내려쓰지 못하는 상황에서 Tablespace를 Offline 해야할 경우 사용.
- 해당 테이블스페이스를 온라인 할 때 복구메세지가 나옴.
- Tablespace 전체를 Offline 할 수 있으나, 특정 Datafile만 Offline 할 수도 있다.
- RECOVER 모드로 변경된 후 복구 전까지는 해당 테이블 스페이스를 사용하는 테이블에 대한 조회 불가능.
- Tablespace를 오프라인 한 후 Online을 하게되면 수동으로 Check point를 수행해서 SCN 번호를 동기화 시켜야한다.
- No Archive Log 모드일 때 Offline 변경시도.
SYS@PROD>archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination /u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch Oldest online log sequence 24 Current log sequence 26 SYS@PROD>alter database open;
Database altered.
SYS@PROD> SYS@PROD> SYS@PROD> SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
SYS@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' offline; alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' offline * ERROR at line 1: ORA-01145: offline immediate disallowed unless media recovery enabled => 해당 명령어로 Offline 변경 불가. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected. SYS@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' offline drop;
Database altered. =>no archive log 모드에서는 drop 이라는 옵션을 추가하여 Offline 으로 변경해야한다. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf RECOVER HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected. ** 만약 체크포인트가 발생했다면 오프라인 상태의 테이블스페이스와 나머지 테이블 스페이스의 SCN이 다르게된다. 테스트환경에서 강제로 체크포인트 발생 후 확인. SYS@PROD>@chk_point_num
FILE# TS# NAME STATUS CHECKPOINT_CHANGE# ---------- ---------- ------------------------------ ------- ------------------ 1 0 SYSTEM SYSTEM 810703 2 1 SYSAUX ONLINE 810703 3 2 UNDOTBS1 ONLINE 810703 4 4 USERS ONLINE 810703 5 5 EXAMPLE ONLINE 810703 6 6 HAKSA RECOVER 810476 7 6 HAKSA ONLINE 810703
7 rows selected. ** HAKSA 테이블스페이스 데이터파일 중 온라인상태가 있는 경우 Recover 시도 SYS@PROD>recover tablespace haksa ORA-00283: recovery session canceled due to errors ORA-01124: cannot recover data file 7 - file is in use or recovery ORA-01110: data file 7: '/u01/app/oracle/oradata/PROD/haksa02.dbf'
=> 복구가 불가능 하다.
** HAKSA 테이블 스페이스 오프라인시도 SYS@PROD>alter tablespace haksa offline 2 ; alter tablespace haksa offline * ERROR at line 1: ORA-01191: file 6 is already offline - cannot do a normal offline ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/haksa01.dbf'
=> 데이터파일 한개만 오프라인 상태라 Temporary 오프라인을 수행해야한다.
SYS@PROD>alter tablespace haksa offline temporary 2 ;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf RECOVER HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected. => HAKSA Tablespace 오프라인 되었다. ** Haksa Tablespace 복구 진행 SYS@PROD>recover tablespace haksa; Media recovery complete. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf OFFLINE HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected.
** 복구 후 온라인 상태로 변경 SYS@PROD>alter tablespace haksa online;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
=> 온라인상태로 변경 확인 ** SCN 정보가 같은지 확인 SYS@PROD>@chk_point_num
FILE# TS# NAME STATUS CHECKPOINT_CHANGE# ---------- ---------- ------------------------------ ------- ------------------ 1 0 SYSTEM SYSTEM 810716 2 1 SYSAUX ONLINE 810716 3 2 UNDOTBS1 ONLINE 810716 4 4 USERS ONLINE 810716 5 5 EXAMPLE ONLINE 810716 6 6 HAKSA ONLINE 810818 7 6 HAKSA ONLINE 810818
7 rows selected.
=> SCN이 다르므로 강제 체크포인트 발생 YS@PROD>alter system checkpoint 2 ;
System altered.
SYS@PROD>@chk_point_num
FILE# TS# NAME STATUS CHECKPOINT_CHANGE# ---------- ---------- ------------------------------ ------- ------------------ 1 0 SYSTEM SYSTEM 810847 2 1 SYSAUX ONLINE 810847 3 2 UNDOTBS1 ONLINE 810847 4 4 USERS ONLINE 810847 5 5 EXAMPLE ONLINE 810847 6 6 HAKSA ONLINE 810847 7 6 HAKSA ONLINE 810847
7 rows selected.
SYS@PROD>select count(*) from scott.iphak;
COUNT(*) ---------- 650000
=> 오프라인 -> 복구-> 온라인-> 조회가능 |
- Archive Log Mode일 때 Offline
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
SYS@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' offline;
Database altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf RECOVER HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
- 해당 테이블을 스페이스를 온라인으로 변경하여도 복구가 필요하다고 나온다. - 복구를 해야 조회가 가능함. SYS@PROD>alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' online; alter database datafile '/u01/app/oracle/oradata/PROD/haksa01.dbf' online * ERROR at line 1: ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/haksa01.dbf' SYS@PROD>select count(*) from scott.iphak; select count(*) from scott.iphak * ERROR at line 1: ORA-00376: file 6 cannot be read at this time ORA-01110: data file 6: '/u01/app/oracle/oradata/PROD/haksa01.dbf' -해당 테이블 스페이스 복구 * 이미 데이터파일 한개가 offline 상태이기 때문에 Temporary 모드로 오프라인 시도해야함. SYS@PROD>alter tablespace haksa offline temporary;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf RECOVER HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected.
- 해당 테이블스페이스 복구 시도. SYS@PROD>recover tablespace haksa; Media recovery complete. SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA /u01/app/oracle/oradata/PROD/haksa01.dbf OFFLINE HAKSA /u01/app/oracle/oradata/PROD/haksa02.dbf OFFLINE
7 rows selected.
- 복구 후 ONLINE 상태로 변경
SYS@PROD>alter tablespace haksa online;
Tablespace altered.
SYS@PROD>@tbs_auto_status
TABLESPACE MB FILE_NAME AUT ONLINE_ ---------- ---------- -------------------------------------------------- --- ------- SYSTEM 400 /u01/app/oracle/oradata/PROD/system01.dbf NO SYSTEM SYSAUX 200 /u01/app/oracle/oradata/PROD/sysaux01.dbf NO ONLINE UNDOTBS1 200 /u01/app/oracle/oradata/PROD/undotbs01.dbf NO ONLINE USERS 50 /u01/app/oracle/oradata/PROD/users01.dbf NO ONLINE EXAMPLE 100 /u01/app/oracle/oradata/PROD/example01.dbf NO ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa01.dbf YES ONLINE HAKSA 20 /u01/app/oracle/oradata/PROD/haksa02.dbf NO ONLINE
7 rows selected.
* 온라인이 되자 조회가 가능함. SYS@PROD>select count(*) from scott.iphak;
COUNT(*) ----------
650000 SYS@PROD>@chk_point_num
FILE# TS# NAME STATUS CHECKPOINT_CHANGE# ---------- ---------- ------------------------------ ------- ------------------ 1 0 SYSTEM SYSTEM 809510 2 1 SYSAUX ONLINE 809510 3 2 UNDOTBS1 ONLINE 809510 4 4 USERS ONLINE 809510 5 5 EXAMPLE ONLINE 809510 6 6 HAKSA ONLINE 809599 7 6 HAKSA ONLINE 809599
7 rows selected. => Check point 값이 다른것을 확인할 수 있다. 이 경우 데이터 파일 백업을 받는다면, 백업파일 자체가 문제가 있게되며 복구에 문제가 될 수 있다. 이럴경우엔 Check Point 를 발생시켜 동기화 한 후 백업을 받아야함. SYS@PROD>alter system checkpoint;
System altered.
SYS@PROD>@chk_point_num
FILE# TS# NAME STATUS CHECKPOINT_CHANGE# ---------- ---------- ------------------------------ ------- ------------------ 1 0 SYSTEM SYSTEM 809644 2 1 SYSAUX ONLINE 809644 3 2 UNDOTBS1 ONLINE 809644 4 4 USERS ONLINE 809644 5 5 EXAMPLE ONLINE 809644 6 6 HAKSA ONLINE 809644 7 6 HAKSA ONLINE 809644
7 rows selected. |
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
7.Tablespace와 Datafile 관리하기 - Undo Tablespace / (1) | 2015.07.30 |
---|---|
7. Tablespace와 Datafile 관리하기 - Data file 이동 / 테이블스페이스 삭제 (0) | 2015.07.27 |
6. Redo Log 관리하기 - SCN과 Checkpoint (0) | 2015.07.16 |
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
설정
트랙백
댓글
글
- 사용자가 Commit을 수행하게 되면, Oracle은 내부적으로 SCN이라는 번호를 생성해서 트랜잭션을 관리하게된다.
- 이러한 SCN 번호를 통해 트랜잭션을 관리하면서, 장애 발생 시 복구한다.
1. System Commit Number(SCN)
- Instance Recovery 때나 사용자가 Recover 명령을 수행할 때 Oracle은 SCN 정보를 사용하여 데이터베이스에 문제가 있는지 판별하고, 문제가 있다고 판단되는 경우 복구를 수행한다.
- Commit을 수행할 때마다 모든 트랜잭션에 고유한 SCN 번호가 부여된다.
- SCN번호는 DML문장 단위가 아니라 트랜잭션 단위로 할당된다.
- SCN은 SCN Base + SCN Wrap으로 구성되어있다. SCN Base 값이 전부 다 사용되면, SCN Wrap 값이 하나씩 증가되게된다.
- SCN은 Sequence에서 발생시키는게 아니라, kcmgas라는 Function으로 생성된다.
1-1.SCN 기록되는곳.
1) Control File
- Check point 발생했을 때
- Reset Log 발생했을 때
- Incomplete Recovery 수행 때
2) Data blocks(Cache Layer)
- Block Cleanout시 마지막 SCN을 각 Block에 기록
3) Data Blocks(ITL Entries)
- Data block의 Transaction Layer 안에 있는 ITL Entries(Interested Transaction List Entries)에 Commit된 SCN 정보를 기록한다(Block Clean Out).
4) Data File Headers
- 모든 파일의 헤더에 아래의 경우 SCN을 기록한다.
* 마지막 Check Point 발생 시
* Begin Backup 수행 때
* 복구가 되었다면, 사용된 마지막 SCN 을 기록한다.
5) Redo Records, Log Buffer
- Commit이 수행되면 Commit Record에 SCN을 포함하여 저장하게된다.
6) Rollback Segment(Undo Segement)와 Tablespace Headers에도 기록이 된다.
1-2. Commit 관련 파라미터
1)10g R2
SQL> show parameter commit NAME TYPE VALUE ---------------------------------------------- ----------- ------------------------------ commit_point_strength integer 1 commit_write string max_commit_propagation_delay integer 0 |
- Commit_point_strength: 분산 데이터 베이스 환경에서 2-phase Commit에서 사용.
- Commit_write : 사용자가 Commit을 할 때, LGWR이 Redo Log File에 기록하게되는데, 4가지 방식이 있다.
1. Wait :변경된 트랜잭션이 Redo Log File에 기록될 때까지 기다린다.
2. Nowait : Wait과 반대로 Redo Log File에 기록될 때 까지 기다리지 않는다.
3. Immediate : Commit 요청이 들어오면 즉시 Redo Log file에 기록을 시작한다.
4. BATCH : Commit 요청이 들어오더라도 일정 시간 동안 모아서 한꺼번에 기록한다.
4가지 방식 중 두개씩 조합해서 사용한다.
* IMMEDIATE+WAIT: COMMIT이 수행되면 즉시 redo log file에 기록을 요청하고, redo log file에 기록되기를 기다린다.
* IMMEDIATE+NOWAIT : Commit이 수행되면, 즉시 Redo Log File에 기록을 요청만하고 사용자에게 제어권을 넘겨 다른작업을 진행할 수 있도록한다.
BATCH나 NOWAIT같이 Redo Log Buffer의 내용이 아직 Redo Log File에 기록이 완료되지 않아도 다른 작업을 할 수 있도록 성능을 높이는 방식을 비동기식 커밋 이라고하며, 10g R2버전의 new feature이다.
* 동기식 커밋: Server Process가 Commit 요청을 수행할 때, LGWR이 Redo Log Buffer의 내용을 Redo Log File에 기록을 완료 후 후속작업을 지할 수 있는 방식.
이 방식은 LGWR의 작업이 완료된 후 후속작업을 진행하기 때문에 안정성은 비동기식 커밋보다 좋지만, 성능면에서는 떨어지는 단점이 있다.
* Batch나 NOWAIT 방식 Commit이 수해되어도 즉시 Redo Log File에 기록을 하지 않음으로 성능은 빠르겠으나, 데이터가 안전하게 지켜지는것은 보장하지 못한다.
2)11g R2
* 초기상태. SQL> show parameter commit
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ commit_logging string commit_point_strength integer 1 commit_wait string commit_write string SQL> alter system set commit_logging = immediate;
System altered.
SQL> show parameter commit
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ commit_logging string IMMEDIATE commit_point_strength integer 1 commit_wait string commit_write string SQL> alter system set commit_wait = nowait;
System altered.
SQL> alter system set commit_write = immediate, nowait;
System altered.
SQL> show parameter commit ;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ commit_logging string IMMEDIATE commit_point_strength integer 1 commit_wait string NOWAIT commit_write string IMMEDIATE, NOWAIT |
- max_commit_propagation_delay
RAC환경에서 홍길동이라는 데이터가 양쪽 인스턴스에 호출된 경우
노드 1: 홍길동 -> 일지매로 변경 후 Commit
노드 2: Commit과 동시에 홍길동의 정보를 조회하면 홍길동이 아닌 일지매로 보여야한다.
하지만, node1에서 Commit된 정보가 node2 에 도달하지 않으면 node2에서는 잘못된 정보를 볼 수 있는 문제가 발생한다.
Oracle에서는 node1에서 발생한 정보를 node 2에 전송할 때 piggyback이라는 방식으로 전송하는데, 이 방식은 Commit 발생 시 즉시 보내는 것이 아니라, 다른메세지가 갈때 함께 업혀가는 방식. 그러므로 메세지 발생양은 작고 트래픽 양은 작은 장점이 있을 수 있으나 틀린 내용을 조회할 수 있다는 단점이 있다.
그래서 max_commit_propagation_delay 파라미터를 사용하여 전송시간을 제어한다. 10g 부터 이 파라미터의 기본값은 0으로 설정되어 무조건 commit 하지마자 전송하도록 설정되어있다.
이런 방식을 Broadcast on commit(BOC) 방식이라고 한다.
2. System Change Number(SCN)
- SCN의 다른 이름으로 System Change Number가 있다.
- Data File, Redo Log File, Control File 간의 동기화 정보를 맞추기 위해 사용된다
- SCN_Base + SCN_Wrap + SCN_Sequence 로 구성되어있다.
- SCN_Sequence는 동일한 SCN Block을 여러개의 서버프로세스가 동시에 변경할 경우 이를 구분하기위해 사용하게된다.
- 이 SCN은 Datablock Header, Redo Records, Segment Header에 기록하게된다.
- Commit을 하면 DB Buffer Cache에서 데이터를 안내려쓰고 Redo log를 내려쓰는것이 시간도 더 빠르다고하여 Fast commit이라고 한다.
- 변경된 블록이 많을 경우 일일이 찾아다니면서 작업하기엔 시간이 많이 걸리므로, 오라클은 걸려있던 Lock정보들은 Commit 후 해당 블록을 처음 엑세스 하는 시점에 해제를 하는 Delayed block cleanout 이나 commit cleanout 같은 여러가지 기법을 동원해서 commit을 최대한 빨리 수행하고 데이터를 안전하게 지키려고 하는것이다.
3. Checkpoint
- Commit된 데이터를 어디까지 저장했는지 확인하기 위해서 만들어 놓은 개념.
ex) SCN이 100번까지 Commit되었고, CheckPoint 정보가 90번 이라면 SCN 90번 트랜잭션까지 데이터 파일에저장되었다고 확인하는것.
- Datafile의 복구를 결정하는 기초적인 정보로써 Control File과 Data File의 Check Point 정보를 비교하고 서로 정보가 다르면 틀린부분을 Online Redo나 Archived Redo Log를 참조해서 복구한다.
1) Database / Global Checkpoint
* 이 체크포인트가 발생하게되면 DB Buffer Cache내에 있는 모든 저장 안된 Dirty Buffer들의 내용을 전부 데이터파일로 저장하게 된다.
* 저장된 SCN 중 가장 큰 SCN번호를( CheckPoint SCN이라고 함) Control File과 Data File Header부분에 기록한다.
2)Thread Checkpoint / Logical Checkpoint
- 해당 Thread 내의 저장되지 않은 모든 Dirty Buffer들을 Datafile로 내려쓰게된다. 이 Checkpoint는 Log Switch가 발생하면 생긴다.
- RAC환경일 경우 각 노드별로 다르게 발생하며, Single Instance일 경우 Database Check Point와 같은역할.
3)Datafile Checkpoint
- 특정 데이터파일에만 발생하는 Check Point
- 해당 테이블스페이스를 오프라인 한다거나 비긴백업 수행 시 발생하게된다.
- 이 체크포인트 발생하면 해당 정보를 Control File과 데이터 파일 헤더 부분에 기록하게된다.
4)Mini Checkpoint
- Drop Table과 같이 특정한 DDL 발생 시 특정 블록에만 발생 하는 Checkpoint
5)Recovery Checkpoint
- 데이터 파일에 장애가 발생 했을 때 백업된 데이터파일 복원 후 Redo Change Vector를 적용시키게 된다. 그 후 Recovery된 블록을 데이터 파일에 저장해야하는데 이때 발생하는 CheckPoint를 Recovery Check Point라고 한다.
**
DB Buffer Cache의 변경된 Dirty bufer들을 Data File로 저장하는 것을 Check Point라고하며, 여러가지 경우가 있을 수 있다.
오라클에서는 여러가지 Checkpoint종류 중 우선순위를 두어서 Check Point를 관리하는데, 우선 순위가 높은 경우 Fast Checkpoint 분류하고 낮을경우 Low Checkpoint로 분류해서 두 가지가 동시에 발생할 경우 우선순위가 높은 Fast Check Point부터 진행하게된다.
예를들어 Database Shutdown, Tablespace Begin backup, alter system checkpoint등의 명령어로 발생하는 Checkpoint는 Fast checkpoint로 분류되어 DB Buffer Cache 내부에 있는 모든 저장안된 Dirty Buffer들을 즉시 데이터 파일로 저장하게된다. 이를 Full Checkpoint라고한다.
Full Checkpoint가 발생하면 Control File과 Data File Header에 해당 Checkpoint 정보를 기록하게된다.
** Checkpoint 우선순위가 낮을경우 Checkpoint를 할 Block의 목록을 즉시 데이터파일로 내려쓰지 않고, 어딘가에 기록 후 Background로 내려쓴다. 이를 Incremental Checkpoint라고도 한다.
** ITL Entries?
** Block Clean Out?
- Commit이 완벽하게 수행되려면 Data Block에 걸려있던 Lock까지 해제가 되어야 한다. 이 과정을 Block Clean Out 이라고한다.
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
7. Tablespace와 Datafile 관리하기 - Data file 이동 / 테이블스페이스 삭제 (0) | 2015.07.27 |
---|---|
7. Tablespace와 Data File 관리하기. (0) | 2015.07.16 |
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
설정
트랙백
댓글
글
1. 주요명령어 정리
1-1) 신규 Group 생성하기
SQL> alter database add logfile group 4 2 '/u01/app/oracle/oradata/PROD/redo04_a.log' size 5M;
|
1-2) Member 추가하기
SQL> alter database add logfile member 2 '/u01/app/oracle/oradata/PROD/redo04_b.log' to group 4;
SQL> !ls -ltr total 1301600 -rw-r----- 1 oracle dba 7847936 Jun 17 17:30 control01.ctl -rw-r----- 1 oracle dba 104858112 Jun 17 23:43 redo02a.log -rw-r----- 1 oracle dba 104865792 Jun 23 01:18 temp01.dbf -rw-r----- 1 oracle dba 104858112 Jun 23 01:18 redo03a.log -rw-r----- 1 oracle dba 52436992 Jun 23 01:28 users01.dbf -rw-r----- 1 oracle dba 104865792 Jun 23 01:28 example01.dbf -rw-r----- 1 oracle dba 5243392 Jun 23 16:51 redo04_a.log -rw-r----- 1 oracle dba 419438592 Jun 23 16:52 system01.dbf -rw-r----- 1 oracle dba 209723392 Jun 23 16:59 undotbs01.dbf -rw-r----- 1 oracle dba 209723392 Jun 23 16:59 sysaux01.dbf -rw-r----- 1 oracle dba 5243392 Jun 23 17:00 redo04_b.log -rw-r----- 1 oracle dba 104858112 Jun 23 17:00 redo01a.log |
1-3) Member 삭제하기
SQL> alter database drop logfile member 2 '/u01/app/oracle/oradata/PROD/redo04_b.log';
SQL> !ls -ltr total 1301600 -rw-r----- 1 oracle dba 7847936 Jun 17 17:30 control01.ctl -rw-r----- 1 oracle dba 104858112 Jun 17 23:43 redo02a.log -rw-r----- 1 oracle dba 104865792 Jun 23 01:18 temp01.dbf -rw-r----- 1 oracle dba 104858112 Jun 23 01:18 redo03a.log -rw-r----- 1 oracle dba 52436992 Jun 23 01:28 users01.dbf -rw-r----- 1 oracle dba 104865792 Jun 23 01:28 example01.dbf -rw-r----- 1 oracle dba 5243392 Jun 23 16:51 redo04_a.log -rw-r----- 1 oracle dba 419438592 Jun 23 16:52 system01.dbf -rw-r----- 1 oracle dba 209723392 Jun 23 16:59 undotbs01.dbf -rw-r----- 1 oracle dba 209723392 Jun 23 16:59 sysaux01.dbf -rw-r----- 1 oracle dba 5243392 Jun 23 17:00 redo04_b.log -rw-r----- 1 oracle dba 104858112 Jun 23 17:01 redo01a.log
* ASM 기반이 아닐경우 삭제과정을 수행해도 실제 파일은 지워지지않는다. Control file 안에 있는 해당 그룹과 멤버의 정보만 지워진다. ASM 경우 파일까지 지워진다. |
1-4) Group 삭제하기.
SQL> alter database drop logfile group 4;
Database altered.
|
1-5) Log Switch 발생시키기
터미널 1. SQL 접속 SQL> !date Tue Jun 23 17:04:58 KST 2015
SQL> alter system switch logfile;
System altered. 터미널 2. Alert log 확인 Tue Jun 23 17:05:12 2015 Thread 1 advanced to log sequence 11 (LGWR switch) Current log# 2 seq# 11 mem# 0: /u01/app/oracle/oradata/PROD/redo02a.log |
1-6) Check Point 발생시키기
SQL> alter system checkpoint;
System altered. |
1-7) Redo Log File 상태 확인
상태확인 스크립트
[oracle@edydr1p0-PROD script]$ pwd
/home/oracle/script [oracle@edydr1p0-PROD script]$ vi log.sql set line 200 col group# for 999 col mb for 999 col member for a45 col sql# for a8 col arc for a5
select a.group#, a.member, b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC" from v$logfile a, v$log b where a.group#=b.group# order by 1,2 /
|
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 CURRENT |
CURRENT : LGWR이 내용을 기록하고있는 상태
ACTIVE : Redo log file의 내용이 아직 DB Buffer Cache에서 Data file로 저장이 안되서 지워지면 안되는 상태
INACTIVE : Redo log file의 내용이 Data file로 저장되어 삭제되어도 된다는 의미.
** DBA가 리두로그 파일을 삭제할 경우 INACTIVE 상태로 변경 후 삭제해야하며, 삭제할 때 절대 OS 명령어로 먼저 삭제해서는 안된다. (ACTIVE 상태일때도 삭제는 가능하므로 주의!!)
2. 실습
- 초기상태
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 CURRENT |
2-1)신규 그룹 / 멤버 추가하기.
* 그룹추가 SQL> alter database add logfile group 4 2 '/u01/app/oracle/oradata/PROD/redo04_a.log' size 5M;
Database altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 CURRENT NO 4 /u01/app/oracle/oradata/PROD/redo04_a.log 5 0 UNUSED YES * 멤버추가 SQL> alter database add logfile member 2 '/u01/app/oracle/oradata/PROD/redo04_b.log' to group 4;
Database altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 CURRENT NO 4 /u01/app/oracle/oradata/PROD/redo04_a.log 5 0 UNUSED YES 4 /u01/app/oracle/oradata/PROD/redo04_b.log 5 0 UNUSED YES * Log Switch 후 상태확인 SQL> alter system switch logfile 2 ;
System altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 ACTIVE NO 4 /u01/app/oracle/oradata/PROD/redo04_a.log 5 16 CURRENT NO 4 /u01/app/oracle/oradata/PROD/redo04_b.log 5 16 CURRENT NO * Check point 명령으로 ACTIVE -> INACTIVE SQL> alter system checkpoint ;
System altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 13 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 INACTIVE NO 4 /u01/app/oracle/oradata/PROD/redo04_a.log 5 16 CURRENT NO 4 /u01/app/oracle/oradata/PROD/redo04_b.log 5 16 CURRENT NO * Logfile 삭제하기 - current 상태에서도 삭제는 된다. 하지만 Redo log file의 내용이 아직 DB Buffer Cache에서 Data file로 저장되지 않았으므로 하면안됨. SQL> alter database drop logfile member 2 '/u01/app/oracle/oradata/PROD/redo04_b.log';
Database altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 17 CURRENT NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 14 INACTIVE NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 INACTIVE NO
4 /u01/app/oracle/oradata/PROD/redo04_a.log 5 16 INACTIVE NO SQL> alter database drop logfile member 2 '/u01/app/oracle/oradata/PROD/redo_04_a.log'; alter database drop logfile member * ERROR at line 1:
ORA-00360: not a logfile member: /u01/app/oracle/oradata/PROD/redo_04_a.log => Log file group의 멤버는 최소 1개이기 때문에, member가 지워지지 않는다. 그룹을 지움으로써 삭제해야함. SQL> alter database drop logfile group 4;
Database altered.
SQL> @log
GROUP# MEMBER MB SEQ# STATUS ARC ------ --------------------------------------------- ---- ---------- ---------------- ----- 1 /u01/app/oracle/oradata/PROD/redo01a.log 100 17 INACTIVE NO 2 /u01/app/oracle/oradata/PROD/redo02a.log 100 18 CURRENT NO 3 /u01/app/oracle/oradata/PROD/redo03a.log 100 15 INACTIVE NO
* 데이터베이스에서는 지웠지만, OS 파일에서는 여전히 있는상태. OS 명령어로 삭제해야함. [oracle@edydr1p0-PROD PROD]$ pwd /u01/app/oracle/oradata/PROD [oracle@edydr1p0-PROD PROD]$ ls -ltr redo* -rw-r----- 1 oracle dba 104858112 Jun 23 17:54 redo03a.log -rw-r----- 1 oracle dba 5243392 Jun 23 18:14 redo04_b.log -rw-r----- 1 oracle dba 5243392 Jun 23 18:14 redo04_a.log -rw-r----- 1 oracle dba 104858112 Jun 23 18:21 redo01a.log -rw-r----- 1 oracle dba 104858112 Jun 23 18:28 redo02a.log
[oracle@edydr1p0-PROD PROD]$ rm -f redo04_b.log [oracle@edydr1p0-PROD PROD]$ rm -f redo04_a.log [oracle@edydr1p0-PROD PROD]$ ls -ltr redo* -rw-r----- 1 oracle dba 104858112 Jun 23 17:54 redo03a.log -rw-r----- 1 oracle dba 104858112 Jun 23 18:21 redo01a.log -rw-r----- 1 oracle dba 104858112 Jun 23 18:28 redo02a.log |
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
7. Tablespace와 Data File 관리하기. (0) | 2015.07.16 |
---|---|
6. Redo Log 관리하기 - SCN과 Checkpoint (0) | 2015.07.16 |
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
5. Control File 관리하기 (0) | 2015.06.17 |
설정
트랙백
댓글
글
6-2. Redo Log File 구성 및 관리하기.
[출처] 6-2. Redo Log File 구성 및 관리하기.|작성자 HOHnim
Redo Log File 구성 및 관리하기
1) Redo Log Buffer와 Redo Log File
- Redo Log File은 그룹과 멤버라는 개념으로 관리됨.
- Oracle 7 버전 이후부터 같은 내용을 여러곳에 중복으로 저장하는 그룹이란 개념이 등장
- 위 그림은 Redo Log Group 3개가 있고, Member 로 2개씩 존재하는 구성
- 같은 그룹의 Member 들은 같은 내용을 담고있다.
- Member를 많이 추가하면 안정적일 수는 있지만, 기록시간이 커서 부하를 줄 수 있으므로 구성을 잘 해야한다.
- 같은 그룹의 멤버는 서로 다른 디스크에 저장되는것을 권장한다.
* 오라클에서 최소 그룹의 개수는 2개이며, 그룹별로 필요한 최소 Member 갯수는 1개다.
* * 장애를 대비하여 그룹은 최소 3개와 각 그룹별 최소 2개이상의 Member 구성을 권장함.
- LGWR이 Redo Log Buffer의 내용을 Redo Log File에 내려쓰다가 해당 파일이 가득 차게되면 Log Switch가 발생하여 자동으로 다음 그룹으로 넘어가게된다.
* Log Switch가 발생하게 되면 Checkpoint 신호가 발생하게된다.
=> Check point 신호 발생 시 DBWR은 해당 로그파일에 있는 내용 중 DB Buffer Cache에서 데이터파일로 저장되지 못한 변경사항을 내려쓰게 되며, 이 정보들을 Data file과 Control file에 반영된다.
- 다음 그룹역시 가득 찰 경우 다음 Redo Log 그룹으로 넘어간다.
* Log Switch가 일어나는 그룹의 순서는 Oracle이 라운드 로빈 방식으로 결정하게된다.
(1번 그룹 다음 2번그룹이 아니라 3번일 수 있다는 뜻.)
- 같은 그룹 안의 Member들 끼리는 서로 저장하고 있는 내용과 크기가 동일하다.
- LGWR은 Redo Log File의 그룹의 멤버가 여러 개일 경우 병렬로 동시에 같은 내용을 기록한다.
(같은 디스크에 있을 경우 하나 기록후 끝나고 하나 기록하는 식의 직렬로 기록)
* 병렬쓰기 도중 Redo Log File이 삭제되었다든지 Block에 문제가 생겼다든지 문제가 생길 경우 LGWR은 각 오픈 로그 멤버의 상태를 조사해서 어떤 파일이 에러가 발생되는지 알아낸다.
장애가 난 멤버는 Control File의 STALE이라는 상태로 기록하고, LGW은 Trace file에 ORA-00346에러를 기록한다.
- LGWR이 하나의 로그파일에서 4개이상의 에러를 만나게 되면 로그파일을 닫고 더이상 그 파일에 내용을 기록하지 않는다. 만약 LGWR이 어떤 로그 파일에도 내용을 기록할 수 없다면 ORA-00340 에러를 발새시키고Shutdown abort로 강제종료되고 Startup되지 않는다.
** Redo Log file 크기는 각 서버에 맞게 사용해야하며, Redo Log File크기가 너무 작을 경우 LOG SWITCH가 자주 발생하게되어 성능저하가 될 수 있고, 너무 크면 데이터의 손상 가능성이 커지므로 설정을 잘해야한다.
보통 1시간에 Log Switch가 2~3회 발생하게 설정하는 것을 추천하지만, 서버실정에 맞게 설정해야한다.
** Alert Log File에 checkpoint not completed 메세지가 나오면 Redo Log File 크기나 그룹의 개수가 작다는 의미로 멤버 크기를 크게 만들거나, 그룹을 더 만들어주어야한다.
** checkpoint not completed 메세지는 Log Switch가 너무 빈번하게 일어날 경우 DBWR이 이전에 발생한 Check point 내용을 Data file에 다 기록을 못한 상태에서 다시 Log Switch가 발생하여 checkpoint 신호가 들어올 경우 발생한다.
[출처] 6-2. Redo Log File 구성 및 관리하기.|작성자 HOHnim
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
6. Redo Log 관리하기 - SCN과 Checkpoint (0) | 2015.07.16 |
---|---|
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
5. Control File 관리하기 (0) | 2015.06.17 |
4.Oracle 시작하기와 종료하기. (0) | 2015.06.15 |
설정
트랙백
댓글
글
Redo Log 관리하기.
- 오라클에서는 데이터가 변경될 경우 장애를 대비해 변경되기 전의 내용과 변경된 후의 내용을 기록해둔다.
- 기록되는 장소 중 메모리는 Redo Log Buffer
- 기록되는 장소 중 파일은 Redo Log File
- Write Log Ahead:
데이터를 변경하기전에 Redo Log에 먼저 기록 후 데이터를 변경한다.( LGWR 작동 후 DBWR 작동.)
- Log Forace at commit:
* 사용자로부터 Commit요청이 들어오면 관련된 모든 Redo Recode들을 redo Log file에 저장한 후 Commit을 완료한다.
* 대량의 데이터 변경 후 Commit이 한꺼번에 수행되면 악영향을 미칠 수 있기 때문에, Delayed commit 이나
Commit을 아주 짧은 시간 동안 모아서 한꺼번에 수행하는 Group commit이란 기술이 등장함.
* LGWR이 Redo Log를 다 기록한 후 DBWR이 데이터를 기록하는 동기식 커밋에서 성능문제 때문에 비동기식 커밋 기술도 등장함(11gR2)
Redo Log 생성원리.
- 데이터에 변경이 생기는 SQL(DML, DDL, DCL 등)을 실행했을 때 Redo Log에 기록된다.
1)사용자가 특정 데이터 변경을 요청하는 쿼리를 수행하면, 해당 SQL을 받은 서버프로세스는 원하는 Block이 DB Buffer cache에 있는지 확인한다. (없는 경우 파일에서 BLOCK을 복사해서 DB Buffer Cache로 가져온다.)
해당 Block을 다른사람이바꿀 수 없도록 Lock을 설정한 후 PGA에 Redo Change Vector 생성.
* Redo Change Vector: 변경된 데이터를 나중에 복구할 목적으로 redo log에 기록할 변경된 데이터에 대한 모든 정보의 세트를 의미.
* Redo Log는 트랜잭션의 변경을 복구할 용도로 기록됨.
(COMMIT된 데이터를 복구할 때도 사용되지만, Rollback데이터를 복구할 경우에도 사용됨)
* DB가 강제 종료되었을 경우 rollback되지 못한 데이터 모두 rollback 해야하므로, Change Vector내에 Undo관련 내용까지 함께 저장됨.
* PGA상에 만들어지는 Redo Change Vector는 Redo Record Format으로 Row단위로 Redo Log Buffer에 복사된다.
2)서버프로세스는 PGA에서 Change Vector를 생성한 후 Redo Log Buffer에서 필요한 용량을 계산한다. PGA에 생성된 Change Vector를 redo log buffer에 복사하기 위해 필요한 Latch를 획득해야한다.
* 첫 번째로 Redo Log Buffer에 내용을 쓰기위해서는 Redo Copy Latch를 획득해야함. 여러개의 서버프로세스가 동시에 데이터를 변경하려 한다면, Redo copy Latch를 획득하는 과정에서 경합이 발생할 수 있다.
* Redo copy latch는 Change Vector가 모두 Redo Log buffer에 기록될 때까지 계속 가지고 있어야한다.
* Redo Copy Latch를 획득하기 위해 대기하는경우 Latch: Redo Copy 대기이벤트가 발생한다.
redo copy latch 갯수 확인. (기본적으로 CPU * 2의 redo copy latch가 조회됨)
SQL> select name, gets, misses, immediate_gets, wait_time from v$latch_children where name='redo copy'; 2 3 NAME GETS MISSES IMMEDIATE_GETS WAIT_TIME ------------- ---------- ---------- -------------- ---------- redo copy 6 0 0 0 redo copy 6 0 27648 0 => 2개. |
3) Redo Copy Latch를 확보한 서버 프로세스는 Redo Log buffer에 내용을 기록하기위해 Redo Allocation Latch를 확보해야한다.
* 8i버전까지는 Redo Allocation Latch는 1개 밖에 없어서 데이터 변경이 많이 되는 서버일 경우 Redo Allocation Latch를 확보하기위해 경합이 발생할 수 있었다.
* 9i 버전부터 Redo Log Buffer를 여러개의 공간으로 나누어서 각 공간별로 Redo Allocation latch를 할당해주는 Shared Redo strand라는 기능이 도입됨. 10g 버전부터 LOG_PARALLELISM파라미터가 _LOG_PARALLELISM으로 변경되고 이 파라미터의 값을 Oracle이 동적으로 관리하도록_LOG_PARALLELISM_DYNAMIC 파라미터가 추가됨.
(True로 설정할 경우 Oracle이 Strand 개수를 자동으로 제어하도록 설정할 수 있다.)
* 10g 버전부터 자동으로 여러 개의 Redo Allocation Latch의 값이 생성되어 있음을 확인할 수 있다.
SELECT count(*) from v$latch_children where name='redo allocation'; COUNT(*) ----------
19 |
* 10g 버전부터 Private Redo Strand기능이 도입됨. 각 서버프로세스는 Shared Pool에 자신만의 독립적인 private strand 공간을 마들어서 그곳에 Change Vector를 생성한 후 필요할 경우 LGWR이 Redo log file에 바로 기록하게된다.
* private redo strand 기능은 latch를 확보해서 redo log buffer에 기록해야하는 과정을 줄이으로써 성능을 더 향상시킬 수 있다.(Zero copy redo 라고함) => 히든파라미터인 _LOG_PRIVATE_PARALLELISM=TRUE로 설정하면 활성화 할 수 있다.
4) Redo Log Buffer에 기록된 내용들(Redo Log Buffer에 기록된 Change Vector를 Redo Entry라고도함)은 특정 상황이되면 LGWR이 일부를 Redo Log File에 기록한 후 기록된 Redo Entries들은 Redo Log Buffer에서 삭제함.
* Server Process는 Redo Writing Latch를 확보한 후 Redo Log Buffer에 있는 내용을 Redo Log File 에 기록하라고 요청함.
- Redo Log Buffer의 내용을 Redo Log File에 기록되는 경우
1) 3초마다.
LGWR프로세스는 할일이 없을경우 sleep 상태로 있다가 rdbms ipc message라는 대기 이벤트의 time out이 되는 시점인 3초마다 한번씩 wake up 하여 Redo log buffer에서 redo log file로 기록할 내용이 있을 경우 내려쓰고, 해당 내용을 redo log buffer에서 삭제한다.
2) Redo Log Buffer 크기가 1/3 찼거나 1M 가 넘을 경우
서버프로세스는 redo Log Buffer를 할당 받을 때마다 현재 사용된 Log Buffer의 Block수를 계산한다.
현재 사용된 Log buffer의 Block 수가 _LOG_IO_SIZE의 값보다 많을 경우 LGWR에게 Redo Log Buffer의 내용을 Redo Log file에 기록하도록 요청한다.
3) 사용자가 COMMIT 또는 ROLLBACK을 수행할 때.
사용자가 COMMIT 또는 ROLLBACK을 수행할 경우 내부적인 관리번호인 SCN이 생성되어 해당 트랜잭션에 할당되고 관리된다.
4) DBWR이 LGWR에게 쓰기를 요청할 때.
ORACLE 8i 부터 DBWR이 LGWR의 on-disk RBA값보다 큰 high-RBA 값을 가진 Block을 데이터파일로 기록해야할 때 해당 Block을 Differed Write Queue에 먼저 기록 후 LGWR프로세스를 먼저 수행시켜 Redo Log를 먼저 내려쓰게 만든 후 Data block을 기록하는 방식으로 sync를 맞추게된다.
=> 위의 조건일 때 LGWR은 Redo Log Buffer의 내용을 Redo Log file에 기록하고, 기록된 내용을 Redo Log Buffer상에서 Flush 한다.
* LGWR이 Redo Log Buffer의 내용을 Redo log file에 기록할 때 Block 단위로 쓴다. ( OS Block Size로 OS 종류에따라 다를 수 있다.)
Redo Log Block Size 조회. SQL> select max(lebsz) from sys.x$kccle;
MAX(LEBSZ) ---------- 512 |
** 모든 데이터의 변경사항이 전부 Redo Log에 기록되는것은 아님.
** Direct Load, Table 혹은 Index 생성 시 NOLOGGING 옵션을 주는 경우 기록되지않는다.
단, NOLOGGING 옵션으로 테이블을 생성하더라도 Insert, Update, Delete 같은 작업은 기록된다.
[출처] 6-1. Redo Log 관리하기.(Redo Log 생성원리)|작성자 HOHnim
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
6-3. Redo Log 관리하기 - 실습 (0) | 2015.07.16 |
---|---|
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
5. Control File 관리하기 (0) | 2015.06.17 |
4.Oracle 시작하기와 종료하기. (0) | 2015.06.15 |
3. Oracle Background Processes (0) | 2015.06.14 |
설정
트랙백
댓글
글
Control file 관리하기.
- Control File은 Binary File라서 Control file 내용을 DBA가 직접 수정할 수 없음.
- 내용 변경 시 Server Process에게 변경을 요구하는 SQL문장이나 DDL 문장을 수행해야한다.
- Instance가 Mount이상의 상태일 때 Control File의 내용이 실시간으로 변경되고 조회된다.
- 삭제 시 복구를 위해 여러곳에 복사본을 만들어 다중화 하는것을 권장함.
1. Spfile일 경우 다중화 하는 방법.
1)Control file 경로 확인 및 인스턴스 상태 확인.
SQL> show parameter control
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/PROD/control01.ctl
control_management_pack_access string DIAGNOSTIC+TUNING SQL> select status from v$instance;
STATUS ------------ OPEN SQL> show parameter spfile
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ spfile string /u01/app/oracle/product/11.2.0 /dbhome_1/dbs/spfilePROD.ora |
2) 현재 Control file 조회.
SQL> select name from v$controlfile;
NAME ----------------------------------------------------------------- /u01/app/oracle/oradata/PROD/control01.ctl |
3) Spfile의 내용을 변경 후 Instance 종료.
SQL> alter system set control_files='/home/oracle/disk1/control01.ctl', 2 '/home/oracle/disk2/control02.ctl', 3 '/home/oracle/disk3/control03.ctl' scope=spfile; |
4) 대상 디렉토리 생성 및 파일 복사.
[oracle@edydr1p0-PROD ~]$ mkdir disk1 disk2 disk3 [oracle@edydr1p0-PROD ~]$ cp /u01/app/oracle/oradata/PROD/control01.ctl /home/oracle/disk1/control01.ctl [oracle@edydr1p0-PROD ~]$ cp /u01/app/oracle/oradata/PROD/control01.ctl /home/oracle/disk2/control02.ctl [oracle@edydr1p0-PROD ~]$ cp /u01/app/oracle/oradata/PROD/control01.ctl /home/oracle/disk3/control03.ctl |
5)Instance statup 후 Controlfile 다중화 확인.
SQL> startup ORACLE instance started.
Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 322963408 bytes Database Buffers 88080384 bytes Redo Buffers 4288512 bytes Database mounted. Database opened. SQL> show parameter control
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /home/oracle/disk1/control01.c tl, /home/oracle/disk2/control 02.ctl, /home/oracle/disk3/con trol03.ctl control_management_pack_access string DIAGNOSTIC+TUNING SQL>select name from v$controlfile;
NAME -------------------------------------------------------------------------------- /home/oracle/disk1/control01.ctl /home/oracle/disk2/control02.ctl /home/oracle/disk3/control03.ctl |
2. Pfile 다중화 방법.
환경구성.
- 현재 spfile 사용중이므로, pfile 생성.
- pfile 사용하기 위해서는 기존의 spfile을 지워야한다.
SQL> create pfile from spfile; [oracle@edydr1p0-PROD dbs]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_1/dbs
[oracle@edydr1p0-PROD dbs]$ rm -f spfilePROD.ora SQL> show parameter pfile
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------
spfile string * VALUE에 아무내용이 없으면 pfile 사용한다는 뜻. |
1)현재 사용중인 Control File 조회 및 인스턴스종료.
SQL> select name from v$controlfile;
NAME -------------------------------------------------------------------------------- /home/oracle/disk1/control01.ctl /home/oracle/disk2/control02.ctl /home/oracle/disk3/control03.ctl SQL> shutdown immediate; |
2 )pfile 에서 Control file 경로 수정.
[oracle@edydr1p0-PROD dbs]$ vi initPROD.ora
PROD.__db_cache_size=83886080 PROD.__java_pool_size=4194304 PROD.__large_pool_size=4194304 PROD.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment PROD.__pga_aggregate_target=167772160 PROD.__sga_target=251658240 PROD.__shared_io_pool_size=0 PROD.__shared_pool_size=142606336 PROD.__streams_pool_size=8388608 *.control_files='/home/oracle/disk1/control01.ctl','/home/oracle/disk2/control02.ctl','/home/oracle/disk3/control03.ctl' *.db_block_size=8192 *.db_name='PROD' *.memory_target=400M *.remote_login_passwordfile='EXCLUSIVE' *.undo_tablespace='UNDOTBS1' |
기존에 사용하는 Control file 01,02,03 -> 04,05,06 으로 변경
*.control_files='/home/oracle/disk4/control04.ctl','/home/oracle/disk5/control05.ctl','/home/oracle/disk6/control06.ctl'
3)해당 디렉토리 생성 후 Controlfile 복사
[oracle@edydr1p0-PROD ~]$ mkdir disk4 disk5 disk6 [oracle@edydr1p0-PROD ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk4/control04.ctl [oracle@edydr1p0-PROD ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk5/control05.ctl [oracle@edydr1p0-PROD ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk6/control06.ctl |
4) 정상 오픈 후 확인
SQL> startup ORACLE instance started.
Total System Global Area 417546240 bytes Fixed Size 2213936 bytes Variable Size 327157712 bytes Database Buffers 83886080 bytes Redo Buffers 4288512 bytes Database mounted. Database opened. SQL> select name from v$controlfile;
NAME -------------------------------------------------------------------------------- /home/oracle/disk4/control04.ctl /home/oracle/disk5/control05.ctl /home/oracle/disk6/control06.ctl |
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
6-2. Redo Log File 구성 및 관리하기. (0) | 2015.06.18 |
---|---|
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
4.Oracle 시작하기와 종료하기. (0) | 2015.06.15 |
3. Oracle Background Processes (0) | 2015.06.14 |
2. SQL 문장 실행 원리 (0) | 2015.06.14 |
설정
트랙백
댓글
글
Oracle 시작하기와 종료하기.
- 오라클 서버를 시작하기 위해서는, SYSDBA 권한을 가지고있는 계정으로 로그인 해야한다.
oracle@edydr1p0-orcl ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jun 15 00:30:51 2015
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup ORACLE instance started.
Total System Global Area 313159680 bytes Fixed Size 2212936 bytes Variable Size 192940984 bytes Database Buffers 113246208 bytes Redo Buffers 4759552 bytes Database mounted.
Database opened. |
- 오라클 서버 시작단계
1) STARTUP 명령어를 수행하면, 서버프로세스는 Parameter File을 찾아 읽는다.
*Parameter File에는 정적파라미터 파일인 Pfile과 동적 Parameter 파일인 Spfile이 있다.
정적파라미터 파일은 관리자가 수동으로 변경해야하만 하며, 동적 파라미터 파일은 서버프로세스가 자동으로 변경.
2)NOMOUNT 단계에서는 Parameter파일을 읽고, 그 안에 저장되어 있는 파라미터값을 참고하여 인스턴스를 생성한다.
* 인스턴스는 SGA와 Background Process들로 구성되어 있으므로 MOUNT단계에서 RAM에 인서턴스가 생성되어 작업할 수 있는 메모리 공간이 확보된다.
* Alert Log 파일을 열어서 로깅을 시작
* Alert Log는 인스턴스가 시작되어 운영되고 종료될 때까지 중요한 내용을 모두 저장하는 파일.
* Alert Log 경로
10g : $ORACLE_BASE/admin/SID/bdump/alert_SID.log
11g : $ORACLE_BASE/diag/rdbms/SID/SID/trace/alert_SID.log
ex) 환경 OEL5, ORACLE 11g [oracle@edydr1p0-orcl trace]$ pwd /u01/app/oracle/diag/rdbms/orcl/orcl/trace [oracle@edydr1p0-orcl trace]$ ls -ltr total 1536 -rw-r----- 1 oracle dba 77 Jun 8 10:50 orcl_vktm_17584.trm -rw-r----- 1 oracle dba 1091 Jun 8 10:50 orcl_vktm_17584.trc |
3)NOMOUNT 단계를 마치면, Control file을 읽고 MOUNT 단계 진행.
- Control File의 위치정보는 Parameter File에 기록되어있음.
- MOUNT단계에서는 Database의 이상유무 확인.
ex) DBCA 생성 DB, ASM disk 사용 SQL> show parameter control
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string +DATA/orcl/controlfile/current .260.881837513, +FRA/orcl/cont rolfile/current.256.881837515 control_management_pack_access string DIAGNOSTIC+TUNING ex) 수동생성 DB, PROD SQL> show parameter control
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/PROD/c ontrol01.ctl control_management_pack_access string DIAGNOSTIC+TUNING SQL> show parameter control
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/PROD/c ontrol01.ctl control_management_pack_access string DIAGNOSTIC+TUNING |
4)MOUNT 단계에서 이상유무 확인 후 OPEN 단계로 진행.
- INSTANCE Clush로 판단되면, Open 단계로 가기전에 SMON에 의해 Instance Recovery 수행.
- 복구내용을 Redo Log File에서 찾는다. 복구내용이 Redo Log File에 없거나, Archive Log File에 있는 경우 SMON을 통해 Instance Recovery를 수행할 수 없으며 DBA에 의해 Media Recovery 수행해야함.
1. Parameter File (초기화 파라미터 파일)
1) 파라미터 파일: Oracle Server가 Startup 하게되면 SGA를 생성하고 Background Process를 시작해야하는데 SGA를 생성할 때 각 SGA구성요소 관련사항을 기록해 두는 파일.
| Pfile | Spfile |
파일 경로 | $ORACLE_BASE/dbs | |
파일 이름 | initSID.ora | SpfileSID.ora |
내용 변경 | 관리자 | 서버 프로세스 |
파일형태 | Text(편집기 변경가능) | Binary (편집기로 변경불가) |
- 9i 버전부터 Spfile이 등장하게되었다.
- Spfile 경우 DB사용자가 SQL문을 수행하여 변경하여야 한다.
2) 파라미터 파일의 내용변경
- pfile :
* OS 편집기를 이용하여 파라미터 파일의 내용을 직접 수정한 후 저장하면 됨.
* 변경된 사항은 다음 시작부터 적용된다. 9i 이후부터 Dynamic SGA기능이 도입되어 pfile을 사용하더라도
* alter system set 명령어를 이용해 재부팅 없이 즉시 적용할 수 있다.
(변경해도 Pfile은 변경되지 않으므로, Pfile을 수동으로 변경하지 않으면 재기동 후 원래값으로 돌아간다. )
- spfile
* 관리자가 직접 내용을 수정할 수 없다.
* 내용 변경시 Alter system set 명령을 사용하여 서버프로세스에게 변경을 요청해야함.
SQL> ALTER SYSTEM SET DB_CACHE_SIZE=30m Scope=Memory;
* Scope 옵션
MEMORY : Spfile 내용은 변경하지 말고 현재 작동 중인 인스턴스에만 적용.
SPFILE : 현재 운영중인 인스턴스에 적용하지말고, SPFILE 내용만 변경.
BOTH: 두 가지 모두에 적용. (Scope 옵션을 사용하지 않을 경우 기본모드)
2. Oracle Inatance 종료하기.
- sysdba 권한을 가진 계정으로 shutdown 명령을 통해 Instance 종료.
SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. |
1) NORMAL
- SQL> shutdown normal 또는 shutdown 명령어로 종료.
- 명령전에 접속되어 있던 사용자가 있을 경우, 사용자들이 모두 스스로 접속을 종료할 때까지 기다렸다가 종료.
- 사용자가 접속을 종료하지 않으면, Instance는 종료되지 않는다.
2) TRANSACTIONAL
- SQL> shutdown transactional 명령어로 종료.
- 사용자가 스스로 접속을 종료할 때 까지 기다리지않고 강제로 접속을 중단시킨 후 Instance를 종료.
- 접속을 강제로 중단 시키는 시점은 사용자가 수행중인 Transaction이 끝나는 시점.
- DML 작업을 수행 중일 경우에는 해당 트랜잭션을 종료하는 명령어 (DDL, DCL, TCL) 수행 시 접속을 강제로 종료시킨 후 데이터를 저장하고 인스턴스를 종료.
- 사용자가 트랜잭션을 종료하지 않게되면 Instance를 종료. (사용자가 COMMIT, ROLLBACK 명령어를 수행해야함.)
3) IMMEDIATE
- SQL> shutdown immediate 명령어로 종료.
- 사용자의 행동에 상관없이 즉시 접속을 강제로 종료.
- 접속이 종료되는 시점까지 해당 사용자가 수행한 작업 중에 Commit이 완료된 데이터를 DB Buffer cache에서 찾아서 데이터파일로 저장해주고, 완료되지 않은 작업은 Rollback 시킨 후 Instance 종료.
4)ABORT
- SQL> shutdown abort 명령어로 종료.
- 사용자의 행동에 상관없이 즉시 접속을 강제로 종료.
- immediate와 차이점은, 사용자가 수행한 작업을 저장하지도 Rollback하지도 않고 즉시 Instance 종료.
- 다시 Startup될 때 SMON이 Instance Recovery를 수행해서 복구함.
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
---|---|
5. Control File 관리하기 (0) | 2015.06.17 |
3. Oracle Background Processes (0) | 2015.06.14 |
2. SQL 문장 실행 원리 (0) | 2015.06.14 |
1. Oracle Server 전체구조. (0) | 2015.06.10 |
설정
트랙백
댓글
글
Oracle Background Process.
- Oracle Process 종류
1) User Process: 사용자가 작성한 SQL 문장을 Server 프로세스로 전달하고 결과를 가져오는 프로세스.
2) Server Process: User Process가 전해 준 SQL문장을 실제 실행하는 프로세스.
3) Background Process: Oracle Server가 시작되면 자동으로 시작되어 운영과 유지를 담당하는 프로세스.
1. 필수 Background Process.
1) DBWR(Database Writer) : Database Buffer Cache에서 변경완료 후 저장되어야 하는 블록(Dirty Block)을 데이터파일로 저장하는 역할.
* DBWR이 DB Buffer Cache의 Dirty Buffer 내용을 파일에 내려쓰는 경우.
- Check Point 신호가 발생했을 때.
- Dirty Buffer가 임계값을 지났을 때
- Time out이 발생했을 때
- RAC Ping이 발생했을 때.
- Tablespace가 Read only 상태로 변경될 때.
- Tablespace가 offline될 때.
- Tablespace가 begin backup 상태가 될 때.
- Drop table이나 Truncate table될 때.
- Diret Path Read/Write가 진행될 때.
- 일부 Parallel Query 작업이 진행될 때.
* DBWR 백그라운드 프로세스는 기본적으로 하나 작동하지만, I/O가 많을 경우 여러개를 동시에 사용할 수 있다.
SQL> Show parameter process ; 명령어를 통해 확인가능.
2)LGWR(Log Writer) :
- Server Process가 변경내역을 Redo Log Buffer에 기록하게된다.
- LGWR은 Redo Log Buffer에 있는 내용을 디스크의 Redo Log File로 저장한다.
- 만약 Commit 요청이 들어왔는데 Redo Log File이 없는 경우, Alert Log 파일에 해당 내용을 기록해 두고 LGWR은 다음 Commit요청을 수행하지 않고 대기.
* LGWR이 Redo Log Buffer의 내용을 파일에 내려쓰는 경우
- Commit 발생했을 때.
- 1/3이 찼을 때
- 변경량이 1M이 되었을 때
- 3초마다
- DBWR이 내려쓰기 전에
** 오라클은 데이터가 변경되는 경우 항상 Redo Log Buffer에 변경내용을 먼저 기록한 후DB Buffer Cache내용을 변경한다.(Log Ahead Method, Write-Ahead라고 하기도함.)
** Commit을 수행하면 데이터를 저장하는 것이 아니라, Redo Log를 저장하는 것이다.
** Commit 수행 시 Redo Log Buffer내용을 먼저 쓰는 이유
- 변경된 내용이 적을 경우라도 해당 블록을 전부 저장해야하므로 많은 시간이 소모되는데, Redo Log Buffer의 Block크기는 DB Buffer Cache의 블록 크기보다 작기 때문.
- DB Buffer Cache의 블록을 저장할 때 데이터파일에서 해당 블록의 위치를 찾아서 덮어써야하기 때문에 오래걸림, Redo Log Buffer에 내용을 쓸때는 그냥 순서대로 씀.
3)PMON(Process Monitor)
- PMON은 모든 프로세스를 감시하고, 비정상적으로 종료된 프로세스가 있다면, 관련 복구작업을 하는 역할.
- 인스턴스가 시작될 때 해당 인스턴스 정보를 Listener에 등록하고 관리하는 역할을 함.
4)SMON(System Monitor)
- 인스턴스가 비정상 종료 되었을 경우, Instance 인스턴스를 시작할 때 Clean Up하는 역할 (Instance Recovery라고 함.)
- Instance Recovey 과정에서 누락된 Transaction을 Recovery하는 역할.
- 비정상 종료된 Transaction Temporary Segment를 Cleanup하는 역할.
(Create 등 작업을 하던 도중 해당 Transaction이 비정상 종료되면, Temporaray segment를 Cleanup해준다)
- Dictionary Managed Tablespace에서 Free Extents를 모아주는 역할도 함.
ex) 인스턴스 비정상 종료 시 Instance Recovery 과정.
상황: Scott 사용자가 test Table에 작업을 하다 비정상 종료됬을 경우
1. A 입력
2. B 입력
3. Commit
4. C 입력
5. Database가 비정상종료됨.
=>
1. Prameter File을 읽어서 Nomount단계에서 Instance 생성.
2. Mount단계에서 Control file의 내용을 확인해서 Instance Crash상황임을 확인.
3. Redo Log File에서 위 1,2,3,4 단계의 작업을 다시 수행 (Roll Forward)
* COMMIT이 되지않은 4번입력까지 수행.
4. Database Open
5. Commit이 되지않은 4번 작업 취소(Roll backward)
6. Instance Recovery 완료.
* Instance Recovery 할 때 Online Redo Log File만 읽고 진행하며, 만약 복구내용이 Archived Redo Log File에 있다면 DBA가 수동으로 Media Recovery를 수행해야한다.
5)CKPT (Checkpoint Process)
- CKPT Process는 DBWR에게 Checkpoint 신호를 전달해 주며, Control file과 Datafile Header에 해당 Check Point 정보를 기록하는 역할 수행.
- Checkpoint 정보에는 Checkpoint 위치와 SCN, 해당 내용을 담고 있는 Redo log 내용의 위치값을 담고있다.
6)MMON, MMNL (10g이후 추가됨.)
- MMON Process는 AWR과 관련된 다양한 작업을 수행
- MMNL Process는 Active Session History정보를 디스크의 파일로 기록하는 역할 수행.
7) RECO
- 분산 데이터베이스 환경에서 Transaction처리 도중에, 장애가 발생할 경우 해당 Transaction을 자동으로 복구해주는 역할 수행
* 분산 데이터베이스가 아닐 경우 큰 의미는 없다.
2. 선택적인 Background Process
1) ARCn(Archiver Processes)
- Archive Log Mode로 데이터베이스를 운영할 경우 Online Redo Log File을 Archiving해 주는 역할 수행.
2)CJQ0 & JNNN
- 오라클에서 제공하는 Job 기능을 수행하는 프로세스.
3)FBDA(FlashBack Data Archiver Process)
- Flashback 기능 중에 Undo Data를 사용하는 기능이 있는데, 이 기능들은 Undo Data를 다른 프로세스가 덮어 써버릴 경우 Flashback을 할 수 없게되는 단점이 있다.
11g부터 FBDA를 사용할 경우 Undo data를 다른 사용자가 덮어쓰기 전에 Archive해서 보관해주는 기능이 도입되었고, Undo Data를 다른곳으로 복사해주는 역할을 수행하는
프로세스가 FBDA이다.
'Oracle 참고서적 정리 > 오라클 관리실무' 카테고리의 다른 글
6-1 Redo Log 관리하기(Redo Log 생성원리) (0) | 2015.06.18 |
---|---|
5. Control File 관리하기 (0) | 2015.06.17 |
4.Oracle 시작하기와 종료하기. (0) | 2015.06.15 |
2. SQL 문장 실행 원리 (0) | 2015.06.14 |
1. Oracle Server 전체구조. (0) | 2015.06.10 |
RECENT COMMENT