2009년 9월 28일 월요일

ORACLE_021. Making User Managed Backups_Part II

Making User Managed Backups_Part II


Making User-Managed Backups of the Controlfile
 Archivelog Mode에서 데이터베이스의 구조적 변경이 있었다면 콘트롤 파일을 백업합니다. 콘트롤 파일을 백업하기 위해서는 ALTER DATABASE 시스템 권한이 필요합니다.

 콘트롤 파일을 백업하기 위해서 두가지 방법중 하나를 사용할 수 있습니다.
  - 이진 파일(Binary file)로 콘트롤 파일 백업하기
  - 추적 파일(Trace file)로 콘트롤 파일 백업하기

 


Backing Up the Control File to a Binary File
 콘트롤 파일을 백업하는 가장 일반적인 방법은 SQL 구문을 이용하여 이진 파일로 만들어 백업하는 방법입니다. 이진파일은 추적파일보다 일반적으로 더 선호하게 되는데 이는 아카이브로그 이력, 읽기 전용과 오프라인 테이블 스페이스에 대한 오프라인 기간, 백업셋과 카피(RMAN을 사용시)에 대한 추가적인 정보를 포함하고 있기 때문입니다.

 데이터베이스 구조적 변화 이후 콘트롤 파일 백업하기
 1. 데이터베이스를 변경한다고 가정합니다. 예를 들어 테이블 스페이스를 추가한다고 가정하면
  SQL>ALTER TABLESPACE tbs_1 DATAFILE 'file1.dbf' SIZE 10M;

 2. 이진 파일로 추출될 파일 이름을 정하고 콘트롤 파일을 백업합니다. 다음 SQL문을 참고하십시요.
   SQL>ALTER DATABASE BACKUP CONTROLFILE TO '/backup/contfile.bak' REUSE;

  REUSE 옵션을 사용하면 기존에 백업한 콘트롤 파일이 존재하면 덮어 씌우게 합니다.

 

 

Backing Up the Control File to a trace File
 ALTER DATABASE BACKUP CONTROLFILE 구문의 TRACE 옵션은 콘트롤파일을 관리하고 복구하는데 도움을 줄 것 입니다. TRACE 옵션은 바이너리 파일로 생성하는 대신 SQL 구문을 데이터베이스의 추적 파일에 기록하게 함을 나타냅니다. 추적 파일(trace file) 의 구문은 데이터베이스를 시작하고, 콘트롤 파일을 재 생성하며, 복구하고 데이터베이스를 오픈하는 것으로 이루어져 있습니다.

 추적 파일로 콘트롤 파일을 백업하기 위해 마운트나 오픈상태의 데이터베이스에서 다음 SQL구문을 수행합니다.

  SQL>ALTER DATABASE BACKUP CONTROL FILE TO TRACE;

 RESETLOGS나 NORESETLOGS 를 SQL 구문에 지정하지 않았다면, 생성된 추적파일에는 CREATE CONTROLFILE ... NORESETLOGS 구문이 포함되게 됩니다. 이진 파일로의 백업과 마찬가지로 임시파일 (temp file)의 엔트리는 기록되지 않습니다.

 

 Backing Up the Control File to a Trace File : Example
 sales 데이터베이스의 콘트롤 파일을 재생성 하는 스크립트를 하나 만든다고 가정합니다. 데이터베이스는 다음과 같은 특징을 가지고 있습니다.

 - 세개의 스레드, 스레드 2는 공용(Public) 스레드 3은 개인용(Private)
 - 리두 로그는 2개의 멤버를 가진 3개의 그룹으로 멀티플렉싱
 - 데이터베이스는 다음 데이터 파일을 소유.
   /diska/prod/sales/db/filea.dbf (온라인 테이블스페이스에서 오프라인 데이터파일)
   /diska/prod/sales/db/database1.dbf (온라인 상태의 시스템 테이블 스페이스)
   /diska/prod/sales/db/fileb.dbf (읽기 전용 테이블 스페이스)

 CREATE CONTROLFILE ... NORESETLOGS 구문을 포함한 추적 파일을 만들기 위해 다음을 입력합니다.

  SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE NORESETLOGS;

 그리고 추적파일을 만든 시점의 현재 콘트롤 파일에 기반한 SALES 데이터베이스의 새로운 콘트롤 파일을 만드는 스크립트를 만들기 위해 추적 파일을 수정합니다. 보통 상태의 오프라인 혹은 읽기 전용 테이블 스페이스를 복구하는 절차를 피하기 위해, CREATE CONTROLFILE 구문에서 이들을 제외합니다. 재생성된 콘트롤 파일로 데이터베이스를 오픈하면 이 무시된 파일들은 딕셔너리의 체크코드에 'MISSING'으로 기록됩니다. 이제 ALTER DATABASE RENAME FILE 구문을 이용하여 원래의 파일 이름으로 연결해 주면 됩니다.

 예를 들어 CREATE CONTROLFILE ... NORESETLOGS 스크립트를 MISSING 으로 라벨된 파일을 변경하면서 다음과 같이 수정할 수 있습니다.

# 다음 구문은 새로운 콘트롤 파일을 만들고 이를 이용해서 데이터 베이스를 오픈합니다.
# 로그이력과 RMAN의 메타데이터는 손실될 것 입니다. 추가적인 로그가 오프라인 데이터파일의 복구를 위해
# 요구될 수 있습니다. 온라인 로그가 사용가능할때만 이 방법을 사용하도록 하십시요.

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE SALES NORESETLOGS ARCHIVELOG
     MAXLOGFILES 32
     MAXLOGMEMBERS 2
     MAXDATAFILES 32
     MAXINSTANCES 16
     MAXLOGHISTORY 1600
LOGFILE
     GROUP 1
       '/diska/prod/sales/db/log1t1.dbf',
       '/diskb/prod/sales/db/log1t2.dbf'
     )  SIZE 100K
    GROUP 2
       '/diska/prod/sales/db/log2t1.dbf',
        '/diskb/prod/sales/db/log2t2.dbf'
    ) SIZE 100K,
    GROUP 3
       '/diska/prod/sales/db/log3t1.dbf',
       '/diskb/prod/sales/db/log3t2.dbf'
    ) SIZE 100K
DATAFILE
    '/diska/prod/sales/db/database1.dbf',
    '/diskb/prod/sales/db/filea.dbf'
;

# 이 데이터파일은 오프라인이지만 테이블스페이스는 온라인입니다. 데이터파일을 수동으로 오프라인 합니다.

ALTER DATABASE DATAFILE '/diska/prod/sales/db/filea.dbf' OFFLINE;

# 데이터파일이 백업본으로부터 복원되었거나 최근 SHUTDOWN 이 NORMAL 이나 IMMEDIATE가 아니면
# 복구작업이 필요합니다.

RECOVER DATABASE;

# 모든 리두 로그를 아카이빙 하고 로그를 스위치 합니다.

ALTER SYSTEM ARCHIVE LOG ALL;

# 이제 데이터베이스를 정상적으로 오픈할 수 있습니다.

ALTER DATABASE OPEN;

# 백업 콘트롤 파일은 읽기 전용과 노말 오프라인 테이블스페이스의 목록을 가지고 있지 않기때문에
# 그들의 복구수행을 하지않게 할 수 잇습니다. 데이터 딕셔너리(Data Dictionary)를 체크하고 존재하지 않는 파
# 일들의 정보를 찾아 'MISSINGxxxx'로 마킹합니다. 그러면 이름을 다시 설정하여 미싱 파일들을 복구작업 없이
# 살려낼 수 있습니다.
ALTER DATABASE RENAME FILE 'MISSING0002'
     TO '/diska/prod/sales/db/fileb.dbf';

 

 

 

Making User-Managed backups of Archive Redo Logs

 아카이빙 로그를 쌓아두는 디스크의 공간을 절약하기 위해서 백업된 아카이브 로그를 테입이나 다른 디스크에 백업하기를 원할 것 입니다. 만약 아카이브를 여러 위치에 저장한다면, 각각의 로그 스퀀스 번호의 한 카피만 백업하도록 하십시요.

 아카이브 로그 모드에서의 백업
 1. 데이터베이스가 어떤 아카이브 로그 파일을 생성하는지 확인하기 위해 V$ARCHIVED_LOG 를 조회합니다.

  SQL>SELECT THREAD#, SEQUENCE#, NAME
         FROM V$ARCHIVED_LOG;

 2. 각각의 로그 시퀀스 번호당 하나의 카피만 OS 명령어를 이용하여 백업합니다.
  % cp /oracle/dbs/arc_dest/* /disk7/log_backups

 

 

 

CONTINUE...

2009년 9월 25일 금요일

ORACLE_020. Making User Managed Backups_Part I

Making User Managed Backups_Part I


Querying V$ Views to Obtain Backup information

 listing Database Files before Backup
 백업을 수행하기 전 어떤 파일을 백업해야 할지 데이터 베이스에 쿼리를 수행하여 확인합니다.

 데이터 파일, 온라인 리두, 콘트롤 파일 출력하기
 
1. SQL*Plus 를 시작하고 V$DATAFILE 뷰를 통해 데이터파일 리스트를 확인합니다.
   SQL> SELECT NAME FROM V$DATAFILE;

  조인 구문을 통해 데이터파일과 연관된 테이블 스페이스도 확인할 수 있습니다.
   SQL> SELECT t.NAME "Table Space", f.NAME "Data File"
          FROM V$TABLESPACE t, V$DATAFILE f
          WHERE t.TS#=f.TS# ORDER BY t.NAME;

 2. V$LOGFILE 뷰를 통해 온라인 리두 로그 파일의 목록을 확인할 수 있습니다.
   SQL> SELECT MEMBER FROM V$LOGFILE;

 3. V$CONTROLFILE 뷰를 통해 콘트롤 파일의 데이터 파일명을 확인 가능 합니다.
   SQL> SELECT NAME FROM V$CONTROLFILE;

 4. ALTER DATABASE BACKUP CONTROLFILE TO 'filename' 구문으로 콘트롤 파일을 백업
   하기로 결정했다면 모든 데이터파일과 온라인 리두 로그 파일을 보관해야 합니다. 이는 현
   데이터베이스 구조가 콘트롤 파일이 만들어졌을때의 구조와는 다를 수 있기 때문입니다.

 Determining Datafile Status for Online Tablespace Backups
 데이터 파일이 현 데이터베이스의 온라인 테이블 스페이스 백업인지 아닌지 확인하기 위해 V$BACKUP 뷰를 확인합니다. 이 뷰는 오직 사용자 관리 백업에서만 효용성을 지닙니다. 오프라인 테이블스페이스 백업이나 RMAN백업과는 상관 없습니다.

 V$BACKUP 뷰는 데이터베이스가 OPEN 상태일따 가장 유용합니다. 또한 인스턴스가 Failure되었을때 참조하기 좋은데 이는 인스턴스 Failure 가 났을 당시 파일의 백업상태를 보여주기 때문입니다. 이 정보들을 이용하여 어떤 테이블 스페이스를 백업 모드로 남겨두어야 할지 결정할 수 있습니다.

 V$BACKUP은 현재 사용하는 콘트롤 파일이 미디어 실패 이후 복구된 것 이라면 쓸모가 없어집니다. 복구되거나 혹은 재생성된 콘트롤 파일에는 V$BACKUP 뷰를 채워줄 어떠한 정보도 가지고 있지 않기 때문입니다. 또한 데이터 파일을 복구하였을 경우, V$BACKUP 뷰에서 이 파일의 STATUS는 최신 버전의 상태가 아닌 오래된 버전의 상태를 나타내게 됩니다. 그러므로 이 뷰는 자칫 복구된 파일들에 대해 오해를 일으킬 수 있습니다.

 다음 예제는, 데이터파일과 그에 해당되는 테이블 스페이스가 백업 모드로 되어 있는지 여부를 출력합니다.

 SQL> SELECT t.name "TB_NAME", d.file# "DF#", d.name "DF_NAME", b.status
        FROM V$DATAFILE d, V$TABLESPACE t, V$BACKUP b
        WHERE d.TS#=t.TS#
        AND b.FILE#=d.FILE#
        AND b.STATUS='ACTIVE';

 STATUS 컬럼이 NOT ACTIVE 로 되어 있으면 이 파일은 현제 백업 모드에 있지 않다는 것을 의미합니다. ALTER TABLESPACE ... BEGIN BACKUP 으로 상태를 바꾸어 줄 수 있습니다.



Making User-Managed Backups of the Whole Database

 데이터베이스를 Shutdown 시킨후 데이터베이스의 모든 파일을 백업 할 수 있습니다. 전체 백업을 SHUTDOWN ABORT 후, 데이터베이스가 열린상태, 혹은 인스턴스 실패후 하는 것은 좋지 않습니다. 이러한 경우 체크포인트 SCN과 파일이 일치하지 않게 되기 때문입니다.

 ARCHIVELOG MODE나 NOARCHIVELOG MODE중 하나로 운영하고 있다면 전체 백업을 받을 수 있습니다. 다만 NOARCHIVELOG MODE라면 반드시 백업은 일관성을 유지해야 합니다. 이는 백업을 수행하기전에 반드시 데이터베이스를 SHUTDOWN 시켜야 함을 의미합니다.

 전체 데이터베이스 백업에 의해 생긴 데이터 파일은 체크포인트 SCN이 모두 같기때문에 일관성을 가지고 있습니다. 복구작업이 없이 데이터베이스를 모순없이 복원할 수 있습니다. 백업 파일을 복원후 ARCHIVELOG 모드를 사용중이라면 복원시점에 맞게 복구작업을 추가로 수행할 수 있습니다. 또한 ARCHIVELOG 모드를 사용중이라면 일관성에 상관없이 전체 데이터베이스 백업을 받을 수 있습니다.

 콘트롤 파일은 데이터베이스의 복원과 복구에 중요한 역할을 담당합니다. 데이터베이스가 ARCHIVELOG로 운영되고 있다면 ALTER DATABASE BACKUP CONTROLFLE TO 'FILENAME' 구문으로 콘트롤 파일을 백업하길 권장합니다. OS 유틸리티가 닫혀있는 동안 콘트롤 파일과 전체 데이터베이스를 백업했다면 복원시 반드시 이 콘트롤 파일을 사용해야 합니다.



Making Consistent Whole Database Backups

 데이터베이스의 일관성을 보장하기 위해 NORMAL, IMMEDIATE, TRANSACTIONAL 옵션을 이용하여 데이터베이스를 SHUTDOWN 시키기 바랍니다.

    *NOARCHIVELOG 상태라면 인스턴스가 실패하거나 ABORT 로 SHUTDOWN 시킨 후에는
    전체 백업을 받지 마십시요!

 일관성을 유지한 전체 데이터베이스 백업 절차
  1. 데이터베이스가 OPEN 상태이면 SHUTDOWN 시킵니다.
    SQL>shutdown normal
    SQL>shutdown immediate
    SQL>shutdown transactional

  2. OS명령어를 이용하여 콘트롤 파일을 포함한 모든 데이터 파일을 복사합니다. (예)
    % cp /disk1/oracle/dbs/*.dbf /disk2/backup

  3. 데이터베이스를 재기동 합니다.
    SQL>STARTUP



Making User Managed Backups of Offline Tablespace and Datafiles

 테이블스페이스가 OFFLINE 상태라면 모든 데이터 파일 혹은 각각 개별적인 테이블스페이스의 데이터파일을 백업할 수 있습니다. 테이블 스페이스를 ONLINE/OFFLINE 시키려면 DBA 권한, 혹은 MANAGE TABLESPACE 시스템 권한이 요구됩니다.

 오프라인 테이블 스페이스를 백업하는 절차
 1. 테이블스페이스를 백업하기 전 DBA_DATA_FILES 뷰를 이용해 테이블 스페이스의 데이터
  파일을 확인합니다.
  SQL>SELECT TABLESPACE_NAME, FILE_NAME
        FROM SYS.DBA_DATA_FILES
        WHERE TABLESPACE_NAME='users';

 2. NORMAL로 테이블스페이스를 OFFLINE가능하면 그렇게 하십시요. NORMAIL로 OFFLINE
  시키면 후에 ONLINE 시킬시 추가적인 테이블 스페이스 복구작업이 필요하지 않게 됩니다.
   SQL>ALTER TABLESPACE user OFFLINE NORMAL;

  NORMAL로 OFFLINE 시키면 테이블스페이스가 가진 모든 데이터 파일이 OFFLINE 됩니다.

 3. OFFLINE된 데이터 파일을 백업하십시요. OS 명령을 이용하면 됩니다.
  % cp /disk1/oracle/dbs/user.dbf /disk2/backup/user.dbf.backup (예)

 4. OFFLINE된 테이블 스페이스를 ONLINE 시킵니다.
  SQL>ALTER TABLESPACE user ONLINE;

 5. 백업한 테이블스페이스로 후에 복구작업을 하기 위해 아카이빙 되지 않은 리두로그를
  아카이빙 합니다.
  SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;



Making User-Managed Backups of Online Tablespaces and Datafiles
 
 Making User-Managed Backups of Online Read/Write Tablespace
 데이터베이스가 오픈상태이고 테이블스페이스가 온라인일 경우에서의 사용자 백업을 받기 위해서는 테이블 스페이스를 반드시 백업 모드로 전환시켜 주어야 합니다. ALTER TABLESPACE BEGIN BACKUP구문은 테이블 스페이스를 백업모드로 전환시켜 줍니다.

 테이블스페이스가 백업모드로 들어가면 오라클은 더이상 데이터 파일에 체크포인트를 기록하지 않습니다. OS의 백업 유틸리티 동안 많은 순간에 부분적인 업데이트가 일어날 수 있기 때문에, 오라클은 백업 모드에서 리두 스트림에 모든 바뀐 데이터 블록을 카피합니다. ALTER TABLESPACE END BACKUP 혹은 ALTER DATABASE END BACKUP 구문으로 백업 모드를 빠져나오게 되면 데이터파일의 헤더에 현재 데이터 베이스의 체크포인트를 기록합니다.

 이 방법으로 백업 데이터 파일을 복원하면 데이터파일 헤더는 온라인 테이블스페이스 백업 전의 가장 최근의 체크포인트가 기록됩니다. (백업하는 동안의 체크포인트가 아닙니다.) 결과적으로 오라클은 복구하기 위해 리두 파일을 요구하게 됩니다. 리두 로그 파일은 데이타파일을 복원하고 일관성을 유지하기 위한 모든 변화에 대한 정보를 가지고 있습니다.

 운영중에 온라인 READ/WRITE 테이블 스페이스 복원하기
 1. DBA_DATA_FILES 뷰를 통해 백업할 테이블 스페이스와 데이터파일을 확인합니다.
  SQL>SELECT TABLESPACE_NAME, FILE_NAME
        FROM SYS.DBA_DATA_FILES
        WHERE TABLESPACE_NAME='users';

 2. 해당 테이블 스페이스를 백업모드로 만듭니다.
   SQL>ALTER TABLESPACE users BEGIN BACKUP;

 3. OS명령을 통해 해당 테이블스페이스의 데이터 파일을 백업합니다.

  % cp /oracle/dbs/tbs_21.dbf /oracle/backup/tbs_21.dbf.backup

 4. 백업이 끝났으면 ALTER TABLESPACE END BACKUP 구문을 통해 백업 모드에서 빠저 나
   옵니다.
  SQL>ALTER TABLESPACE users END BACKUP;

 5. 로그를 아카이브 합니다!
  SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;



Making Multiple User-Managed Backups of
                                          Online Read/Write Tablespaces

 Backing Up Online Tablespace in Parallel
 백업할 테이블 스페이스를 백업 모드로 전환합니다. 여러명의 사용자가 이 테이블스페이스를 업데이트 한다면 온라인 리두 로그가 매우 커질 수 있음에 유의하십시요. 왜냐하면 리두 로그는 각각의 데이터 블록에 대한 변화를 기록해 놓아야 하기 때문입니다.

 온라인 테이블 스페이스 백업하기 (In Parallel)
 1. 백업할 테이블 스페이스를 백업 모드로 전환합니다.
  SQL> ALTER TABLESPACE ts1 BEGIN BACKUP;
  SQL> ALTER TABLESPACE ts2 BEGIN BACKUP;

 2. OS 명령어로 각각의 테이블 스페이스가 포함하고 있는 데이터 파일을 백업합니다.
  % cp /oracle/dbs/tbs_* /oracle/backup/

 3. 백업 모드에서 빠저 나옵니다.
  SQL> ALTER TABLESPACE ts1 END BACKUP;
  SQL> ALTER TABLESPACE ts2 END BACKUP;

 4. 로그를 아카이빙 시킵니다.
  SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

 Backing Up Online Tablespace Serially
 한번에 하나의 온라인 테이블 스페이스를 백업할 수 있습니다. 이 방법은 ALTER TABLESPACE BEGIN/END BACKUP 구문 사이의 소요되는 시간이 짧기 때문에 권장되는 방법 입니다. 온라인 백업이 수행되는 동안 모든 데이터블럭에 대한 변경사항이 리두로그에 기록이 되므로 리두 로그 파일이 커질 수 있습니다.

 온라인 테이블 스페이스를 백업하기 (In Serial)
 1. 백업할 온라인 테이블 스페이스를 백업 모드로 둡니다.
  SQL> ALTER TABLESPACE ts1 BEGIN BACKUP;

 2. OS명령어로 테이블 스페이스가 포함하고 있는 데이터 파일을 백업합니다.
  % cp /oracle/dbs/tbs1.dbf /oracle/backup/

 3. 백업 모드에서 빠저나옵니다.
  SQL> ALTER TABLESPACE ts1 END BACKUP;

 4. 또다른 백업할 테이블이 있으면 1-3번을 반복합니다.

 5. 로그를 아카이빙 시킵니다.
  SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;



Ending a Backup After an Instance Failure or SHUTDOWN ABORT

 About Instance Failures When Tablespaces are in Backup Mode
 다음과 같은 상황은 테이블 스페이스 백업이 실패하거나 불완전하게 종료될 수 있습니다.

  - 백업이 끝났지만 ALTER TABLESPACE END BACKUP 을 수행하지 않은 경우
  - 백업이 끝나기 전에 인스턴스 실패, 혹은 SHUTDOWN ABORT 를 한 경우

 언제든지 장애복구는 필요합니다. (인스턴스 복구가 아닙니다. 이 경우는 이미 데이타 파일이 열린 경우 입니다.) 데이터파일이 백업 모드에 있을때 데이터파일을 열려고 시도할 경우 시스템은 이 데이터 파일이 백업본으로부터 복원된 파일이라 간주합니다. 따라서 오라클은 복구 명령이 떨어지기 전까지 데이터베이스를 오픈하지 않습니다. (혹은 데이터 파일이 백업 모드에서 벗어나기 전 까지 이거나 말이죠.)

 예를들어 위 상황에서 데이터베이스에 STARTUP 명령을 내리면 다음과 같은 에러 메세지를 뿌립니다.

  ORA-01113: file 12 needs media recovery
  ORA-01110: data file 12: '/oracle/dbs/tbs_41.f'

 만약 오라클이 여러개의 테이블 스페이스에 대한 데이터 파일이 미디어 복구를 카르키면 테이블 스페이스에 대한 온라인 백업의 끝을 선언해 주지 않았기 때문입니다. 따라서 ALTER DATABASE END BACKUP 구문을 입력하면 모든 데이터 파일에 대한 백업 모드에서 빠저나오게 해 줍니다.

 높은 가능성을 가진 상황들중 하나인 어떤 DBA도 모니터링을 하지 않는 상황에서 (예를들어 매우 이른 아침) 사용자 개입이 요구되어집니다. 그러므로 다음과 같은 복구 스크립트를 짜놓습니다.

  1. 데이터베이스 마운트
  2. ALTER DATABASE END BACKUP 구문 수행
  3. ALTER DATABASE OPEN 구문으로 자동으로 시스템 가동

 ALTER DATABASE END BACKUP 구문이 포함된 자동 스크립트는 특별히 다음과 같은 상황에서 굉장히 유용합니다.

  - Oracle Real Application Clusters 하의 모든 노드 환경설정 실패
  - Cold Failover Cluster 의 한개의 노드 실패

 테이블 스페이스가 백업 모드로 있음으로서 발생하는 시스템 실패후 다음 대안을 통해서 해결할 수 있습니다.

  - 데이터베이스를 복구하여 모두 END BACKUP 구문을 입력하지 않는 방법
  - 데이터베이스를 마운트 상태로 하여 ALTER TABLESPACE ..END BACKUP을 통해 각각의
   테이블 스페이스를 백업모드에서 빠저나오는 방법

 Ending Backup Mode with the ALTER DATABASE END BACKUP Statement
 여전히 여러개의 테이블 스페이스가 백업 모드로 존재할때 ALTER DATABASE END BACKUP 구문을 이용할 수 있습니다. 이 구문의 주 목적은 DBA가 자리에 없을때 복구 스크립트를 이용하여 시스템을 재시작 할 수 있게 함 입니다. 또한 다음 과정을 통해 직접 수행할 수 있습니다.

 테이블스페이스를 백업 모드에서 빠저나오게 하기
 1. 마운트 까지만 데이터베이스를 유지합니다. 오픈하지는 않습니다.
  SQL>STARTUP MOUNT

 2. V$BACKUP 뷰를 확인하여 백업 모드에 있는 테이블 스페이스를 확인합니다.
  SQL>SELECT * FROM V$BACKUP WHERE STATUS='ACTIVE';

 3. 많은 수의 테이블 스페이스가 백업 모드라면 다음 구문을 입력합니다.
  SQL>ALTER DATABASE END BACKUP;

  이 구문은 마운트 상태에서는 가능하지만 오픈 상태에서는 불가능 합니다. 오픈상태에선
  ALTER TABLESPACE .. END BACKUP 구문을 일일이 입력해 주어야 합니다.

 Ending Bakcup Mode with the RECOVER Command
 ALTER DATABASE END BACKUP 구문은 온라인 백업실패시 사용할 수 있는 유일한 방법은 아닙니다. RECOVER 명령을 통해서도 가능합니다. 이 방법은 다른 누군가가 백업본을 복원했는지 확실치 않을때 매우 유용하게 사용할 수 있습니다. 만약 누군가가 실로 백업을 복원하였다면 RECOVER 명령은 백업본을 업데이트 합니다. 오직 해당 파일이 CURRENT 인 경우에만 ALTER DATABASE END BACKUP, ALTER TABLESPACE END BACKUP 구문을 이용하십시요.

 RECOVER 명령으로 백업모드 끝내기
 1. 마운트 상태로 돌입합니다
  SQL>STARTUP MOUNT

 2. 일반적인 방법으로 데이터베이스를 복구합니다.
  SQL>RECOVER DATABASE

 3. V$BACKUP 구문을 통해 ACTIVE 상태인 데이터 파일이 없는지 확인합니다.
  SQL>SELECT * FROM V$BACKUP WHERE STATUS='ACTIVE';



Making User-managed Backups of Read-Only Tablespace

 온라인 읽기 전용 테이블 스페이스를 백업할때 온라인 데이터파일을 간단히 백업할 수 있습니다. 테이블 스페이스를 백업 모드로 둘 필요도 없습니다. 시스템이 데이터파일을 변경하는 것을 허락하지 않기 때문입니다.

 읽기 전용 테이블 스페이스들이 독립적이라면 (그래서 추가적으로 OS 명령어를 통해 백업을 수행중이라면) 수송 테이블(transportable tablespace)을 이용하여 테이블스페이스의 메타데이타를 추출할 수 있습니다. 미디어 에러나 사용자 에러(읽기 전용 테이블 스페이스에서 테이블이 드롭된 경우) 테이블 스페이스를 데이터베이스로 다시 전송할 수 있습니다.

 오픈 데이터베이스에서 읽기 전용 테이블스페이스 백업하기
 1. DBA_TABLESPACES뷰를 통해 읽기 전용 테이블을 확인합니다.
  SQL>SELECT TABLESPACE_NAME, STATUS
        FROM DBA_TABLESPACES
        WHERE STATUS='READ ONLY';

 2. 읽기 전용 테이블 스페이스를 백업하기 전에 DBA_DATA_FILES 뷰를 통해 테이블스페이
  스의 데이터 파일 확인합니다.
  SQL>SELECT TABLESPACE_NAME, FILE_NAME
       FROM SYS.DBA_DATA_FILES
       WHERE TABLESPACE_NAME='HISTORY';

 3. OS명령어로 데이터파일을 백업합니다.
  % cp /oracle/dbs/tbs_hist*.f /backup

 4. 선택적으로, 읽기 전용 테이블의 메타 데이터를 추출합니다. 전송 테이블을 사용함으로서 미디어 실패나 사용자 에러의 경우 빠르게 데이터 파일을 복원할 수 있고, 메타데이터를 임포트 할 수 있습니다.
  % exp TRANSPORT_TABLESPACE=y TABLESPACE=(history) FILE=/backup/tbs_hist.dmp


Making User-Managed Backups of Undo Tablespace

 9i버전 이전에는 언두 스페이스의 관리는 롤백 세그먼트에 기반하였습니다. 이 방법은 Manual undo management mode 라 불리었습니다. 9i 부터 데이터 베이스를 Auto undo management mode 상태로 둘 수 있습니다. 이 방법은 롤백 세그먼트를 데이터셋에 정적으로 분배하는 방식 대신에 하나의 언두 테이블스페이스에 언두 공간을 할당하는 방식입니다.

 언두 테이블스페이스를 백업하는 방법은 읽기/쓰기 테이블 스페이스의 백업 방법과 동일합니다. 자동 언두 테이블스페이스는 복구와 읽기 일관성에 있어서 매우 중요하기 때문에 수동 언두 테이블스페이스 모드로 수행중일때 롤백 세그먼트를 포함한 테이블 스페이스를 백업하는 것 처럼 자주 백업을 하는게 좋습니다.

 데이터베이스가 운영중일때 언두 테이블스페이스를 잃게 되고 백업본이 없다면 커밋(commit) 되지 않은 오브젝트에 쿼리를 수행시 에러 메세지를 보게 될 것 입니다. 또한 인스턴스 실패가 발생시, 커밋되지 않은 트렌젝션을 다시 원래값으로 되돌릴 수 없게 됩니다.

- Continue

2009년 9월 15일 화요일

교육

이번주는 교육의 주다. (만세!)

교육하면, 9시 반까지 출석!! 실컷 아침잠을 즐길 수 있어 좋다!
그것 뿐이랴. 5시에 수업 종료~ 점심시간은 무려 1시간 반이다. 아웅~


그런데 오늘 회사왔다. -_-;

사수가 잠시 다른 동네에 다녀오실 일이 있어 나왔다..= ㅅ=..

 

남은 교육 3일, 열심히 배우자!
여전히 아리송한 JCL 아닌가!! 이번에 제대로 배워서
업무에 쓸 JCL을 적어도 만들지는 못해도, 읽고 해석할 수 있을 정도는
되자!




FIN~

 

 

2009년 9월 11일 금요일

ORACLE_018. Managing Tablespace _ Part 2

Managing Tablespace : Part 2


COALESCING FREE SPACE IN DMT
 Dictionary- Managed tablespaces(DMT) 는 단편화가 일어나 새로운 익스텐트(Extent)를 할당하는데 어려움이 생길 수 있습니다. 이번 포스팅에서는 이러한 단편화된 공간을 정리하는 방법에 대해서 알아보겠습니다.

 
How Oracle Coalesces Free Space
 DMT에서의 빈 익스텐트는 인접해 있는 비어있는 블록들의 모음도 포함합니다. 테이블스페이스 세그먼트에 새로운 익스텐트를 할당할때, 요구된 사이즈는 가장 근접한 비어있는 익스텐트에 할당하게 됩니다. 세그먼트를 드롭하는 몇몇의 경우 세그먼트가 포함하고 있던 익스텐트는 해제되고 비어있는 공간임을 표시합니다. 하지만 해제되어 비어있는 익스텐트는 큰 비어있는 익스텐트에 바로 융합되지 않습니다. 결과적으로 좀더 큰 익스텐트를 할당하는데 있어 좀더 어려운 상황을 맞이하게 됩니다.

 단편화는 다음 몇몇의 경우에 발생하게 됩니다.

  - 세그먼트에 새로운 익스텐트를 할당할시 오라클은 우선 새로운 익스텐트가 들어갈 수
   있을 정도의 충분히 큰 빈 익스텐트를 찾습니다. 어떤 빈 익스텐트도 요구하는 크기보다
   크지 않을때 테이블 스페이스 내에서 인접해 있는 비어있는 익스텐트들을 합치고 다시
   빈 익스텐트를 검색합니다. 새로운 익스텐트 할당을 할 수 없을 시 오라클은 항상 이 작업
   을 수행합니다.

  - SMON 백그라운드 프로세서는 PCTINCREASE 값이 0이 아닐경우 정기적으로 이웃해 있
   는 비어있는 익스텐트의 병합 작업을 수행합니다. PCTINCREASE=0 으로 설정해 놓으면
   빈 익스텐트의 병합은 일어나지 않습니다. SMON 이 병합에 의해 오버헤드가 발생하는 것
   이 걱정이 되면 PCTINCREASE=0 으로 설정하고, 정기적으로 익스텐트를 수동으로 병합
   하면 됩니다.
  - 세그먼트가 드롭(DROP) 되거나 잘릴때 (TRUNCATE) PCTINCREASE 값이 0이 아닐때
   익스텐트의 병합이 일어나고, 이 값이 0이 아니어도 역시 병합이 수행됩니다.
  - ALTER TABLESPACE ... COALESCE 명령으로 수동으로 병합을 수행할 수 있습니다.


                <Pic : Coalescing Free Space>

 Manually Coalescing Free Space
 비어있는 공간의 단편화가 심하다는 것을 확인했다면, ALTER TABLESPACE ... COALESCE 명령을 통해 익스텐트를 수동으로 병합할 수 있습니다. ALTER TABLESPACE 의 시스템 권한을 요구합니다.

 PCTINCREASE=0일때나 SMON의 부하를 조금이라도 줄이기 위해 이 명령어를 사용할 수 있고 할당된 익스텐트를 병합할때 사용합니다. 만약 테이블스페이스에 할당된 익스텐트의 크기가 모두 같다면 병합 작업은 필요하지 않습니다. 이는 아마도 PCTINCREASE 값이 0으로 설정되어 있을 경우이거나 테이블 스페이스의 스토리지 파라메터인 INITIAL, MINIMUM EXTENT, NEXT 값이 모두 같을 경우 일 것 입니다.

 다음 구문은 tabsp_4 테이블스페이스의 빈 공간을 병합하는 명령입니다.

  ALTER TABLESPACE tabsp_4 COALESCE

 다른 ALTER TABLESPACE .. 명령과 마찬가지로 COALESCE 옵션은 베타적입니다. 즉, 다른 부가적인 옵션은 사용하지 않고 혼자서 쓰입니다.

 이 구문은 데이터 익스텐트에 의해 단편화된 빈 공간을 합치지는 않습니다. 데이터 익스텐트 사이사이에 빈 익스텐트가 많이 발견된다면 테이블 스페이스를 재정렬 해야 합니다.(예를들어 Import/Export 를 이용)


 Monitoring Free Space
 테이블 스페이스의 빈 공간을 조회하기 위해 다음 뷰를 사용합니다.

  - DBA_FREE_SPACE
  - DBA_FREE_SPACE_COALESCED

 다음 구문은 tabsp_4 테이블 스페이스에 대한 공간 정보 입니다.

  SELECT BLOCK_ID, BYTES, BLOCKS
    FROM DBA_FREE_SPACE
    WHERE TABLESPACE_NAME='TABSP_4'
    ORDER BY 1;
 

 BLOCK_ID

--------------

BYTES

---------------

BLOCKS

-------------

 2

16384

2

 4

16384

2

 6

81920

10

 16

16384

2

 27

16384

2

 29

16384

2

 31

16384

2

 33

16384

2

 35

16384

2

 37

16384

2

 39

8192

1

 40

8192

1

 41

19660

24

 13 Rows selected

 이 뷰는 tabsp_4 테이블스페이스에 인접한 병합되어 있지 않는 빈 공간을 보여주고 있습니다. ALTER TABLESPACE COALESCE 구문을 이용하여 이들을 병합하면 다음과 같은 결과를 얻습니다.

 BLOCK_ID

--------------

BYTES

---------------

BLOCKS

-------------

 2

131072

16

27

311296

38

2 Rows selected

 DBA_FREE_SPACE_COALESCED 뷰는 병합활동의 통계를 보여줍니다. 이 뷰는 공간을 병합할지의 여부를 결정하는데 매우 쓸모있습니다.


SPECIFY NONSTANDARD BLOCK SIZE TABLESPACE
 테이블스페이스를 작성시 DB_BLOCK_SIZE 초기화 파라메터에 정의되어 있는 표준 블록 사이즈와 다른 크기의 블록 사이즈를 가진 테이블 스페이스를 만들 수 있습니다. 이 기능은 표준 블록 사이즈가 다른 데이터베이스 간에 테이블을 주고 받을 수 있게 합니다.

 CREATE TABLESPACE 구문의 BLOCKSIZE 단서는 표준 블록 사이즈와 다른 블록 사이즈를 갖는 테이블 스페이스를 만들 수 있게 해 줍니다. 단, SGA에 비표준 블록사이즈의 퍼퍼 캐시를 설정해 주어야 합니다.

 다음 구문은 lmtsb 테이블 스페이스를 생성하지만, 표준 블록 사이즈와 다른 블록 사이즈를 가지고 만듭니다.

  CREATE TABLESPACE lmtsb DATAFILE '/u02/oracle/data/lmtsb01.dbf' SIZE 50M
     EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K
     BLOCKSIZE 8K;

        * BLOCKSIZE nK 단서를 수행하기 위해서는 DB_CACHE_SIZE와 최소 한개의
         DB_nK_CACHE_SIZE 초기화 파라메터를 설정해야 합니다. BLOCKSIZE nK
         에서의 n과 DB_nK_CACHE_SIZE 의 n 값은 반드시 같아야 합니다.



CONTROLLING THE WRITING OF REDO RECORDS
 데이터베이스를 운영중에 리두 레코드(Redo Record) 를 생성 할지 안할지를 정할 수 있습니다. 리두를 생성하지 않는것은 성능을 향상시킬 수 있고, 쉽게 복구가 가능한 행위를 할때 사용할 수 있습니다. 이런 경우는 아마도 CREATE TABLE .. AS SELECT 같은 인스턴스가 실패해도 명령을 반복적으로 수행할 수 있는 경우가 될 것 입니다. 리두를 사용하지 않으면 미디어 복구(Media Recovery)를 수행할 수 없습니다.

 CREATE TABLESPACE 구문의 NOLOGGING 옵션은 테이블스페이스에서 오브젝트가 활동할때 리두를 작성하지 않길 원할때 사용합니다. 이 옵션을 달지 않으면 LOGGING으로 설정되고 테이블스페이스내의 오브젝트가 변경되거나 만들어질때 리두를 기록합니다. 리두는 LOGGING 옵션을 붙인다 하더라도 임시 세그먼트나 임시 테이블스페이스에 관한 기록은 절대 하지 않습니다.

 테이블스페이스 레벨에서 설정한 이 옵션은 테이블스페이스 내에서 생성되는 모든 오브젝트에게 적용됩니다. 이러한 옵션은 스키마 레벨에서 오브젝트를 작성할 때 오버라이드 하여 사용할 수 있습니다. (예를들어 CREATE TABLE 구문)

 스텐바이 데이터베이스의 경우 NOLOGGING 을 설정하는것은 스텐바이 데이터베이스의 정확성과 이용성에 문제를 야기할 수 있습니다. 이 문제를 극복하기 위하여 테이블을 작성시FORCE LOGGING 을 사용할 수 있습니다. 이는 테이블스페이스 내에서 오브젝트의 변화를 강제로 기록할 수 있게 합니다. 이 옵션은 오브젝트 레벨에서 만들어진 모든 객체에 사용 가능합니다.

 FORCE LOGGING 으로 만들어진 테이블 스페이스를 다른 데이터 베이스로 옮기면 새로운 테이블 스페이스는 FORCE LOGGING 옵션은 다루지 않습니다.




FIN.
REF) Oracle Documents.Server.920/a96521 Managing Tablespaces

자리.

내 자리

회사에서의 내 자리

자리.

 

빌딩으로 이루어진 서울이라는 우림에서 내가 있을 자리는 과연 있을까 하는 생각을 많이 했었지만 다행히도 지금은 이 책상 한칸의 자리를 얻을 수 있었다.

아직은 완벽하다 할 수 없겠지만,
아니 오히려 많이 모른다고 하는게 더 가깝겠지.

이자리에 앉기까지는 조금 성급하기도 했고,
또 많이 서두르기도 했다.

무언가를 하고 싶었으니까..

지금부터는 그러지 않겠다고 마음 먹는다.


처음 시작하는 자세로 하나하나 쌓고 올라가자. 항상 내 이상향을 생각하며 노력하자.


2009년 9월 10일 목요일

ORACLE_017. Managing Tablespace _ Part 1

Managing Tablespace : Part 1


CREATING TABLESPACE

 어떠한 데이터베이스라도 처음 만들어지는 테이블 스페이스는 SYSTEM 테이블 스페이스 이며, 최초로 만들어지는 데이터파일은 SYSTEM 테이블 스페이스에 자동으로 기록됩니다.

 테이블 스페이스를 만드는 방법은 사용하는 OS에 따라 그 방법이 다양합니다. 하지만 OS명령을 통하여 데이터 파일이 위치할 디렉토리 구조를 만들어 주어야 하는 것은 공통적인 요구사항 입니다. 모든 OS에서 테이블 스페이스를 만들거나 테이블 스페이스에 데이터 파일을 추가할때 그 용량과 파일 이름을 지정해 주어야 합니다. 그러면 오라클은 지정된 정보에 의거하여 데이터 파일을 만들고 오라클에서 사용할 수 있게 그 파일을 포맷합니다.

 테이블 스페이스를 작성하기 위해서는 CREATE TABLESPACE 혹은 CREATE TEMPORARY TABLESPACE 라는 SQL 구문을 이용합니다. 이는 CREATE TABLESPACE 시스템 권한이 요구됩니다. 후에 테이블 스페이스를 변경하기 위해서 ALTER TABLESPACE 혹은 ALTER DATABASE 구문을 이용하면 됩니다. 역시 ALTER TABLESPACE, ALTER DATABASE 시스템 권한이 필요합니다.

 오라클 8i 이전에는 Dictionary-managed 방식으로 테이블 스페이스를 만들었습니다. Dictionary-Managed tablespaces(DMT)는 공간 사용을 추적하기 위한 정보가 Data Dictionary table(DDT) 에 저장됩니다. 8i 부터 Locally-managed tablespace(LMT) 방식을 사용하는데, 이 방식은 비어있는 공간과 사용된 공간에 대한 정보를 추적하기 위해 비트맵(Bitmaps)을 사용합니다. 이러한 LMT는 좀더 빠른 성능과 관리의 편리함을 제공합니다.

 Undo tablespace 라고 하는 특별한 테이블 스페이스를 생성할 수도 있습니다. 이 테이블 스페이스는 언두 기록을 저장하기 위한 테이블 스페이스 입니다. 이 테이블 스페이스는 롤백(Roll back), 언두(Undo), 복구를 위한 데이터베이스 변환, 읽기 일관성, 혹은 ROLLBACK 구문을 수행하기 위해 오라클이 생성합니다.



 Locally Managed Tablespace (LMT)
 LMT는 자신의 테이블 스페이스 안에 익스텐트(extent)에 관련한 정보를 비트맵을 이용하여 보관하고 있습니다. 이는 다음의 이익을 가져다 줍니다.

 - 동시 사용성과 공관에 관한 작업속도를 향상시킵니다. 공간의 할당과 해제가 헤더파일에 저장되어
  있는 비트맵을 이용하여 로컬에서 수행되기 때문에 Enqueues같은 중앙 집중형 자원 관리에 비해 뛰
  어납니다.
 - 성능이 향상됩니다. DDT에 요청하여 공간을 조작하는 시간이 사라졌습니다.
 - 읽기가능 대기 데이터베이스가 가능합니다. LMT의 임시 테이블스페이스(예를 들어 정렬에 사용하
   는) 다른 어떠한 Undo나 Redo 를 생산해 내지 않습니다.
 - 간단한 공간 할당 - AUTOALLOCATE 단서를 사용하면 자동으로 EXTENT 크기가 결정됩니다.
 - 사용자가 DDT에 의존성이 감소합니다. 필요한 정보가 비트맵 블록과 파일 헤더에 저장되어 있기
   때문입니다.

 SYSTEM TABLESPACE를 포함한 모든 테이블 스페이스가 LMT로 관리될 수 있습니다. 게다가
DBMS_SPACE_ADMIN 패키지는 LMT를 위한 유지, 관리 기능을 제공합니다.



 Creating Locally Managed Tablespace
 LMT로 생성하기 위해서 CREATE TABLESPACE 구문에서 EXTENT MANAGEMENT LOCAL 로 정의합니다. 그러면 두가지 옵션을 선택 할 수 있습니다. 하나는 AUTOALLOCATE(기본값)를 이용하여 오라클이 직접 Extent를 관리하게 하는 방법과 UNIFORM SIZE 를 이용하여 사용자가 Extent를 직접 관리하는 방법이 있습니다.

 테이블 스페이스가 다양하고 많은 수의 extent를 가진 오브젝트로 구성이 될 것이라 예상된다면 AUTOALLOCATE 옵션이 좋습니다. 공간 할당과 해제가 그리 중요하지 않다면 AUTOALLOCATE 는 테이블 스페이스를 관리하는 가장 간단한 방법입니다. 약간의 공간이 낭비될 수도 있습니다만 오라클이 공간을 관리하게 하면 크게 문제가 되지 않습니다.

 반면에 사용하지 않는 공간을 정확히 제어하고 싶거나, 오브젝트에 얼마만큼의 공간이 할당되는지나 오브젝트의 수, extnets의 사이즈를 확실히 에측할 수 있다면 UNIFORM 이 좋은 선택이 될 것 입니다. 이는 테이블 스페이스안에 사용하지 않는 공간이 생기는 것을 방지하겠다는 뜻 입니다.

 다음은 AUTOALLOCATE를 사용하여 LMTBSB라는 LMT 방식의 테이블 스페이스를 작성하는 방법 입니다.

 CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
   EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

 AUTOALLOCATE 는 테이블 스페이스가 가장 작은 Extent 사이즈인 64K로 생성하고 시스템이 관리하게 합니다.

 UNIFORM 단서를 이용하여 테이블 스페이스를 생성할 수도 있습니다. UNIFORM SIZE 를 정의하면 테이블 스페이스는 SIZE 에서 정의된 UNIFORM 크기로 관리 됩니다. 기본 SIZE 값은 1M 입니다.

 다음 예제는 Extent의 크기가 128K로 지정되어 있습니다. 각각의 128K Extent는 (만약 테이블 스페이스 블록 크기가 2K라면 64개의 오라클 블록과 같습니다) extent bitmap에 비트값으로 표현되어 집니다.

  CREATE TABLESPACE lmtbsb DATAFILE'/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

 EXTENT MANAGEMENT LOCAL 을 정의하지 않으면 DEFAULT, MINIMUM EXTENT, TEMPORARY 단서를 사용할 수 없습니다. LMT 방식의 TEMPORARY 테이블 스페이스를 작성하고자 한다면 CREATE TEMPORARY TABLESPACE 구문을 사용하시기 바랍니다.



 Specifying Segment Space Management in Locally Managed TAblespaces
 CREATE TABLESPACE 구문을 이용하여 LMT를 생성할때 SEGMENT SPACE MANAGEMENT 단서는 관리되는 세그먼트에서 얼마나 공간에 여유를 둘 것인지와 공간을 사용할 것인지를 정의할 수 있게 합니다.

  - MANUAL
    세그먼트 안의 여유공관 관리를 FREE LISTS로 하겠음으로 선언하는 것
   입니다. Free lists는 데이터 블록에 얼만큼의 여유 공간을 블록에 두고 행을 삽입할 것인지를 선언해
   놓은 목록 입니다. 세그먼트에서 공간을 관리하는 형식을 manual segment-space management라고
   합니다. 이는 테이블 스페이스에 있는 스키마 오브젝트의 PCTUSED, FREELISTS, FREELISTS GROUP
  
이라는 스토리지 파라미터를 튜닝하고 정의하는 일이 필요하기에 Manual 이라 합니다.

  - AUTO
    이 옵션은 세그먼트에서 비어있는 공간을 Bitmap을 이용해서 관리하겠다는 뜻 입니다. 이 경우
   비트맵은 세그먼트의 행을 삽입할 수 있는 블록의 공간 합계와 함께블록들에 대한 상태를
   나타냅니다. Bitmap은 오라클이 비어있는 공간을 좀더 자동으로 관리할 수 있게 합니다. 그러므로
   이 방법을 Automatic segment-space management(ASSM) 라 부릅니다.

 Automatic segment-space management 는 세그먼트 내의 공간을 좀더 효율적으로 관리할 수 있게 합니다. PCTUSED, FREELISTS, FEELISTS GROUP을 설정할 필요가 전혀 없습니다. 혹여나 이 파라메터들이 설정되어 있다고 하여도 오라클은 이들 값을 무시합니다.

 ASSM은 Manul 방식보다 좀더 좋은 공간 활용을 제공합니다. 그리고 사용자 수의 증가에 맞춰 인스턴스처럼 스스로 자신의 스케일을 조절합니다. Real Application Clusters 환경에서 ASSM은 인스턴스에게 적합한 공간을 동적으로 제공합니다. 따라서 free list group을 이용한 고유 공간 할당을 위해 하드 파티셔닝을 피할 수 있습니다.

 많은 일반적인 워크로드(workload)에서 어플리케이션은 ASSM에서 좀더 나은 수행 능력을 보여줍니다. 다음 예제는 ASSM을 이용한 lmtbsb 테이블 스페이스를 만드는 예제 입니다.

 CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
   EXTENT MANAGEMENT LOCAL
   SEGMENT SPACE MANAGEMENT AUTO;



 Altering a Locally Managed Tablespaces
 LMT를 LMT를 이용한 TEMPORARY TABLESPACE로 변환은 불가능하고 세그먼트 관리의 방식 역시 바꿀 수 없습니다. LMT 에서 ALTER TABLESPACE 구문을 사용하는 몇가지 이유는 다음과 같습니다.

  - 데이터 파일 추가
    ALTER TABLESPACE lmtbsb ADD DATAFILE '/u02/oracle/data/lmtbsb02.dbf' SIZE 1M;

  - 테이블스페이스의 상태 변화(online/offline)

  - Read-only 혹은 Read-Write 상태의 변화

  - 데이터 파일의 이름변경. 혹은 테이블 스페이스의 데이터 파일에 대한 자동확장기능 켬/끔

 LMT에서 빈 공간의 병합은 필요하지 않습니다.



 Dictionary-Managed Tablespaces (DMT)
 오라클 9i 부터 테이블 스페이스를 만들때 기본적인 Extent 관리는 LMT 방식 입니다. 하지만 몇개의 특정한 지정자를 사용하여 DMT로 만들 수 있습니다. DMT 를 사용하면 오라클은 DDT에 Extent를 할당하거나 재사용하기 위해 비어있는 공간에 대한 정보를 갱신 합니다.


 Creating a Dictionary-Managed Tablespace
 예제에서는 다음의 특징을 가지고 tbsa 라는 테이블 스페이스를 만들어 봅니다.

  - 새로운 테이블 스페이스는 50M의 한개의 데이터 파일을 가지게 됩니다.
  - EXTENT MANAGEMENT DICTIONARY로 정의하여 DMT방식으로 생성합니다.
  - 이 테이블스페이스에 생성된 세그먼트의 저장관련 파라메터는 기본값으로 설정됩니다.

 다음 구문을 이용하여 tbsa 테이블 스페이스를 만듭니다.
  CREATE TABLESPACE tbsb
    DATAFILE '/u02/oracle/data/tbsa01.dbf' SIZE 50M
    EXTENT MANAGEMENT DICTIONARY
    DEFAULT STORAGE (
         INITIAL 50K
         NEXT  50K
         MINEXTENTS 2
         MAXEXTNETS 50
         PCTINCREASE 0 );

 위 예제에서 사용된 파라미터들은 테이블스페이스에서 세그먼트 할당을 정의합니다. 이 파라메터들은 데이터베이스에 저장된 데이터에 접근하는데 얼마나 시간이 걸리는지와, 데이터베이스가 사용하는 공간이 효율적인지에 연관됩니다.

   INITIAL
         세그먼트 안의 익스텐트의 초기 크기를 지정합니다. (K or M)
   NEXT
         두번째 익스텐트의 크기를 지정합니다. (K or M)
   PCTINCREASE
         두번째 익스텐트 후 익스텐트가 확장되는 크기의 비율을 정합니다.
   MINEXTENTS
         테이블스페이스에 첫 세그먼트가 생성시 할당될 익스텐트의 갯수 입니다.
   MAXEXTENTS
         세그먼트가 가질 수 있는 익스텐트의 최대 값 입니다. UNLIMITED로 설정할 수도 있습니다.

 CREATE TABLESPACE 구문의 또다른 파라메터인 MINIMUM EXTENT는 세그먼트 할당에도 영향을 미칩니다. 이 값을 정의하면 테이블 스페이스의 모든 비어있거나 할당된 익스텐트는 최소한의 크기가 정의된 숫자의 바이트(K or M)의 배수만큼 크기가 결정됩니다. 이는 테이블 스패이스의 빈 공간이 단편화가 일어나는 것을 막는 의미를 뜻합니다.

 

 Altering a Dictionary-Managed Tablespace
 ALTER TABLESPACE 를 사용하는 이유중 하나는 데이터 파일의 추가 입니다.

  ALTER TABLESPACE tbsa
     ADD DATAFILE '/u02/oracle/data/tbsa02.dbf' SIZE 1M;

 또한 기본적인 저장관련된 파라메터 값을 바꾸길 원할 수 있습니다. 이러한 기본값들은 ALTER TABLESPACE 구문을 이용해 바꿀 수 있습니다.

  ALTER TABLESPACE users
      DEFAULT STORAGE (
          NEXT 100K
          MAXEXTENTS 20
          PCTINCREASE 0 );

 테이블스페이스의 새로운 기본 저장 파라메터는 미래에 생성될 새로운 오브젝트에 한하거나, 테이블 스페이스 내의 기 존재하는 세그먼트에 익스텐트를 할당할때 적용됩니다.

 ALTER TABLESPACE 구문을 사용하는 이뉴는 다음을 포함하나 이에 국한되지 않습니다.

  - 테이블 스페이스내 빈 공간 병합
  - ONLINE/OFFLINE 의 변환
  - Read-only / Read-write 변환
  - 데이터 파일의 추가 혹은 이름변경, 테이블 스페이스의 데이터파일 사이즈의 자동확장 켬/끔



 Temporary Tablespaces
 동시 다중 정렬 기능의 성능 향상, 오버헤드의 감소 혹은 오라클이 총체적인 공간관리를 피하기 위해 임시 테이블 스페이스(Temporary Tablespaces) 를 만듭니다. 임시 테이블 스페이스는 여러 사용자와 공유가 가능하고 CREATE USER 구문으로 사용자를 생성할때 사용자에게 직접 임시 테이블 스페이스를 지정해 줄 수 있습니다.

 임시 테이블스페이스에서 인스턴스와 테이블스페이스의 정렬 작업은 하나의 정렬 세그먼트(Sort Segment)를 공유합니다. 정렬 세그먼트는 주어진 테이블스페이스내에 정렬 작업을 수행하는 모든 인스턴스에 존재합니다. 정렬 세그먼트는 DB 시작후 임시 테이블스페이스를 정렬하기 위해 사용하는 구문에 의해 생성되고 DB가 shutdown 될시에만 할당이 해제됩니다. 익스텐트는 여러개의 트랜젝션과 공유되지 않습니다.

 V$SORT_SEGMENT 뷰를 통해 임시 테이블스페이스내의 정렬 세그먼트에 대한 할당과 해제에 관한 정보를 볼 수 있습니다. V$TEMPSEG_USAGE 뷰는 이 세그먼트에서 정렬을 수행하는 사용자를 확인할 수 있습니다.

 임시 테이블 스페이스에는 사용자 임의로 오브젝트를 만들 수 없습니다.



 Creating a Locally Managed Temporary Tablesapce
 LMT 방식의 임시 테이블스페이스로 만들면 훨씬 간단하고 좀더 효과적입니다. LMT 임시 테이블 스페이스는 임시파일(tempfiles) 을 사용하는데 임시 테이블 스페이스 외부에서 데이터를 조작하지 않고, 임시 테이블 스페이스와 관련된 어떠한 리두 파일도 생성하지 않습니다. 따라서 스텐바이 데이터베이스나, Read-only 데이터베이스에도 사용됩니다.

 V$TEMPFILE DBA_TEMP_FILES 뷰는 V$DATAFILE DBA_DATA_FILES 뷰와 유사합니다.

 LMT 방식으로 임시 테이블 스페이스를 생성하때 CREATE TEMPORARY TABLESPACE 구문을 사용하며 CREATE TABLESPACE 시스템 권한을 요구합니다. 다음 구문은 임시 테이블 스페이스를 16M의 익스텐트를 가진 임시 테이블 스페이스를 생성합니다.

  CREATE TEMPORARY TABLESPACE lmtemp TEMPFILE '/u02/oracle/data/lmtemp01.dbf'
       SIZE 20M REUSE
     EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;

 SIZE 의 기본값은 1M 입니다. 하지만 위 예제에서 처럼 다른 값을 넣어 만들 수 있습니다.

 Altering a Locally Managed Temporary Tablespace
 임시 파일을 추가하는 것 이외에는 LMT 방식의 임시 테이블 스페이스에서 ALTER TABLESPACE 구문을 사용할 일은 없습니다.

  ALTER TABLESPACE lmtemp ADD TEMPFILE '/u02/oracle/data/lmtemp02.dbf' SIZE 2M REUSE;
  * 임시 테이블 스페이스를 만들때는 CREATE TEMPORARY TABLESPACE 이지만
     ALTER 구문에서는 그냥 ALTER TABLESPACE 로 명명합니다.

 하지만 ALTER DATABASE 구문은 다음의 경우에 사용할 수 있습니다.

  ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' OFFLINE;
  ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' ONLINE;

  ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' RESIZE 4M;

  ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP INCLUDING DATAFILES;



 Creating a Dictionary-Managed Temporary Tablespaces
 다음 구문을 이용하여 DMT 방식의 임시 테이블스페이스를 작성할 수 있습니다.

  CREATE TABLESPACE sort
      DATAFILE '/u02/oracle/data/sort01.dbf' SIZE 50M
          DEFAULT STORAGE (
            INITIAL 2M
            NEXT 2M
            MINEXTENTS 1
            PCTINCREASE 0)
      EXTENT MANAGEMENT DICTIONARY
      TEMPORARY;



 Altering a Dictionary-Managed Temporary Tablespace
 이미 존재하는 DMT방식의 일반 테이블 스페이스를 임시 테이블 스페이스로 변환 할 수 있습니다.

  ALTER TABLESPACE tbsa TEMPORARY;




FIN.
REF) Oracle Documents.Server.920/a96521 Managing Tablespaces

2009년 9월 8일 화요일

ORACLE_016. Complete Recovery Using Archive Log Mode

Complete Recovery Using Archive Log Mode                                      

OPEN RECOVERY TO SAME DIRECTORY

 STEP 01_장애가 발생한 테이블(혹은 데이터 파일)을 OFFLINE 시킵니다.

 

                  ALTER TABLESPACE tsname OFFLINE IMMEDIATE;       OR

                  ALTER DATABASE DATAFILE 'datafilepath/datafile.dbf' OFFLINE

           

                   * OFFLINE IMMEDIATE 는 CKPT 를 발생하지 않습니다.  따라서 DBWr이

                   호출되지 않기 때문에 장애가 일어난 테이블(혹은 파일)에 기록하는 것을

                   방지할 수 있습니다.

                   * 테이블 스페이스가 들어있는 데이터 파일의 조회는 다음 쿼리를 이용합니다.

                SELECT A.FILE#, A.NAME "Datafile Name", B.NAME "Tablespace Name", status

                      FROM V$DATAFILE A, V$TABLESPACE B

                      WHERE A.TS#=B.TS#

                      ORDER BY B.NAME;

 

 STEP 02_마지막으로 풀 백업한 해당 데이터 파일을 복사합니다.

 

                 UNIX ) cp -f /Backuped_file_path/filename.dbf /target_path/target_name.dbf

                      NT ) copy /Backuped_file_path/filename.dbf /target_path/target_name.dbf

 STEP 03_복원된 파일에 ARCHIVE LOG 파일 및 REDO LOG 파일을 적용시킵니다.

 

                  RECOVER DATAFILE n  // n은 데이터파일 번호

                  * 데이터 파일의 번호는 STEP01의 예제 쿼리를 통해 확인할 수 있습니다.

 

 STEP 04_복구된 테이블 스페이스(혹은 데이터 파일)를 ONLINE 시킵니다.
      
                  ALTER TABLESPACE tsname ONLINE;           OR

                  ALTER DATABASE DATAFILE n ONLINE;

 

OPEN RECOVERY TO DIFFERENT DIRECTORY
 다른 디렉토리에 데이터 파일을 복원하는 방법은 위 방법과 동일합니다. STEP 02에서 원래 데이터 파일의 위치가 있던곳이 아닌 다른곳에 마지막으로 풀 백업된 데이터 파일을 복사합니다. 그리고 콘트롤 파일에 데이터 파일의 위치가 바뀌었음을 알려주면 됩니다.

                  ALTER DATABASE RENAME FILE '원래위치' TO '나중위치'

 콘트롤 파일에 데이터파일의 위치가 바뀌었음을 알려주었으면 그 후는 STEP 03, STEP 04를 다시 수행하시면 됩니다.

CLOSE RECOVERY (SYSTEM TABLE RECOVERY)
 SYSTEM TABLE이 들어있는 데이터 파일을 확인합니다. 위 SELECT 질의를 통해 시스템 테이블 스페이스가 들어있는 데이터 파일을 확인할 수 있습니다. 복구작업을 수행하기 전에, 데이터베이스를 다운시킵니다.

                 SHUTDOWN ABORT

 데이터베이스를 다시 MOUNT 상태로 돌립니다.
 
                 STARTUP MOUNT

 마지막으로 했던 풀 백업에서 해당 파일을 복사해 오고 LOG 파일을 적용합니다.
 
                 RECOVER DATABASE

 마지막으로 데이터베이스를 열어줍니다.

                 ALTER DATABASE OPEN;


FIN.

 

          

2009년 9월 7일 월요일

ORACLE_015.ARCHIVE LOG

ARCHIVE LOG                                                                                  
INTRODUCTION OF ARCHIVE LOG
 모든 트랜젝션(transaction)은 Online Redo Log에 기록이 됩니다. 이 기록들은 예상치 못한 데이터베이스의 오류등에 대비하여 트랜젝션을 롤백하고 최근까지 했던 작업을 자동으로 다시 수행해주는 복구 알고리즘에 있어 굉장히 중요합니다. 이러한 리두로그에 관한 정보는 다음 뷰를 이용하여 조회해 볼 수 있습니다.

 -V$LOG, V$LOGFILE, V$LOG_MEMBER

 예상치 못한 데이터 베이스의 오류에 대하여 항상 준비를 해야 합니다. 그래서 우리는 일정 주기마다 계획적으로 백업을 수행합니다. 백업의 방식 또한 다양합니다. 사용자 백업, 인크리멘탈 백업, 그리고 아카이브 로그 백업입니다(User-managed Back up, Incremental Back up and Archive log back up). 이번 포스트에서는 아카이브 로그의 설정 및 아카이브 로그모드로 DB를 수행하는 방법을 알아보겠습니다.

NOARCHIVE LOG MODE
 처음 데이터베이스 생성시 데이터베이스는 NOARCHIVE LOG 모드로 생성이 됩니다. NOARCHIVE LOG에서는 Redo log 파일이 순환 방식으로 사용이 됩니다. 즉 A로그파일이 다 채워지면 LGWr은 B로그파일에 Transaction을 기록합니다. B가 다 채워지면 다시 A에 기록합니다. 우선 리두 로그가 겹쳐 쓰여지면(재사용 되면) 마지막 전체 백업에서만 복구가 가능합니다.

 

ARCHIVE LOG MODE
 가득 찬 리두 로그 파일은 체크포인트가 일어나고 ARCn 에 의해 백업되기 전까지는 다시 사용할 수 없습니다. 콘트롤 파일의 엔트리에 Archived log file의 Sequence 번호가 기록됩니다.

 인스턴스 복구에서 데이터베이스에 일어난 가장 최근의 변화를 그대로 유지시킬 수 있으며 Archive log는 Media recovery 에서도 사용할 수 있습니다.

 
Automatic Archive
 
자동으로 아카이브를 수행하기 위해서는 다음 파라미터를 설정합니다.

                             LOG_ARCHIVE_START=TRUE

 만약 수동으로 아카이빙을 수행하려면 값을 FALSE 로 바꿔주면 됩니다. 단, 이 상태에서 아카이빙을 하지 않은채로 온라인 리두 로그파일이 가득 차게 될 경우 아카이빙을 할때까지 데이터베이스는 멈춰버립니다.

 Specifying Multiple ARCn Process
 다음의 파라미터를 통해 인스턴스가 시작될때 ARC의 갯수를 정할 수 있습니다.

                             LOG_ARCHIVE_MAX_PROCESSES

 병렬 DDL 혹은 DML 작업은 많은 수의 리두 로그 파일을 생성합니다. 단일 ARC프로세스로 이러한 프로세스를 아카이빙 하는것은 ARC에 많은 부하를 불러 일으킬 것 입니다.

 LOG_ARCHIVE_START 가 TRUE로 되어 있으면 LOG_ARCHIVE_MAX_PROCESSES에 정의된 숫자 만큼(최대 10) ARC를 가지고 인스턴스가 시작됩니다.  이 파라메터는 ALTER SYSTEM SET 구문으로 변경할 수 있습니다.

 Enabling Automatic Archiving After Instance Startup
 인스턴스를 다운하지 않고 ALTER 구문을 이용하여 자동 아카이빙 기능을 사용할 수 있습니다. 다음의 방법을 사용합니다.

                           UNIX) ALTER SYSTEM ARCHIVE LOG START TO '/ORADATA/ARCHIVE1;
                           NT)      ALTER SYSTEM ARCHIVE LOG START TO 'c:\u04\Oracle\Test\log\';
       * <-> ALTER SYSTEM ARCHIVE LOG STOP;

 
SPECIFYING THE ARCHIVE LOG DESTINATION
 아카이브 로그가 저장될 위치를 지정합니다. 다음 두가지 파라메터를 이용합니다.

                           LOG_ARCHIVE_DEST_n     //아카이브 로그가 저장될 위치. 10개까지 지정 가능
                           LOG_ARCHIVE_FORMAT  //아카이브 로그의 파일 형식

 

                          ALTER SYSTEM SET LOG_ARCHIVE_DEST_1="LOCATION=/archive1/";
                          ALTER SYSTEM SET LOG_ARCHIVE_DEST_2="SERVICE=standby_db1";

 Location & Service
 로컬 디스크의 위치에 아카이브 로그 파일을 저장할 시에는 'LOCATION' 구문을 사용합니다. 아카이브 로그 파일이 원격 DB에 있을 경우 Oracle Net Alias 를 'SERVICE' 구문을 사용하여 원격 임을 알려줍니다. 이 Alias 의 정보는 TNSNAMES.ORA 파일의 기록을 참고합니다.  최소한 한개의 LOCATION 옵션을 가진 경로를 설정해 주어야 합니다.

 Mandatory & Optional
 MANDATORY 옵션은 반드시 아카이브 로그가 성공적으로 만들어 져야 할 경우 사용합니다. OPTIONAL 은 성공적으로 만들어지지 않아도 오라클은 신경쓰지 않습니다.

  ALTER SYSTEM SET LOG_ARCHIVE_DEST_1="LOCATION=/archive1/
                                                                                           MANDATORY REOPEN";
  ALTER SYSTEM SET LOG_ARCHIVE_DEST_2="SERVICE=standby_db1
                                                                                           MANDATORY REOPEN REUSE 600";
  ALTER SYSTEM SET LOG_ARCHIVE_DEST_3="LOCATION=/archive2/
                                                                                           OPTINAL";

 
 REOPEN 옵션은 아카이브 로그 파일 생성 실패시 지정된 수의 초만큼 시간이 지난후에 아카이브 로그 파일을 재생성 하기 위한 시도를 합니다. 기본값은 300 입니다. OPTIONAL 로 지정된 것은 에러의 유무와 상관없이 진행됩니다.

 Controlling Archiving to a Destination
 지정된 LOG_ARCHIVE_DEST_n 을 활성화 시키거나 잠시 중지시킬 수 있습니다.  기본값으로는 Enable 되어 있습니다. 만약 잠시 하나의 Dest를 정지 시키고자 한다면 다음 구문을 이용합니다.
 
  ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = [ENABLE | DEFER ]


SPECIFYING A MINIMUM NUMBER OF LOCAL DESTINATIONS
 최소 성공해야할 아카이브 로그의 갯수가 몇개인지를 설정합니다. 예를 들어 2로 설정했다면 체크포인트등 로그가 스위치가 되는 이벤트가 발생하고 아카이빙이 시작됬을때, 이때 생성된 아카이브 로그 파일이 최소 두쌍이 되어야 한다는 것을 뜻 합니다. 다음 파라메터를 이용하여 설정할 수 있습니다.

  ALTER SYSTEM SET LOG_ARCHIVE_MIN_SUCCEED_DEST = 2

SPECIFYING THE FILE NAME FORMAT

  LOG_ARCHIVE_FORMAT = extention

 File Name Options
 - %s 혹은 %S : 파일 이름에 log sequence 번호를 넣습니다.
 - %t 혹은 %U : 파일 이름에 thread 번호를 넣습니다.
 - %S : 고정 길이를 사용하게 하며 빈 자리는 0으로 채웁니다.

CHANGING THE ARCHIVE MODE
 CREATE DATABASE 로 첫 데이터베이스를 만들면 기본적으로 NOARCHIVE 상태로 만들어 집니다. ALTER DATABASE 명령을 통해 상태를 변경할 수 있습니다.

 STEP 01) SHUTDOWN IMMEDIATE
 STEP 02) STARTUP MOUNT
 STEP 03) ALTER DATABASE ARCHIVELOG;
 STEP 04) ALTER DATABASE OPEN;
 STEP 05) Take a full backup of the database.

OBTAINING ARCHIVE LOG INFORMATION
 Dynamic Views
 V$ARCHIVED_LOG, V$ARCHIVE_DEST, V$LOG_HISTORY
 V$DATABASE, V$ARCHIVE_PROCESSES

 Command Line
 SQL>ARCHIVE LOG LIST;

 

FIN
REF) Oracle9i DBA Fundamental II
       

2009년 9월 3일 목요일

ORACLE_014. Understanding Access Path : Index Table Scans

Understanding Access Path : Index Table Scans                                  

INDEX SCAN

 이 방법은 구문에서 사용하는 컬럼의 인덱스를 이용하여 행을 뽑아오는 방법입니다. 인덱스 스켄은 인덱스의 하나 혹은 그 이상의 컬럼값에 기초하여 데이터를 추출합니다. 인덱스 스켄을 수행하면 구문에 사용되는 컬럼중 인덱스가 있는 컬럼이 있는지를 우선적으로 찾습니다. 인덱스가 존재하면 인덱스가 있는 컬럼 값을 인덱스에서 바로 읽어옵니다.

 인덱스는 인덱싱 된 값 뿐만 아니라 행의 Rowid도 가지고 있습니다. 따라서 인덱스된 컬럼 외에 다른 컬럼값 역시 한번에 가져올 수 있습니다.

INDEX UNIQUE SCAN
 UNIQUE 나 PRIMARY KEY 로 제약조건이 걸려있는 컬럼에 대하여 접근할때 UNIQUE SCAN을 사용합니다.

 When the optimizer Uses Index Unique Scans
 이 접근경로는 동등한 조건식에 Unique Index 가 모든 컬럼에 정의되어 있을때 사용합니다.

 Index Unique Scan Hints
 일반적으로, Unique Scan 수행시 따로 Hint절을 달 필요는 없습니다. 힌트절 INDEX(alias index_name)는 인덱스를 사용함을 결정합니다만 접근 경로까지 결정하지는 않습니다.

INDEX RANGE SCAN
 Index Range Scan 은 일반적으로 선택된 데이터에 접근하는 가장 평범한 방법입니다. 결과는 인덱스 컬럼의 오름차순으로 정렬되어 반환됩니다. 동등한 값의 여러개의 행은 rowid에 의해 오름차순으로 정렬됩니다.

 데이터가 반드시 정렬되어야 한다면 ORDER BY 구문을 이용하고 인덱스의 정렬에  너무 의지하지 마십시요. 인덱스가 ORDER BY 문에 적용될 수 있게 정렬된 상태면 옵티마이저는 인덱스 정렬을 사용합니다.

 EXAMPLE_Index Range Scan                           
 SELECT order_status, order_id
  FROM   orders
 WHERE order_date = :b1;
 

 
 상기 쿼리는 분명 선택적인 쿼리 입니다. 행을 가져오기 위해 컬럼의 인덱스를 사용하는 것을 확인 할 수 있습니다. 반환된 데이터는 order_date 컬럼의 rowid 에 의해 오름차순으로 정렬됩니다. 이는 order_date 의 인덱스 컬럼이 여기서 선택된 행들과 같기때문에 데이터는 rowid로 정렬됩니다.

 When the Optimizer Uses Index Range Scans
 옵티마이저는 다음과 같은, 쿼리의 주가 되는 조건에 인덱스가 있는 컬림이 하나 혹은 그 이상의 컬럼이 있으면 옵티마이저는 Index Range Scan을 수행합니다.

 - col1 = :b1
 - col1 < :b1
 - col1 > :b1
 - 위 조건들이 인덱스에서 주가 되는 컬럼이고 이러한 조건들의 조합

 Range Scans는 unique 혹은 nonunique 인덱스를 사용합니다. Range Scan은 인덱스 컬럼이 ORDER BY/GROUP BY 와 구성되어 있으면 정렬을 수행하지 않습니다.

 Index Range Scan Hint
 옵티마이저가 풀테이블 스켄이나 다른 인덱스를 사용하려 할때 hint절을 사용할 수 있습니다. 힌트절 HINT(table_alias index_name)은 사용할 인덱스를 정할 수 있습니다. order_id 라는 컬럼이 비대칭(skew) 분포를 이루고 있다고 가정합시다. 컬럼은 히스토그램을 가지고 있고,  옵티마이저는 그 컬럼의 분포도를 알고 있습니다. 하지만 바인드 변수(Bind Variable) 옵티마이저는 값을 알 수 없거니와 테이블 스켄을 수행할 수 있습니다. 두가지 옵션이 있습니다.

 - nonsharing SQL 동안 문제를 야기시킬 수 있는 바인드 변수를 제거하고 명확한 값을 넣으세요
 - 힌트절을 사용합니다.

 EXAMPLE_Before Using Index INDEX hint                
 SELECT l.line_item_id, order_id, l.unit_price * l.quantity
    FROM order_items
 WHERE l.order_id = :b1
 

 

 EXAMPLE_Using Bind Variable and INDEX hint                                  
 SELECT /*+ INDEX(l item_order_ix) */ l.line_item_id, order_id, l. unit_price * l.quantity
   FROM order_items l
 WHERE l.order_id = :b1


INDEX RANGE SCANS DESCENDING
 Index range scan descending 은 내림차순으로 정렬되어 데이터가 반환되는 것을 제외하고는 Index range scan과 같습니다. 기본적으로 인덱스는 오름차순으로 저장됩니다. Index range scan descending은 가장 최근의 데이터를 얻거나 특정 값보다 적은 값을 찾을때 사용합니다.

 EXAMPLE_Index Range Scan Descending Using Two-Column Unique Index                  
 SELECT line_item_id, order_id
  FROM order_items

 WHERE order_id < :b1
 ORDER BY order_id DESC;
 

 

 데이타에서 선택된 행은 order_id, line_item, rowid 에 의해 내림차순 정렬이 됩니다.

 When the Optimizer Uses Index Range Scans Descending
 order by descending 단서가 인덱스를 만족하면 옵티마이저는 index range scan descending 을 수행합니다.

 Index Range Scan Descending Hints
 힌트절 INDEX_DESC(table_alias index_name) 는 이 접근경로를 사용하는데 사용됩니다.

INDEX SKIP SCAN
 Index Skip Scan은 nonprefix 컬럼을 읽는데 인덱스의 성능을 향상시킵니다. 자주, 인덱스 블럭을 읽는것은 테이블 블럭을 읽는것 보다 빠릅니다.

 Skip Scan은 여러개의 컬럼을 가진 인덱스를 논리적으로 작게 서브인덱스로 나눕니다.  Skip Scan에서 다열 인덱스의 이니셜 컬럼은 쿼리에서 정의되지 않습니다. 즉 무시(skip) 합니다.

 수개의 논리적 서브인덱스는 이니셜 컬럼에서 중복된 값의 갯수에 의해 정의됩니다. Skip Scan은 복잡한 인덱스의 리딩컬럼에 중복되는 값이 거의 없거나 리딩컬럼이 아닌 컬럼에 많은 수의 중복된 값이 있을때 효과적입니다.

 EXAMPLE_Index Skip Scan
 Employee(sex, employee_id, address) 테이블이 다열 인덱스 (sex, employee_id) 를 가지고 있다고 가정하도록 하겠습니다. 이 인덱스는 두개의 논리 서브인덱스로 나뉩니다. 하나는 M 하나는 F.

 이 예제에서 다음의 인덱스 값을 가지고 있다고 가정합니다.
 ('F', 98)
 ('F',100)
 ('F',102)
 ('F',104)
 ('F',101)
 ('M',101)
 ('M',103)

 ('M',105)

 인덱스는 다음과 같은 두 논리 서브인덱스로 나뉩니다.

  - 첫번째 서브 인덱스는 키값을 'F'를 갖습니다.
  - 두번째 서브 인덱스는 키값을 'M'을 갖습니다.

 

 다음과 같은 쿼리에서 sex 컬럼은 무시됩니다.
 SELECT * FROM employees WHERE employee_id = 101;

 완전한 Index 스켄은 일어나지 않습니다. 하지만 'F'값을 가진 서브 인덱스가 우선 수행됩니다. 다음 'M'값을 가진 서브 인덱스가 수행됩니다.

FULL INDEX SCANS
 만약 술부(predicate)가 인덱스가 있는 하나의 컬럼만을 참조하면 Full Scan 이 일어납니다. 술부는 index driver가 필요치 않습니다. 또한 술부가 존재하지 않거나 다음 두가지의 경우 full scan을 수행합니다.

 - 쿼리에서 사용하는 모든 컬럼에 인덱스가 존재할 경우
 - 최소 하나의 인덱스 컬럼이 Null 이 아닐 경우

 Full Scan은 정렬 과정을 생략할 수 있는데 데이터가 index key에 의해 정렬되어 있기 때문입니다.

FAST FULL INDEX SCANS
 Fast full scan 은 인덱스에 쿼리에 필요한 모든 컬럼에 대한 정보를 가지고 있을때와 최소 하나의 컬럼에 NOT NULL 제약조건을 가지고 있을때 full table scan을 할지 말지를 결정해야 합니다. Fast full scan 은 테이블에 접근할 필요 없이 인덱스에서 데이터에 접근합니다. 데이터는 인덱스 키에 의해 정렬되어 있지 않기 때문에 정렬 과정을 피할 수 없습니다. Full index scan과는 다르게 다중 블럭을 읽어들여 모든 인덱스를 읽어들입니다.

 Fast full scan은 오직 CBO에서만 작동합니다. OPTIMIZER_FEATURES_ENABLE 초기화 파라메터나 INDEX_FFS 힌트를 이용하여 정의할 수 있습니다. Fast full index scan은 비트맵 인덱스(bitmap index)에 대항하여 수행할 수 없습니다.

 Fast full index scan은 일반 full index scan 보다 멀티블락 I/O를 사용할때 보다 더 빠르며 테이블 스켄처럼 병렬처리가 가능합니다.

Fast Full Index Scan Hints
 Fast Full Index Scan은 특별한 인덱스 힌트를 가지고 있습니다. INDEX_FFS. 정규 INDEX 힌트와 같은 인수와 표현식을 사용합니다.
 
Fast Full Index Scan Restrictions
 Fast full index scan은 다음과 같은 제약이 있습니다.
 - 최소 한개의 컬럼이 NOT NULL 제약조건을 가지고 있어야 합니다.
 - 병렬로 Fast full index scan을 사용하기 위해 인덱스에 parallel 단서를 달아야 합니다.
 - 인덱스를 반드시 Anlalyze 해야합니다. 그렇지 않으면 옵티마이저는 FFS를 수행하지 않습니다.

INDEX JOINS
 Index Join은 쿼리에서 참조하는 테이블의 모든 컬럼을 가지고 있는 몇몇 인덱스의 Hash Join 입니다. Index join은 테이블에 접근할 필요가 없는데, 이는 index에서 필요한 데이터를 모두 얻을 수 있기 때문입니다. 정렬 과정을 거쳐야 하며 오직 CBO에서만 수행이 가능합니다.

Index Join Hints
 OPTIMIZER_FEATURES_ENABLE 초기화 파라메터와 INDEX_JOIN힌트절을 사용할 수 있습니다.

BITMAP JOINS
 Bitmap join이란 키값을 위해 비트맵을 사용하고 rowid 에 각각의 비트를 변환하여 위치시킵니다. 비트맵은 where 단서에서 AND나 OR 같은 Boolean Operation 같은 몇몇 조건에서 인덱스를 합치는데 매우 효율적입니다.

 Bitmap Access 는 CBO에서만 가능합니다.
 *Oracle 9i Enterprise Edition 이상의 버전에서만 Bitmap Index 혹은 Bitmap join index 사용 가능

CLUSTER SCANS
 Cluster scan은 index cluster로 저장된 테이블에서 같은 클러스터 키 값을 갖는 모든 행을 얻는데 사용합니다. Index cluster 에서 같은 클러스터 키 값을 가지고 있는 모든 행은 같은 데이터 블럭안에 저장됩니다. Cluster scan 을 수행하기 위해서는 Cluster index 스케닝을 통해 얻은 한개의 행의 rowid를 획득합니다. 그후 이 rowid를 가지고 행들을 가져다 놓습니다.

HASH SCANS
 해시값을 기초로한 해쉬 클러스터에 있는 행을 가져가기 위해 사용됩니다. 해쉬 클러스터에서 해시 값이 같은 모든 데이터는 같은 데이터 블럭에 위치합니다. Hash scan을 수행하면 오라클은 해시값을  얻고, 얻은 해시값을 가지고 있는 행을 포함하고 있는 데이터 블럭을 스켄합니다.

SAMPLE TABLE SCANS
 무작위로 테이블에서 샘플 데이터를 수집합니다. FROM 단서에 SAMPLE 혹은 SAMPLE BLOCK 단서가 존재하면 이 접근방법을 사용합니다. 행단위 샘플링(SAMPLE clause)을 통한 Sample table scan을 수행하면 테이블의 일정 %만큼의 행을 읽습니다. 블럭 단위의 샘플링을 수행하면 (SAMPLE BLOCK clause), 특정 %의 테이블 블럭을 읽습니다.

 쿼리에 Join 혹은 원격 테이블이 포함되어 있따면 Sample table scan을 수행하지 않습니다.

 EXAMPLE_Sample Table Scan                                                       
 SELECT * FROM employees SAMPLE BLOCK (1);


Hints for access pat(영문)


 

FIN
REF) Oracle Documents (Server .920)/a96533 "Introduction to the Optimizer"

        Oracle Documents (Server .920)/a96533 "Optimizer Hints"

2009년 9월 1일 화요일

ORACLE_013. Understanding Access Path : Full Table Scans

Understanding Access Path : Full Table Scans                                          

FULL TABLE SCANS
 이 형식의 스캐닝 방식은 테이블에서 모든 자료를 읽어들인 후 필터를 통해 원하는 행을 얻어내는 방식 입니다. 풀 테이블 스캔이 일어나는 동안 하이워터마크(High Water Mark, HWM)밑에 있는 테이블 블록은 모두 읽혀집니다. 각각의 행은 구문의 where 절의 조건에 맞는지 확인됩니다.

 풀 테이블 스켄이 수행될때 오라클은 모든 블럭을 순차적으로 읽습니다. 이는 블럭들이 근접해 있으면, 하나의 블록을 읽어들이는 것 보다 더 많이 읽어드리기에 프로세스의 속도를 높일 수 있기 때문입니다. 한개의 블럭에서 여러개의 블럭을 읽어드리는 크기는 DB_FILE_MULTIBLOCK_COUNT 파라메터에 나타나 있습니다. 다중 블럭 읽기(multiblcok read)는 풀 테이블 스켄에서 매우 효율적 입니다. 각각의 블록은 단 한번만 읽힙니다.

WHY A FULL TABLE SCAN IS FASTER FOR ACCESSING LARGE AMOUNTS OF DATA
 풀 테이블 스켄은 테이블의 크고 조각난 블록에 접근할 경우 인덱스 범위 스켄(Index Range Scan)보다 비용이 더 싸게 먹힙니다. 풀 테이블 스켄은 큰 I/O 단위를 사용하는데 이는 작은 I/O를 여러번 호출하는 것 보다 비용이 싸기 때문이죠.

WHEN THE OPTIMIZER USES FULL TABLE SCAN
 다음의 경우에 수행합니다.

 Lack of Index
 질의(Query)가 존재하는 인덱스를 사용할 수 없으면, 풀 테이블 스켄을 수행합니다. 인덱싱된 컬럼에 펑션(function)을 사용할 경우 인덱스를 사용하지 않고 풀 테이블 스켄을 사용합니다.
  Example)
  SELECT last_name, first_name
  FROM   employees
  WHERE UPPER(last_name) LIKE :b1

  * 만약 케이스에 의존하는 검색을 수행할 경우 검색하는 컬럼에 대하여 케이스를 섞는것을 허용하지 말거나 펑션 기반의 인덱스, 예를들어 UPPER(last_name)를 만드는 것을 허용하지 마십시요. 좀더 자세한 정보를 원하시면 아래 접어놓은 내용을 참고 하세요. (영문)

 

Function-Based Index

 

 Large Amount of data
  만약 옵티마이저가 생각하기에 테이블의 대부분의 블럭을 읽어들인다 판단하면 인덱스가 존재한다 하더라도 풀 테이블 스켄을 수행합니다.

 Small Tables

  테이블의 하이워터마크 밑의 블럭이  DB_FILE_MULTIBLOCK_COUNT 에 정의되어 있는 값보다 적은 경우, 즉 단 한번의 I/O만으로 테이블을 전부 읽을 수 있는 경우 풀 테이블 스켄을 수행합니다. 이럴경우 인덱스가 존재한다고 하여도 풀 테이블 스켄을 수행합니다.

 

 High Degree of Parallelism

  고도(High Degree)의 테이블 Skew 데이터라면 옵티마이저는 풀 테이블 스켄을 수행합니다. ALL_TABLES에서 DEGREE 값을 확인할 수 있습니다.


FULL TABLE SCAN HINTS
 FULL(table_alias)를 이용하여 테이블 스켄을 강제로 할 수 있습니다.
 
 SELECT /*+ FULL(e) +/ employee_id, last_name
 FROM employees e
 WHERE last_name LIKE :b1;

ASSESSING I/O BLOCKS, NOT ROWS
 오라클은 I/O 단위로 블럭을 다룹니다. 그러므로 옵티마이저는 행의 갯수가 아닌 블럭의 사용률에 따라 풀 테이블을 할지 결정합니다. 이는 인덱스 클러스터링 값으로 불리워집니다. 하나의 블럭에 하나의 행만 존재할시 Row에 접근하는 것과 블록에 접근하는 것이 같은 소요비용이 소모됩니다.

 하지만 대부분의 테이블은 각각의 블록에 여러개의 행을 가지고 있습니다. 그러므로 여러개의 행들을 최소의 블록에 함께 클러스터링 하기를 바랍니다. 그렇지 않으면 많은 수의 블럭에 데이터들이 퍼져나갈 것 입니다.


HIGH WATER MARK(HWM) IN DBA_TABLES
 DDT(Data Dictionary Table)는 삽입된 행이 차지하고 있는 블록의 트랙을 가지고 있습니다. HWM은 풀 테이블 스켄시 끝점을 나타냅니다. HWM은 DBA_TABLES의 BLOCKS에 저장되어 있습니다. 이 값은 테이블이 truncated 혹은 drop 될시 초기화 됩니다.

 예로 과거에 많은 행을 가지고 있던 테이블이 있었다고 가정해 봅시다. 대부분의 행이 최근에 지워졌습니다. 그래서 지금은 HWM 밑의 많은 블럭들이 빈 상태입니다. 이때 풀 테이블 스켄을 수행시 HWM까지 읽어드리기 때문에 좋지 못한 성능을 내게 됩니다.

ROWID SCANS

 각 행의 ROWID는 데이터 파일에 지정되어 있으며 데이터 블록은 행과 그 행위 위치한 정보를 포함하고 있습니다. ROWID 에 의해 위치가 지정된 행은 한개의 행을 가져오는데 가장 빠른 방법입니다.

 ROWID를 이용해 TABLE에 접근하려면 오라클은 우선 WHERE 구문 혹은 하나이상 테이블 인덱스를 통해 선택된 행에 대해서 ROWID를 획득합니다. 그리고 그 행의 ROWID를 이용하여 테이블에 각각 위치시킵니다.

WHEN THE OPTIMIZER USES ROWIDS
 일반적으로 인덱스에서 ROWID를 얻어낸 후의 다음 단계입니다. 인덱스가 존재하지 않는 컬럼에 대해서도 테이블에 대한 접근이 일어날 수 있습니다. ROWID를 이용한 접근방법은 다음에 나올 인덱스 스켄이 필요하지 않습니다. 구문에 사용되는 컬럼이 모두 인덱스가 있다면 ROWID를 이용한 접근은 일어나지 않을 것 입니다.

 

FIN
REF) Oracle Documents (Server .920)/a96533 "Introduction to the Optimizer"