'Blah Blah'에 해당되는 글 25건
- 2009/06/03 Bing !? - MS Bing 검색엔진 (5)
- 2009/03/21 Oracle -Oracle 9i의 Hierarchical query의 ORDER SIBLINGS BY CLAUSE (1)
- 2009/02/05 TortoiseCVS (톨토이즈 CVS) 사용하기
- 2009/01/07 데이터베이스 - 오라클의 데이터베이스 백업
- 2008/12/29 보안 - Proxy 의 3가지 유형
- 2008/12/10 보안(원문) - SECURING YOUR UNIX SYSTEMS
- 2008/12/08 DB - SQL Server 에서 convert를 이용해 날짜 포맷팅
- 2008/12/05 파이어폭스(FireFox) 추가 기능 소개
- 2008/12/02 Packet Forwarding 하기
- 2008/11/25 DB(sql) - 25가지 SQL 작성법
Explanation &
Example
Hierarchical query를 구현할 때 ORDER BY 절을 사용하는 것은
Oracle 7.1 버젼부터 가능한 것이었다.
그러나, 순서대로 ordering되지 않고 특정 컬럼(emp table의
ename)을
기준으로 ordering하기를 원한다면 <Bulletin:10373>처럼 procedure를
작성하여야만 하였다.
그러나, Oracle 9i 에서는 ORDER BY 절 대신에 ORDER SIBLINGS BY 절을
사용할 수 있어 user-defined stored procedure를 만들 필요가 없게 되었다.
1) Ordering 하기 전의 emp table의 Hierarchical query
SQL> @a
ename EMPNO MGR
JOB
------------------------- ------ ------ ---------------
KING 7839 PRESIDENT
JONES
7566 7839 MANAGER
SCOTT 7788 7566
ANALYST
ADAMS 7876 7788 CLERK
FORD 7902 7566 ANALYST
SMITH 7369 7902
CLERK
BLAKE 7698 7839 MANAGER
ALLEN 7499 7698 SALESMAN
WARD 7521 7698
SALESMAN
MARTIN 7654 7698 SALESMAN
TURNER 7844 7698 SALESMAN
ename EMPNO MGR
JOB
------------------------- ------ ------ ---------------
JAMES 7900 7698 CLERK
CLARK 7782 7839
MANAGER
MILLER 7934 7782 CLERK
14 rows selected.
Ordering 하기 전의 a.sql 은 다음과 같다.
col ename format a25
col empno format
99999
col mgr format 99999
col job format a15
select rpad(' ',
LEVEL*5) || ename "ename", empno, mgr, job
from emp
start with
job='PRESIDENT'
connect by prior empno=mgr;
/
2) 9i의 new feature인 Hierarchical query를 사용하여
Ordering한 경우
SQL> @new_a
ename EMPNO MGR
JOB
------------------------- ------ ------ ---------------
KING 7839 PRESIDENT
BLAKE
7698 7839 MANAGER
ALLEN 7499 7698
SALESMAN
JAMES 7900 7698 CLERK
MARTIN 7654 7698 SALESMAN
TURNER 7844 7698
SALESMAN
WARD 7521 7698 SALESMAN
CLARK 7782 7839 MANAGER
MILLER 7934 7782
CLERK
JONES 7566 7839 MANAGER
FORD 7902 7566 ANALYST
ename EMPNO MGR
JOB
------------------------- ------ ------
---------------
SMITH 7369 7902
CLERK
SCOTT 7788 7566 ANALYST
ADAMS 7876 7788 CLERK
14 rows selected.
Ordering하기 위해 사용한 new_a.sql 은 다음과 같다.
col ename format a25
col empno format
99999
col mgr format 99999
col job format a15
select rpad(' ',
LEVEL*5) || ename "ename", empno, mgr, job
from emp
start with
job='PRESIDENT'
connect by prior empno=mgr
order siblings by
ename;
/
HIERARCHICAL QUERY DATA의 SORT와
ORDERING
ORACLE 6에서의 HIERARCHICAL QUERY에서는 SORT를 하기 위한 ORDER BY 절을
사용
할 수 없었다. 그러나, ORACLE 7.1이상 VERSION에서는 USER-DEFINED STORED
PROCEDURE를
이용하여 HIERARCHY 순서로 출력되면서 ORDERING할 수 있게 되었다.
세계의 지역에 관한 자료를 예로 보자.
CREATE TABLE UNIVERSE
( PARENT
VARCHAR2(30) REFERENCES UNIVERSE,
NAME VARCHAR2(30) PRIMARY KEY );
REM SOME TEST DATA
INSERT INTO UNIVERSE VALUES (
NULL, 'WORLD' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'EUROPE' ) ;
INSERT INTO UNIVERSE VALUES ( 'EUROPE', 'ENGLAND' ) ;
INSERT
INTO UNIVERSE VALUES ( 'EUROPE', 'THE NETHERLANDS' ) ;
INSERT INTO
UNIVERSE VALUES ( 'EUROPE', 'GERMANY' ) ;
INSERT INTO UNIVERSE VALUES
( 'WORLD', 'ASIA' ) ;
INSERT INTO UNIVERSE VALUES ( 'ASIA', 'JAPAN' )
;
INSERT INTO UNIVERSE VALUES ( 'ASIA', 'CHINA' ) ;
INSERT
INTO UNIVERSE VALUES ( 'WORLD', 'AMERICA' ) ;
INSERT INTO UNIVERSE
VALUES ( 'AMERICA', 'UNITED STATES' ) ;
INSERT INTO UNIVERSE VALUES (
'AMERICA', 'MEXICO' ) ;
INSERT INTO UNIVERSE VALUES ( 'WORLD', 'AFRICA'
) ;
INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'EGYPT' ) ;
INSERT INTO UNIVERSE VALUES ( 'AFRICA', 'MOROCCO' ) ;
위의 자료를 다음과 같이 보고자 하는 경우
WORLD
AFRICA
EGYPT
MOROCCO
AMERICA
MEXICO
UNITED STATES
ASIA
CHINA
JAPAN
EUROPE
ENGLAND
GERMANY
THE
NETHERLANDS
만약,ORDER BY절이 없이 QUERY하면
SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE
CONNECT
BY PRIOR NAME = PARENT START WITH PARENT IS NULL;
다음과 같은 결과를 얻게 된다.
WORLD
EUROPE
ENGLAND
GERMANY
THE NETHERLANDS
ASIA
JAPAN
CHINA
AMERICA
UNITED STATES
MEXICO
AFRICA
EGYPT
MOROCCO
만약, 위 문장에 ORDER BY 절을 사용하면
SELECT RPAD( ' ', LEVEL * 5 ) || NAME FROM UNIVERSE
CONNECT BY PRIOR NAME = PARENT START WITH PARENT IS NULL
ORDER BY NAME;
다음과 같은 원치 않는 결과를 얻게 된다.
AFRICA
AMERICA
ASIA
CHINA
EGYPT
ENGLAND
EUROPE
GERMANY
JAPAN
MEXICO
MOROCCO
THE NETHERLANDS
UNITED STATES
WORLD
7. 1이상 VERSION에서는 다음과 같이 USER DEFINED FUNCTION을 이용하여
원하는 자료를 얻을 수 있다.
CREATE OR REPLACE FUNCTION UNIVERSESORTORDER( PKEY
UNIVERSE.NAME%TYPE )
RETURN VARCHAR2 IS
PATH
VARCHAR2(2000);
BEGIN
PATH := PKEY;
-- INSERT
ALL PREVIOUS PARENT RECORDS LIKE A DIRECTORY STRUCTURE
-- E.G.
WORLD/EUROPE/...
FOR CREC IN ( SELECT PARENT FROM UNIVERSE
CONNECT BY PRIOR PARENT = NAME
START WITH NAME = PKEY ) LOOP
PATH :=
CREC.PARENT || '/' || PATH;
END LOOP;
RETURN PATH;
END;
/
SELECT SUBSTR( RPAD( ' ', LEVEL * 5) ||
NAME, 1, 40) "THE UNIVERSE"
FROM UNIVERSE
CONNECT BY PRIOR
NAME = PARENT
START WITH PARENT IS NULL
ORDER BY
UNIVERSESORTORDER( NAME ) ;
DOWNLOAD : http://www.tortoisecvs.org
TortoiseCVS 시작하기
TortoiseCVS 설치를 하면 윈도우 탐색기 탑 메뉴와 오른쪽 마우스를 이용한 팝업 메뉴를 통해 접근할 수 있다.



TortoiseCVS로 저장소에 존재하는 모듈 체크아웃하기
이미 존재하는 저장소에 존재하는 모듈을 체크아웃으로 가져온다.

프로토콜, 서버, 저장소 패스, 사용자 계정을 입력하고 저장소에 있는 모듈 목록을 가져온다.

로그인 인증을 위해 패스워드를 입력한다.

가져온 모듈 목록에서 체트아웃 하고자 하는 모듈을 선택한다.

CVS 저장소에서 해당 모듈의 소스를 모두 받아 로컬 폴더에 업데이트 한다.

정상적으로 수행이 완료되면 받아온 모듈이 아래와 같이 표시가 된다.

TortoiseCVS로 소스 변경 후 저장소에 커밋하기
작업하고자 하는 소스를 일반 편집기를 사용해서 편집을 한다.

기존 소스에 신규 메소드를 추가한 모습입니다.

소스 수정 후 저장을 하면 아래와 같이 아이콘 모양이 바뀌고 수정된 파일임을 나타냅니다. 참고로, X 모양의 아이콘은 .bak 등의 임시파일은 CVS 관리를 하지 않음을 나타냅니다.

파일의 상태에 따라 메뉴가 변경된 모습입니다. 소스비교 메뉴를 통해 수정한 파일과 현재 CVS에 등록된 소스와 내용 비교를 해봅니다.

소스 변경된 내용을 보여줍니다.

소스비교는 TortoiseCVS 설정에서 등록한 외부 프로그램을 통해 볼 수 있습니다. UltraCompare 나 WinMerge 와 같은 소스비교 프로그램이 있습니다.

수정한 소스가 정상적이라면 Commit 을 통해 CVS 저장소에 신규 소스를 반영을 합니다.

Commit 을 하기 전에 변경 내용에 대한 설명을 붙이는 습관을 들입니다.

수정한 소스가 정상적으로 CVS에 최종 수정본이 됩니다. ( 1.1 --> 1.2 )

수정한 소스에 대해 아이콘이 녹색으로 바뀌고, CVS 저장소의 최종본과 다름이 없음을 나타냅니다.

TortoiseCVS로 소스 변경 히스토리 보기
소스에 대한 변경 히스토리를 봅니다.

해당 소스에 대한 현재까지의 변경 내역을 보여줍니다.

소스 변경 내역을 그래프 형태로 봅니다.

소스의 리비전 번호와 기타 브랜치 및 버전 태그를 보여줍니다.

TortoiseCVS로 변경된 소스 업데이트하기
여러 개발자 간의 작업으로 소스가 다른 개발자에 의해 수정된 경우, 소스 작업 전에 변경 히스토리를 항상 먼저 확인해 본다.

다른 사용자에 의해 소스 변경이 일어나 로컬의 소스와 저장소의 소스 리비전 번호가 다른 모습입니다. 현재 로컬에는 1.2 이고 저장소는 1.3 으로 변경이 일어났습니다.

업데이트 명령을 통해서 로컬 파일을 최근 소스로 갱신합니다. 이 부분에서 소스 비교를 할 수 있는 메뉴가 없는게 좀 아쉽네요. 이클립스에서는 모든 리비전된 소스를 서로 비교해 볼 수 있습니다.

정상적으로 업데이트가 이루워졌습니다.

편집기를 통해 소스를 확인해 본 보습입니다.

TortoiseCVS로 저장소에 신규 모듈 추가하기
로컬에서 작업중인 프로젝트를 CVS 저장소에 신규 모듈로 등록하려면, 프로젝트 디렉토리 안에서 모듈생성 메뉴를 선택한다.

등록할 CVS 저장소를 선택하고, 생성할 모듈명을 지정한다.

정상적으로 모듈 생성이 완료 되었습니다.

정상적으로 모듈이 생성이 되면 아이콘 모양이 바뀐다. ? 모얃의 아이콘은 모듈이 생성이 됐지만, 아직 저장소에 소스가 추가되지 않았음을 의미합니다.

추가할 파일이나 디렉토리를 선택한 후 CVS 저장소에 추가한다. 해당 디렉토리에 포함된 모든 파일들도 같이 추가할 수 있다. 이때 실제로 파일이 CVS에 업로드 되는 것이 아니라 추가정보만을 가집니다. 실제 서버로의 업로드는 Commit 명령만을 통해서 할 수 있습니다.

정상적으로 디렉토리가 추가된 모습입니다.

추가 등록이 완료되면 아이콘 모양이 바뀝니다.

최종적으로 Commit 명령을 통해 파일을 CVS 저장소에 올립니다.

"복구에
실패한 DBA는 용서받을 수 있어도, 백업에
실패한 DBA는 용서받을 수 없다"
이
길을 들어서서 제일 먼저 사수에게 들었던 전설과 같다는 말이다.
아무리
시스템의 성능이 고도화되고, 성능개선을 위해 숱한 시간을 허비했어도,
다음날 출근했을 때 어제의 작업, 심지어 그동안의 모든 작업이 허사가 되도록 시스템이
주저앉아버린다면 아무런 소용도 없게 된다.
본
문서는 ORACLE사의 RDBMS를 사용하는 사용자 및
운영자들이 적절한 수준에서 백업전략을 수립하고, 이에 맞는 복구전략을 숙지할 수 있도록 가이드를 하는
목적으로 작성하게 되었다.
본
장은 일반적인 데이터베이스 백업전략에 대해 정리해 보았다.
1.
DATABASE-데이터베이스 백업
1.1 백업의 개요 및 목적
데이터베이스 백업이라 함은 기간시스템의 장애가 발생할 경우 이를 복구하기 위한
“보험”과 같은 개념이다.
관계형 데이터베이스를 사용하는데 있어서 가장 큰 장점중의 하나는 데이터베이스의 이상 발생시 언제든지 데이터베이스 RECOVERY를 수행하여 현재의 상황으로 복구할 수 있다는 점이다.
이러한 복구가 가능하기 위해서는 데이터베이스 관리자는 복구가 가능한 상태로 데이터베이스를 운용하여야 한다. 예를 들어 사용자가 NO ARCHIVE MODE로 운용할 경우에는
불행히도 데이터베이스를 처음 생성한 시점이나 전체 백업 받은 시점으로만이 복구가 가능하기 때문이다.
일반적인 경우 백업 정책이 없이 무작정 과다한 양의 백업을 받을 경우 일정 기간이
경과하면 백업에 대한 의미가 희미해지게 되고 정상적인 작업을 수행하지 않을 때, 백업파일이 꼭 필요한
경우 작업을 할 수 없는 경우가 발생할 수도 있다.
데이터베이스 관리자는 백업에 대한 정책을 수립하여 꼭 필요한 데이터를 최소의
약으로 백업을 받고 최소의 시간을 소비- 고객의 MTTR(MEAN
TIME TO RECOVERY)을 만족할 수 있는 시간-하면서도 항시 복구가 가능한
상태를 유지하여야 한다.
1.2 주요 고려사항
데이터베이스는 기존의 파일시스템과는 달리 전체 사용자 OBJECT를 하나의 TABLESPACE로 관리하거나 필요에 따라
나누어 사용 및 관리하므로 백업뿐 아니라 복구 시에도 상당히 주의를 요한다. 만일 ARCHIVE LOG 상태에서 운용하고 있는 상태에서 이상이 발생할 경우 복구작업에 필요한 LOG FILE중에 하나의 파일이라도 없어지거나 사용할 수 없는 경우에는 정상적인 복구가 불가능하게
된다.
이러한 불행한 경우를 방지하기 위해서
DBA는 항시 복구가 가능한 상태로 작업하기 위한 백업정책을 수립하여 정확하게 작업하여야 한다.
또한 24 X 7(1년 365일) DOWN TIME없이 운용되는 시스템의 경우 백업 정책의
수립에 COLD BACKUP과 같은 FULL IMAGE
백업이 불가능 할 수 있기에 HOT BACKUP 혹은
EXPORT를 통한 LOGICAL 백업만이 가능할 수 있다. 이런 제약사항으로 인해 혹시 발생할 수 있는 장애에 적절한 대응을 하지 못할 수 있다.
이러한 결정상황을 파악하여 백업정책 수립에 심혈을 기울여야 할 것이며 , 시스템 운용의 묘를 살려야 할 것이다.
또한 HOT BACKUP등의 ONLINE상에서 데이터베이스를 백업하기 위해서는 반드시 ARCHIVE
MODE로 운영되어야 한다.
1.3 백업 전략
DBA가 어떠한 방법으로 백업을 유지하느냐에 따라 복구 성공률이나 복구 속도 등이
결정된다 물론 매일 작업 종료 후 전체 데이터베이스에 대하여 FULL BACKUP을 한다면 가장
안전한 백업이라고 볼 수 있으나 실질적으로 백업을 받는데 많은 시간을 요구하므로 현실적으로는 불가능한 작업이라 볼 수 있다.
예 : XXX시스템의 특징은 24시간 365일 무중단 운영을 원칙으로 하고 있고, 타 시스템과의 INTERFACE 대상의 DATA LOAD가 야간에 대량으로 발생하며, 정산 및 온라인
통계작업을 통한 대량의 TRANSACTION이 발생한다.이는 다시 말해 COLD BACKUP을 위한 시스템 중단이 사실상
불가능하다는 말과 같다.
이런 시스템의 특성을 반영한 백업시스템 정책은 현실적으로 적용 가능한 HOT BACKUP을 업무가 집중하지 않는 시간에 수행하는 것으로 정하여야 하며, 단위 업무별로 대량의 변화가 발생할 경우에 데이터의 수정 혹은 삭제,
변화가 발생하기 전에 각 단위 팀의 별도 APPLICATION을 통해 데이터 BACKUP을 수행하는 것으로 한다.
가.
업무수행에 지장을 받지 않는
시간대에 HOT BACKUP을 수행한다.
나.
업무변화가 대량으로 발생하기
전에 APPLICATION을 통한 BACKUP수행
다.
자주 read-write되는 tablespace는 자주 online backup을 수행.
라.
데이터베이스에 구조적인 변화가
생기기 前,後로 full
backup을 수행.
마.
이전의 backup본을 최소한 2본 이상 가지고 있을 필요가 있다.
바.
특정 테이블들에 대한 data의 입력 오류로 인해 과거 특정 시점으로의 회귀가 필요하거나,
특정 테이블 데이터의 분실로 인해 다시 복귀를 하고자 할 경우를 대비하여 Logical
Backup인 Export를 수시로 받아놓도록 한다.
사.
Unrecoverable로 Creation된 Object는 redo log file에 logging되지 않기에 이러한 Object들에 대해서는 Export Utility를 사용하여 Backup하도록 하는 것이
좋으며, 초기 생성 후 정상적인 데이터 입력/수정이
이루어질 경우에는 logging으로 변경하도록 한다.
1.4 백업 방법
1.4.1 Physical
Backup
물리적인 데이터베이스 파일을 한 위치에서 다른 위치로 COPY하는 물리적인 복제를 Physical Backup이라
한다. 또한 Physical Backup은 Offline, Online Backup(Without Archiving / With Archiving)으로
나눌 수 있다. 즉 데이터베이스 상태가 Down인
상황에서 Backup을 수행하면 Offline
Backup이며 이 백업은 Archive Log파일의
Backup은 불필요하나, 데이터베이스가
Online인 상황에서 Backup을 수행하는 Online
Backup인 경우에는 Backup도중에도
Transaction이 발생할 수 있고, 이 기간 중에 발생한 데이터의 보존을
위해 Archive Log를 반드시 백업하고 있어야 한다.
1.4.1.1 Cold Backup (Offline
Backup)
데이터베이스를 Shutdown 한 이후
아래와 같은 파일들을 백업 Library로 COPY하여야
한다.
가. DataFiles
(V$datafile확인자료)
나. Redo Log Files
(V$logfile확인자료)
다. Control Files
(V$controlfile확인자료)
라. Parameter
Files(initSID.ora, spfileSID, configSID.ora, etc)
1.4.1.2 HOT Backup(Online
Backup)
데이터베이스가 구동중인 상태에서
datafile을 복사하는 방식으로 Archive Log Mode로 운영되어야
한다.
SQL> ALTER TABLESPACE …… BEGIN
BACKUP;
$ *.DBF의 COPY수행
SQL> ALTER TABLESPACE …..
END BACKUP;
이런 명령을 수행하는 기간 동안에는 해당
TABLESPACE가 HOTBACKUP MODE로 운영중이어서 해당 TABLESPACE안에 있는 TABLE에 대한 DML이 발생할 경우 DATAFILE WRITE가 불가능하기
때문에 REDO LOG에만 기록하는 기록하게 되고, 백업이
완료된 시점에서 LOG에 저장된 변경사항을 다시 Data
file에 기록하기 위해 적지 않은 부하가 발생할 수
있다. 그러므로 ONLINE HOT BACKUP을 수행하는
시간은 작업량이 적고, 사용자의 접근을 최소화 할 수 있는 시간을 선정하여야 하며, 최소한의 시간에 HOT BACKUP을 수행할 수 있어야
한다.
또한
BACKUP의 시작과 끝에는 HOT BACKUP의 시작 바로 전까지 발생한 TRANSACTION의 REDO LOG를 CHANGE하도록 하여 ARCHIVING하도록 한다.또한 BACKUP이 종료한 후에도
LOG CHANGE를 하도록 하여 BACKUP중에 발생한
DATA에 대한 REDO LOG 내 변경분을
DATAFILE에 기록 및 ARCHIVING을 통한
ARCHIVE FILE BACKUP을 동시에 수행할 수 있도록 하여야 한다.
SQL> ALTER SYSTEM ARCHIVE LOG
CURRENTS;
1.4.2 Logical
Backup
Export Utility를 이용한 데이터 백업은 보통 DML
발생빈도가 높아 데이터블록의 활용도나 Capacity를 높이지 못할 경우 데이터블록을
최적화하기 위해 사용할 수 있고, 사용자의 실수 혹은 구조상의 문제로 인해 데이터의 손실을 최소화하기
위해 데이터의 보존을 목적으로 사용하는 방법이다.
Export
Utility를 이용한 데이터 백업방법은 Full, User, Table단위의 Export Mode가
있다.
1.4.3 Archive Log File의
Backup
1.4.3.1 Archive Log Mode 구조
오라클에서 Online Backup을
받거나 완벽한 복구작업을 수행하기 위해서는 데이터베이스를 “Archive Log Mode”로
운영하여야 한다.
오라클의 log File기록방법은
“순환”기록방법을 채택하고 있다. 첫 번째 log File을 기입하고 나면 두 번째 것을
기입하고, 그것이 끝나면 세 번째 log를
기록한다. 그리고 마지막 Online Redo Log
File을 쓰고 나면 Log Writer(LGWR)가 첫번째 Log File을 다시 선택하여 덮어쓰기 시작한다.
Oracle Archive Log Mode에서 작동하고 있을 때에는 Archive Background Process(ARCH)는 각각의 Redo Log File을 덮어쓰기 전에 그에 대한 복사본을 지정된 디렉토리에 만들게 된다.
CheckPoint가 발생할 때 까지는 Redo Log
File은 재사용되지 않으며 ARCH에 의해 물리적으로
Redo Log File은 다시 backup된다.
1.4.3.2
Archive Mode와 No-Archive Mode의 비교
위 그림에서 보는 바와 같이 Redo
Log가 덮어 쓰이기 시작하고 Archive Mode가 아니면 Media Recovery는 마지막으로 Full Backup받은
시점으로 밖에 복구가 불가능 하다. 반면에 Archive
Mode로 운영되는 데이터베이스는 가장 나중의 변화까지도 복구가 가능하다. Archive Log
Mode로 운영 시 log_archive_dest Directory밑에 Archive File이 계속 발생하여 할당된 Space가 부족할
경우 log Change가 발생하지 않아 데이터베이스가
Hang-Up이 될 수 있으므로 Space관리를 유의하여야 한다.
1.4.3.3 Archive Log의 백업
데이터베이스 백업주기 결정시 archive
log의 backup주기도 결정되어야 한다.
Archive
log는 O/S Backup
을 통해 보관하고, Archive Log가 너무 많이 발생하지 않도록 Archive Log의 Size 즉
Redo Log의 사이즈를 적절히 조절하여야 복구를 위한 필요시간을 줄일 수 있다.
Archive Log는 데이터베이스 백업수행과는 별도로
Space의 여유분을 Check하여 일정수치 이상 Free
Space가 부족할 경우 자동적으로 Copy한 다음 삭제하도록 스케쥴링하여야
한다.
1.5 백업 주기
1.5.1 백업주기의 결정
백업의 주기 및 백업 시기, 시간은 어떠한 백업방법을 적용할 것인가와 어느 정도의 Down
Time을 허용할 것인가에 따라 결정된다.
즉
Hot Backup만을 허용하는 사이트에는 Transaction양이 최소화되는 시간을
선택하여 백업을 수행할 것이고, 시스템을 사용할 수 없는 최대한의 시간을 1~3시간으로 선정었다면 복구를 위해 주어진 시간이 1~3시간으로
판단되어 이에 맞는 백업주기가 결정되게 된다.
전체 시스템을 모두 Backup하는데 걸리는 시간을 산정하여야 한다. 예를 들어 전체
시스템을 Hot Backup하는데 걸리는 시간이 최대
3시간이 걸린다 할 경우 이를 3일 주기로 전체시스템을 백업할 수 있도록 나눈다면 하루에
백업에 소요되는 시간은 대략 1시간이 될 것이다.
그런데
3일 주기로 백업의 한 사이클이 종료되는 관계로 월요일에 백업한 테이블스페이스에 속한 데이터파일에 문제가 생긴 시기가 수요일
오후라면 약 이틀간 발생한 Archive Log를 이용하여 복구를 하여야 하는데 DataFile, Archive Log Restore 및 복구를 마치는데 주어진
Down Time안에 해결할 수 있는지 판단하여야 한다.
일반적으로 백업의 주기는 1년,1분기,1월,1일에 두고
주기 및 방법을 정한다. 또한 백업의 주기 뿐 아니라 백업한 Media의 보관
주기 또한 백업 및 복구에 큰 영향을 미치는 요소이다.
1.5.2 백업 주기 별 대상 결정
백업의 주기(일단위,주단위,월단위,분기단위,년단위,기타)별로 백업
대상을 선정하여 백업 매체를 선정하고, 백업대상을
LIST-UP한 다음 백업하도록 한다.
|
요일
대상 |
월 |
화 |
수 |
목 |
금 |
토 |
일 |
|
백업대상 |
A |
B |
C |
D |
E |
F |
ALL TBS |
|
백업사이즈 |
354G |
296G |
338G |
354G |
296G |
338G |
998G |
1. Transparent
이 종류의 프록시는 웹 요청 시도시 서비스요청 헤더 부분에 client의 IP를 함께 포함합니다.
이 때문에 서버에서는 서비스요청을 시도하는 클라이언트가 보내는 패킷의 헤더를 검사하면,
충분히 client의 IP를 추적할 수 있습니다.
헤더 포함 내용: 프록시 서버 종류, client 실제 IP
분석된 헤더를 살펴보면, "Via:" 부분이 바로 프록시 서버의 종류를
뜻하는 것이고,
"X-Forwarded-For:" 부분 다음 부터가 client의 실제 IP를 뜻합니다.
이와 같이 Transparent type proxy는 추적하기가 쉽다는 장점이 있습니다.
참고로, 기존에 존재하고 있는 대부분의 프록시 추적 프로그램이 바로 이 Transparent
역추적 위주의 소프트웨어 입니다.
2. Anonymous
이 종류의 프록시는 client의 IP를 완벽하게 숨기지만, 프록시를 사용 중이라는 표시를 헤더에
포함합니다. 예를 들면, 프록시 서버의 종류만
나타나고, 실제 client의 IP는 헤더에 포함하지
않습니다. 바로 이 anonymous type proxy
부터, 역추적에 많은 어려움을 겪습니다.
헤더 포함 내용: 프록시 서버 종류
위와 같이 요청 헤더에 Via 코드만 포함됩니다.
이 때문에 서버에서 요청 패킷을 캡쳐한다해도, 역추적이 불가능합니다.
3. High anonymous
이 종류의 프록시는 client의 IP 뿐만아니라, 프록시를 사용 중이라는 표시 조차되지 않습니다.
헤더는 일반 client 접속과 동일하게 작성되며, 서버에서 요청 패킷을 캡쳐해도 일반 client
패킷과 전혀 구별되지 않습니다. 이 때문에 현재 기술력으로 서버는 high anonymous type proxy
사용자와 일반 client 사용자를 전혀 구별해낼 수 없습니다.
헤더 포함 내용: 없음
요청 헤더에는 일반 client 접속과 구별할만한 포함 내용이 존재하지 않으므로 역추적이
불가능합니다.
이렇게 프록시 종류의 3가지를 알아본 이유는, 현재
기술적으로 역추적이 가능한 프록시가
매우 적다는 현실을 알리기 위해서 입니다.
이 3가지 프록시 종류를 완벽하게 파악하고 있는 해커나 전문가, 엘리트 사용자들은 완벽한
익명성을 이용해 인터넷상을 활보하고 있습니다. 하지만 정작 접속해오는 사용자들을 분석하여
로그에
기록하는 서버는 이러한 사실 조차 구분하지 못하며 공격에 시달리고, 악의적인 게시물, 스팸 공격을
받고 있는 것이 현실입니다.
- White Papers
- UNIX Password Security
- Password Security: A Case History
- Securing RedHat Linux | Solaris
- A Comaparison of the Security of Windows NT and UNIX
- Linux Security Quick Reference Guide
- Improving the security of your UNIX system
- Securing and Optimizing Red Hat Linux
- Solaris Security: Recommendations from SANS Step by Step
- Site Security Handbook - rfc1244 | rfc2196
- Guidelines for the Secure Operation of the Internet
- Solaris Operating Environment Security
- Rapid Recovery Techniques for Solaris Operating Environment
- Disaster Recovery Analysis Form
- Solaris Operating Environment Network Setting for Security
- UNIX System Security Checklist
- X Window Security
- UNIX Configuration Guidelines - from http://www.cert.org
- Tools
- John the Ripper
- John the Ripper is a password cracker, currently available for UNIX, DOS, Win32. Its primary purpose is to detect weak UNIX passwords.
- L0phtCrack
- Password Auditing and Recovery Application
- exec.c
- exec.c 1.0.4 is a kernel module which logs all the commands executed on the system. Extremely powerful stealth logging made easy! Changes: This release fixes a memory allocation problem. Please update to the current version if you use the module. This module should work on 2.2.* kernels. By Pat Szuta
- Virtual FTPD
- Virtual FTPD v6.4 is a secure FTP daemon which is derived from the OpenBSD ftp daemon and can allows virtual FTP accounts which do not have an /etc/passwd entry. For more information, here.
- Snoopy
- Snoopy is designed to log all commands executed by providing a transparent wrapper around calls to execve() via LD_PRELOAD. Logging is done via syslogd and written to authpriv, allowing secure offsite logging of activity. Changes: Integrity checking, a new method of logging, and faster logging.
- FPF
- FPF is a lkm for Linux which changes the TCP/IP stack in order to emulate other OS's TCP fingerprint. The package contains the lkm and a parser for the nmap file that let you choose directly the os you want. For more information, here.
- Imsafe
- Imsafe is a host-based intrusion detection tool for Linux which does anomaly detection at the process level and tries to detect various type of attacks. Since Imsafe doesn't know anything about specific attacks, it can detect unknown and unpublished attacks or any other form of malicious use of the monitored application. Created for Linux systems but works on almost every UNIX flavor by watching strace outputs. Screenshots available here. Warning: Still in alpha. For more information, here.
- IPtrap
- IPtrap listens to several TCP ports to simulate fake services (X11, Netbios, DNS, etc) . When a remote client connects to one of these ports, his IP address gets immediately firewalled and an alert is logged. It runs with iptables and ipchains, but any external script can also be launched. IPv6 is supported. Changes: Logging the scanned port, and no more iptables/ipchains zombies. For more information, here.
- LOMAC
- LOMAC is a security enhancement for Linux that uses Low Water-Mark Mandatory Access Control to protect the integrity of processes and data from viruses, Trojan horses, malicious remote users, and compromised root daemons. LOMAC is implemented as a loadable kernel module - no kernel recompilations or changes to existing applications are required. Although not all the planned features are currently implemented, it presently provides sufficient protection to thwart script-kiddies, and is stable enough for everyday use. Whitepaper available here. Manual available here. Changes: Added mediation of directory modification operations, improving protection. here.
- Maxty
- Maxty is a small kernel-space tty sniffer. It is a LKM which will attach to read/write syscalls and save incoming/outgoing requests to opened tty devices into separate log files. It provides a way keeping a track what is happening on virtual consoles similar to a keystroke recorder.
- John the Ripper
- Links
http://www.sqlusa.com/bestpractices2005/centurydateformat/
SQL Server 에서 convert를 이용해 datetime 포맷팅 스타일 값들
내가 원하는 포맷은 yyyy/mm/dd hh:mm:ss 인데...
지금은 111, 108 style을
이용해서 얻는데, 한방에 되는 방법은 없는건가?
How to sql format datetime with century?
The following conversion options are available for sql datetime format
with century:
select
convert(char, getdate(), 100) --mon dd yyyy hh:mmAM (or PM)
select convert(char, getdate(), 101) --mm/dd/yyyy
select convert(char, getdate(), 102) --yyyy.mm.dd
select convert(char, getdate(), 103) --dd/mm/yyyy
select convert(char, getdate(), 104) --dd.mm.yyyy
select convert(char, getdate(), 105) --dd-mm-yyyy
select convert(char, getdate(), 106) --dd mon yyyy
select convert(char, getdate(), 107) --mon dd, yyyy
select convert(char, getdate(), 108) --hh:mm:ss
select convert(char, getdate(), 109) --mon dd yyyy hh:mm:ss:mmmAM (or PM)
select convert(char, getdate(), 110) --mm-dd-yyyy
select convert(char, getdate(), 111) --yyyy/mm/dd
select convert(char, getdate(), 112) --yyyymmdd
select convert(char, getdate(), 113) --dd mon yyyy hh:mm:ss:mmm
select convert(char, getdate(), 114) --hh:mm:ss:mmm(24h)
select convert(char, getdate(), 120) --yyyy-mm-dd hh:mm:ss(24h)
select convert(char, getdate(), 121) --yyyy-mm-dd hh:mm:ss.mmm
|
Without century (yy) (1) |
With century (yyyy) |
Standard |
Input/Output (3) |
|
- |
0 or 100 (1, 2) |
Default |
mon dd yyyy hh:miAM (or PM) |
|
1 |
101 |
|
mm/dd/yyyy |
|
2 |
102 |
ANSI |
yy.mm.dd |
|
3 |
103 |
British/French |
dd/mm/yy |
|
4 |
104 |
German |
dd.mm.yy |
|
5 |
105 |
Italian |
dd-mm-yy |
|
6 |
106 (1) |
- |
dd mon yy |
|
7 |
107 (1) |
- |
Mon dd, yy |
|
8 |
108 |
- |
hh:mi:ss |
|
- |
9 or 109 (1, 2) |
Default + milliseconds |
mon dd yyyy hh:mi:ss:mmmAM
(or PM) |
|
10 |
110 |
|
mm-dd-yy |
|
11 |
111 |
|
yy/mm/dd |
|
12 |
112 |
ISO |
yymmdd |
|
- |
13 or 113 (1, 2) |
|
dd mon yyyy
hh:mi:ss:mmm(24h) |
|
14 |
114 |
- |
hh:mi:ss:mmm(24h) |
|
- |
20 or 120 (2) |
ODBC canonical |
yyyy-mm-dd hh:mi:ss(24h) |
|
- |
21 or 121 (2) |
ODBC canonical (with
milliseconds) |
yyyy-mm-dd hh:mi:ss.mmm(24h) |
|
- |
126 (4) |
ISO8601 |
yyyy-mm-ddThh:mi:ss.mmm (no
spaces) |
|
|
127(6, 7) |
ISO8601 with time zone Z. |
yyyy-mm-ddThh:mi:ss.mmmZ (no spaces) |
|
- |
130 (1, 2) |
Hijri (5) |
dd mon yyyy hh:mi:ss:mmmAM |
|
- |
131 (2) |
Hijri (5) |
dd/mm/yy hh:mi:ss:mmmAM |

파이어폭스에서
'인라인자동완성' 기능 사용하기
익스플로러에 '인라인자동완성' 기능과 같은 기능을 파이어폭스에서 써보자-
파이어폭스에는 없어서 의아해 했는데 있더군요.
1. 주소에 about:config 를 입력
2. 필터에 browser.url 을 입력
3. browser.urlbar.autoFill 항목을 더블클릭 해서 true로 변경
4. 브라우저를 재시작 할 필요 없이 바로 적용
됨
익스플로러에 '인라인자동완성' 기능과 같은 기능을 파이어폭스에서 써보자-
파이어폭스에는 없어서 의아해 했는데 있더군요.
1. 주소에 about:config 를 입력
2. 필터에 browser.url 을 입력
3. browser.urlbar.autoFill 항목을 더블클릭 해서 true로 변경
4. 브라우저를 재시작 할 필요 없이 바로 적용 됨
파이어폭스에서 'Color Management' 설정하기
sRGB만 사용하게 초기설정이 되어 있으나, 'Color Management' 기능을
사용하게 되면, 파이어폭스의 색 표현력을 더 좋게 합니다.
1. 주소에 about:config 를 입력
2. 필터에 gfx.color_management.enabled 을 입력
3. gfx.color_management.enabled 항목을 더블클릭 해서 true로 변경
4. 브라우저를 재시작 해야 적용
파이어폭스에서 '스크롤속도' 빠르게 하기
파이어폭스는 익스플로러와는 다르게 스크롤속도가 조금 느리다.
알고보면, 스크롤속도가 디폴트값이 1로 되어있는데 이것을 수정하면
1. 주소에 about:config 를 입력
2. 필터에 mousewheel.withnokey.numlines 입력
3. 초기값 1에서 10정도 변경
4. 필터에 mousewheel.withnokey.sysnumlines 입력
5. ture -> false로 변경
ARP SPOOFING공격을 하기 위해서 필수적으로 Packet Forwarding이 필요하다.
헌데 그동안 이 방법을 모르고 해매고 있었다 .. ㅠ
원래 내 계획은 Packet Forwarding해주는 프로그램을 따로 작성하려고 했는데
마침 지인께서 알려주었다 !! 간단하게 해주는 방법~!!
좌좌 .. 먼저 이 경로로 이동해 보자!!
| cd /proc/sys/net/ipv4 |
이곳에 도착했으면 이제 ip_foward라는 파일이 있는데 이게 무엇으로 설정되어 있는지 보자..
| cat ip_forward |
아마 기본적으로는 0이라는 숫자 하나만 달랑 나올 것이다!
그렇다 기본적으로는 Packet Forwarding이 허용되지 않는다는 것이다!(ip를 사용한;;)
그렇다면 이제 이것을 1로 수정하자!!(루트 권한으로만;;)
그다음 iptables를 수정해
| iptables -P FORWARD ACCEPT |
이러고 나면 자신에게 들어오는 패킷에 대해서 포워딩이 가능해진다
from : http://nettop.pe.kr
from : http://kkaok.pe.kr
from : http://koug.net
<25가지 SQL작성법>
1.데이터와 비즈니스 어플리케이션을 잘 알아야 한다.
동일한 정보는 다른 비즈니스 데이터 원천으로부터 검색될 수 있다. 이러한 원천
에 익숙해야 한다. 당신은 당신의 데이터베이스 안의 데이터의 크기와 분포를 반
드시 알아야 한다. 또한 SQL을 작성하기 전에
비즈니스 개체 안의 관계와 같은
데이터 모델을 전체적으로 이해해야 한다. 이러한 이해는 당신이 여러 테이블에
서 정보를 검색하는데 있어서 보다 좋은 쿼리를 작성할 수 있다. DESIGNER/2000
과 같은 CASE TOOLS은 다른 비즈니스와 데이터베이스 객체사이의 관계를 문서화
하는데 좋은 역할을 한다.
2.실제 데이터를 가지고 당신의 쿼리를 검사하라.
대부분의 조직은 개발, 검사, 제품의 3가지 데이터베이스 환경을 가진다. 프로그
래머는 어플리케이션을 만들고 검사하는데 개발 데이터베이스 환경을 사용하는
데, 이 어플리케이션이 제품 환경으로 전환되기 전에 프로그래머와 사용자에 의
해 검사 환경하에서 보다 엄격하게 검토되어야 한다.
SQL이 검사 환경하에서 테스트될 때, 검사 데이터베이스가 가지고 있는 데이터
는 제품 데이터베이스를 반영해야 한다. 비실제적인 데이터를 가지고 테스트된
SQL문은 제품 안에서는 다르게 작동할 수 있다. 엄격한 테스트를 보장하기 위해
서는, 검사 환경하에서의 데이터 분포는 반드시 제품 환경에서의 분포와 밀접하
게 닮아야 한다.
3.동일한 SQL을 사용하라.
가능한한 BIND VARIABLE, STORED PROCEDURE, PACKAGE의 이점을
활용하라. IDENTICAL
SQL문의 이점은 PARSING이 불필요하기에 데이터베이스 서버안에서 메모리 사용
의 축소와 빠른 수행을 포함한다. 예로서 아래의 SQL 문은 IDENTICAL하지 않다.
SELECT * FROM EMPLOYEE WHERE EMPID = 10;
SELECT * FROM EMPLOYEE WHERE EMPID = 10;
SELECT * FROM EMPLOYEE WHERE EMPID = 20;
그러나 I_EMPID라고 이름 주어진 BIND
VARIABLE을 사용하면 SQL 문은 이렇게 된
다.
SELECT * FROM EMPLOYEE WHERE EMPID = :I_EMPID;
4.주의 깊게 인덱스를 사용하라.
테이블상에 모든 필요한 인덱스는 생성되어야 한다. 하지만 너무 많은 인덱스는
성능을 떨어뜨릴 수 있다. 그러면 어떻게 인덱스를 만들 칼럼을 선택해야 하는
가?
*최종 사용자에 의해 사용되는 어플리케이션 SQL과 쿼리의 WHERE 절에서 빈번
하게 사용되는 칼럼에 인덱스를 만들어야 한다.
*SQL 문에서 자주 테이블을 JOIN하는데 사용되는 칼럼은 인덱스되어야 한다.
*같은 값을 가지는 ROW가 적은 비율을 가지는 칼럼에 인덱스를 사용하라.
*쿼리의 WHERE 절에서 오직 함수와 OPERATOR로
사용되는 칼럼에는 인덱스를 만들
면 안된다.
*자주 변경되거나 인덱스를 만들때 얻는 효율성보다 삽입, 갱신, 삭제로 인해 잃는
효율성이 더 큰 칼럼에는 인덱스를 만들면 안된다. 이러한
OPERATION은 인덱스를
유지하기 위한 필요 때문에 느려진다.
*UNIQUE 인덱스는 더 나은 선택성 때문에 NONUNIQUE 인덱스보다 좋다. PRIMARY
KEY 칼럼에 UNIQUE 인덱스를 사용한다. 그리고 FOREIGN KEY 칼럼과 WHERE 절
에서 자주 사용되는 칼럼에는 NONUNIQUE 인덱스를 사용한다.
5.가용한 인덱스 PATH를 만들어라
인덱스를 사용하기 위해서는 기술한 SQL문을 이용할 수 있는 식으로 SQL을 작
성하라. OPTIMIZER는 인덱스가 존재하기 때문에 인덱스를 사용하는 ACESS PATH
를 사용할 수 없다. 따라서 ACCESS PATH는
반드시 SQL이 사용할 수 있게 만들
어 져야 한다. SQL HINT를 사용하는 것은 인덱스 사용을 보증해주는 방법중 하
나이다. 특정 ACCESS PATH를 선택하기
위한 다음의 힌트를 참고 하라
6.가능하면 EXPLAIN과 TKPROF를 사용하라
만약 SQL문이 잘 다듬어지지 않았다면 비록 오라클 데이터베이스가 잘 짜여져
있어도 효율성이 떨어질 것이다. 이럴 경우 EXPLAIN
TKPROF에 능숙해져야 한
다. EXPALIN PLAN은 SQL이 사용하는 ACCESS PATH를 발견할 수 있게 해주고
TKPROF는 실제 PERFORMANEC의 통계치를 보여준다. 이 TOOL은 오라클 서버 소
프트웨어에 포함되어 있고 SQL의 성능을 향상시켜 준다.
7.OPTIMIZER를 이해하라.
SQL은 RULE-BASED나 COST-BASED중
하나를 이용해서 기동된다.기존의 소
프트웨어는 RULE BASED 방식을 채택하고 있다. 그리고
많은 오라클 소프트웨
어가 이러한 방식을 오랫동안 사용해 왔다. 그러나 새로 출시된 소프트웨어에 대
해서는 COST BASED 방식의 OPTIMIZER를
고려해야 한다. 오라클은 새로 출
시되는 프로그램을 COST BASED방식으로 업그레이드 시켜왔으며 이러한 방식
은 시스템을 훨씬 더 안정적으로 만들었다. 만약 COST
BASED방식의
OPTIMIZER를 사용한다면 반드시 ANALYZE 스키마를 정기적으로 사용해야 한
다. ANALYZE스키마는 데이터베이스 통계를 데이터 사전 테이블에 기록하는 역
할을 수행하며 그렇게 되면 COST BASED OPTIMIZER가 그것을 사용하게 된
다. SQL은 COST BASED OPTIMIZER를
사용할 때만 잘 조정될 수 있다. 만약
RULE BASED에서 COST BASED로 바꾸고 싶다면 데이터베이스를 사용하는 모
든 소프트웨어의 모든 SQL문의 성능을 평가해 보아야 한다.
8.지엽적으로 동작하더라도 전역적으로 생각하라
항상 주의할 것은 하나의 SQL문을 조정하기 위해 생긴 데이터베이스안의 변화
는 다른 응용프로그램이나 다른 사용자가 이용하는 다른 명령문에 영향을 미친다
는 사실이다.
9.WHERE절은 매우 중요하다.
비록 인덱스가 가용하다고 해도 다음의 WHERE 절은 그 인덱스 ACCESS PATH
를 사용하지 않는다.(즉 COL1 과 COL2는 같은 테이블에 있으며 인덱스는
COL1에 만들어진다.)
COL1 > COL2
COL1 < COL2
COL1 > = COL2
COL1 <= COL2
COL1 IS NULL
COL1 IS NOT NULL.
인덱스는 NULL값을 갖는 칼럼에는 ROWID를
저장하지 않는다. 따라서 NULL값
을 갖는 ROW를 검색할 때는 인덱스를 사용하지 못한다.
COL1 NOT IN (VALUE1, VALUE2 )
COL1 != EXPRESSION
COL1 LIKE ''%PATTERN''.
이럴 경우 THE LEADING EDGE OF THE INDEX(?) 는 작동되지 않고
인덱스가 사
용되지 못하게 한다. 한편 COL1 LIKE
''PATTERN %''이나 COL1 LIKE ''PATTERN %
PATTERN%'' 는 한정된 인덱스 스캔을 수행하기 때문에 인덱스를 사용할 수 있다.
NOT EXISTS SUBQUERY
EXPRESSION1 = EXPRESSION2.
인덱스된 컬럼을 포함하는 표현(EXPRESSION), 함수, 계산(CALCULATIONS)은 인덱스
를 사용하지 못한다. 다음의 예에서 보면 UPPER
SQL 함수를 사용하면 인덱스
스캔을 사용할 수 없고 FULL TABLE SCAN으로 끝나고 만다.
SELECT DEPT_NAME
FROM DEPARTMENT
WHERE UPPER(DEPT_NAME) LIKE ''SALES%'';
10.레코드 필터링을 위해서는 HAVING보다는
WHERE를 사용하라
인덱스가 걸려있는 칼럼에는 GROUP BY와 같이
HAVING절을 사용하지 마라. 이 경
우 인덱스는 사용되지 않는다. 또한 WHERE절로
된 ROW를 사용하지 마라. 만약
EMP테이블이 DEPTID컬럼에 인덱스를 가지고 있다면 다음 질의는 HAVING 절을
이용하지 못한다.
SELECT DEPTID,
SUM(SALARY)
FROM EMP
GROUP BY DEPTID
HAVING DEPTID = 100;
그러나 같은 질의가 인덱스를 사용하기 위해 다시 씌여질 수 있다.
SELECT DEPTID,
SUM(SALARY)
FROM EMP
WHERE DEPTID = 100
GROUP BY DEPTID;
11. WHERE 절에 선행 INDEX 칼럼을 명시하라.
복합 인덱스의 경우, 선행 인덱스가 WHERE절에
명시되어 있다면 쿼리는
그 인덱스 를 사용할 것이다. 다음의 질의는
PART_NUM과 PRODUCT_ID 칼럼
에 있는 PRIMARY KEY CONSTRAINT에 기초한 복합 인덱스를 이용할 것이다.
SELECT *
FROM PARTS
WHERE PART_NUM = 100;
반면, 다음의 쿼리는 복합인덱스를 사용하지 않는다.
SELECT *
FROM PARTS
WHERE PRODUCT_ID = 5555;
같은 요청(REQUEST)이 인덱스를 이용하기 위해 다시 씌어 질 수 있다. 다음 질의
의 경우, PART_NUM컬럼은 항상 0 보다
큰 값을 가질것이다.
SELECT *
FROM PARTS
WHERE PART_NUM > 0
AND PRODUCT_ID = 5555;
12.인덱스 SCAN과 FULL TABLE SCAN을
평가하라.
한 행(ROW)의 15% 이상을 검색하는 경우에는 FULL TABLE SCAN이 INDEX
ACESS PATH보다 빠르다. 이런 경우, SQL이 FULL TABLE SCAN을 이용할 수 있도록
여러분 스스로 SQL을 작성하라. 다음의 명령문은
비록 인덱스가 SALARY
COLUMN에 만들어져 있어도 인덱스 SCAN을 사용하지 않을 것이다. 첫 번째 SQL
에서, FULL HINT를 사용한다면 오라클은 FULL
TABLE SCAN을 수행할 것이다. 인덱
스의 사용이 나쁜 점이 더 많다면 아래의 기술을 이용해서 인덱스 수행을 막을
수 있다.
SELECT * --+FULL
FROM EMP
WHERE SALARY = 50000;
SELECT *
FROM EMP
WHERE SALARY+0 = 50000;
다음의 명령문은 비록 인덱스가 SS# COLUMN에 있어도 인덱스 SCAN을 사용하
지 않을 것이다.
SELECT *
FROM EMP
WHERE SS# || '' '' = ''111-22-333'';
오라클이 불분명한 데이터 변환을 수행해야 하는 경우 인덱스가 항상 사용되지
않는 것은 아니다. 다음의 예를 보면, EMP 칼럼에
있는 SALARY는 숫자형 칼
럼이고 문자형이 숫자값으로 변환된다.
SELECT *
FROM EMP
WHERE SALARY = ''50000'';
테이블의 행이 15%이거나 그보다 작을 경우 인덱스 스캔은 보다 잘 수행 될 것
이다. 왜냐 하면 인덱스 스캔은 검색된 행(ROW)하나
하나 마다 다중의 논리적인
읽기 검색(READ)을 할 것이기 때문이다. 그러나 FULL TABLE SCAN은 하나의 논리적
인 읽기 검색 영역 안의 BLOCK에 있는 모든 행들을 읽을 수 있다. 그래서 테이
블의 많은 행들에 접근해야 하는 경우에는 FULL TABLE SCAN이 낫다. 예로 다음의
경우를 보자. 만약 EMP TABLE과 그 테이블의
모든 인덱스에 대해 ANALYZE라
는 명령어가 수행된다면, 오라클은 데이터 사전인
USER_TABLES와
USER_INDEXES에 다음과 같은 통계치를 산출해 낸다.
TABLE STATISTICS:
NUM_ROWS = 1000
BLOCKS = 100
INDEX STATISTICS:
BLEVEL = 2
AVG_LEAF_BLOCKS_PER_KEY = 1
AVG_DATA_BLOCKS_PER_KEY = 1
이러한 통계치 에 근거해서, 아래에 보이는 것이 각각의 다른 SCAN에 대한 논리
적인 읽기(READ)-즉 ACESS된 BLOCK이 될 것이다.
USE OF INDEX TO RETURN ONE ROW = 3
(BLEVEL+(AVG_LEAF_BLOCKS_PER_KEY - 1) +
AVG_DATA_PER_KEY
FULL TABLE SCAN = 100
(BLOCKS)
USE OF INDEX TO RETURN ALL ROWS = 3000
(NUM_ROWS * BLOCKS ACCESSED TO RETURN ONE ROW USING INDEX)
13. 인덱스 스캔에 ORDER BY를 사용하라
오라클의 OPTIMIZER는 , 만약 ORDER BY라는 절이 인덱스된 칼럼에 있다면 인
덱스 스캔을 사용할 것이다. 아래의 질의는 이러한 점을 보여 주는 것인데 이 질
의는 비록 그 칼럼이 WHERE 절에 명시되어 있지 않다고 해도 EMPID컬럼에 있
는 가용한 인덱스를 사용할 것이다. 이 질의는 인덱스로부터 각각의 ROWID를
검색하고 그 ROWID를 사용하는 테이블에 접근한다.
SELECT SALARY
FROM EMP
ORDER BY EMPID;
만약 이 질의가 제대로 작동하지 않는다면, 당신은 위에서 명시되었던 FULL HINT
를 사용하는 같은 질의를 다시 작성함으로써 다른 대안들을 이용해 볼 수 있다.
14. 자신의 데이터를 알아라
내가 이미 설명한 것처럼, 당신은 당신의 데이터를 상세하게 알고 있어야 한다.
예를 들어 당신이 BOXER라는 테이블을 가지고 있고 그 테이블이 유일하지 않은
인덱스를 가진 SEX라는 컬럼과 BOXER_NAME이라는
두 개의 테이블을 가지고 있
다고 가정해 보자. 만약 그 테이블에 같은 수의 남자, 여자
복서가 있다면 오라
클이 FULL TABLE SCAN을 수행하는 경우 다음의 질의가 훨씬 빠를 것이다.
SELECT BOXER_NAME
FROM BOXER
WHERE SEX = ''F'';
당신은 다음과 같이 기술함으로써 질의가 FULL TABLE SCAN을 수행하는지를 확실
하게 해 둘 수 있다.
SELECT BOXER_NAME --+ FULL
FROM BOXER
WHERE SEX = ''F'';
만약 테이블에 980 명의 남성 복서 데이터가 있다면, 질의는
인덱스 SCAN으로
끝나기 때문에 아래형식의 질의가 더 빠를 것이다.
SELECT BOXER_NAME --+ INDEX (BOXER BOXER_SEX)
FROM BOXER
WHERE SEX = ''F'';
이 예는 데이터의 분포에 대해 잘 알고 있는 것이 얼마나 중요한 가를 예시해 준
다. 데이터가 많아지고(GROW) 데이터 분포가
변화하는 것처럼 SQL 도 매우 다
양할 것이다. 오라클은 OPTIMIZER 가
테이블에 있는 데이터의 분포를 잘 인식하
고 적절한 실행 계획을 선택하도록 하기 위해 오라클 7.3 에 HISTOGRAMS라는
기능을 추가했다.
15. KNOW WHEN TO USE LARGE-TABLE SCANS.
작거나 큰 테이블에서 행들을 추출할 때, 전체 테이블의 검색은 인텍스를 사용한
검색보다 성능이 더 좋을 수도 있다. 매우 큰 테이블의 인덱스 검색은 수많은
인덱스와 테이블 블록의 검색이 필요할수도 있다. 이러한 블록들이 데이터베이
스 버퍼 캐쉬에 이동되면 가능한한 오래도록 그곳에 머무른다. 그래서 이러한
블록들이 다른 질의등에 필요하지 않을 수도 있기 때문에, 데이터베이스 버퍼 히
트 비율이 감소하며 다중 사용자 시스템의 성능도 저하되기도 한다. 그러나 전
체 테이블 검색에 의해서 읽혀진 블록들은 데이터베이스 버퍼 캐쉬에서 일찍 제
거가 되므로 데이터베이스 버퍼 캐쉬 히트 비율은 영향을 받지 않게 된다.
16. MINIMIZE TABLE PASSES.
보통, SQL질의시 참조하는 테이블의 숫자를 줄임으로 성능을 향상시킨다. 참조
되는 테이블의 숫자가 적을수록 질의는 빨라진다. 예를 들면 NAME, STATUS,
PARENT_INCOME, SELF_INCOME의 네개의 컬럼으로 이루어진 학생 테이블
에서 부모님에 의존하는 학생과 독립한 학생의 이름과 수입에 대해서 질의시, 이
학생 테이블을 두번 참조하여 질의하게 된다..
SELECT NAME, PARENT_INCOME
FROM STUDENT
WHERE STATUS = 1
UNION
SELECT NAME, SELF_INCOME
FROM STUDENT
WHERE STATUS = 0;
( NAME이 프라이머리 키이며, STATUS는 독립한 학생의 경우는 1, 부모님에
의존적인 학생은 0으로 표시한다)
위의 같은 결과를 테이블을 두번 참조하지 않고도 질의 할 수 있다.
SELECT NAME,PARENT_INCOME*STATUS + SELF_INCOME(1-STATUS)
FROM STUDENT;
17. JOIN TABLES IN THE PROPER ORDER.
다수의 테이블 조인시 테이블들의 조인되는 순서는 매우 중요하다. 전반적으로,
올바른 순서로 테이블이 조인되었다면 적은 수의 행들이 질의시 참조된다. 언제
나 다수의 조인된 테이블들을 질의시 우선 엄격하게 조사하여 행들의 숫자를 최
대한으로 줄인다. 이러한 방법으로 옵티마이저는 조인의 차후 단계에서 적은 행
들을 조사하게 된다. 뿐만 아니라, 여러 조인을
포함하는 LOOP JOIN에서는 가
장 먼저 참조되는 테이블(DRIVING TABLE)이 행들을 최소한으로 리턴하도록 해야
한다. 그리고, 마스터와 상세 테이블 조인시에는(예를 들면 ORDER & ORDER
LINE ITEM TABLES) 마스터 테이블을 먼저 연결 시켜야 한다.
규칙에 근거한 옵티마이저의 경우에는 FROM CLAUSE의 마지막 테이블이 NESTED
LOOP JOIN의 DRIVING TABLE이 된다.
NESTED LOOP JOIN이 필요한 경우에는
LOOP의 안쪽의 테이블에는 인텍스를 이용하는 것을 고려할 만하다. EXPLAIN
PLAN과 TKPROF는 조인 타입, 조인 테이블
순서, 조인의 단계별 처리된 행들
의 숫자들을 나타낸다.
비용에 근거한 옵티마이저의 경우에는 WHERE CLAUSE에 보여지는 테이블의 순
서는 옵티마이저가 가장 최적의 실행 계획을 찾으려고 하는 것과 상관 없다. 조
인되는 테이블의 순서를 통제하기 위해서 ORDERED HINT를 사용하는 것이 낫다.
SELECT ORDERS.CUSTID, ORDERS.ORDERNO,
ORDER_LINE_ITEMS.PRODUCTNO --+ORDERED
FROM ORDERS, ORDER_LINE_ITEMS
WHERE ORDERS.ORDERNO = ORDER_LINE_ITEMS.ORDERNO;
18. USE INDEX-ONLY SEARCHES WHEN POSSIBLE.
가능하다면, 인덱스만을 이용하여 질의를 사용하라. 옵티마이저는
오직 인덱스만
을 찾을 것이다. 옵티마이저는 SQL을 만족시키는
모든 정보를 인덱스에서 찾을
수 있을 때, 인덱스만을 이용할 것이다. 예를들면, EMP테이블이 LANME과
FNAME의 열에 복합 인덱스를 가지고 있다면 다음의 질의는 인덱스만은 이용할
것이다.
SELECT FNAME
FROM EMP
WHERE LNAME = ''SMITH'';
반면에 다음의 질의는 인덱스와 테이블을 모두 참조한다.
SELECT FNAME , SALARY
FROM EMP
WHERE LNAME = ''SMITH'';
19. REDUNDANCY IS GOOD.
WHERE CLAUSE에 가능한한 많은 정보를 제공하라. 예를 들면 WHERE COL1 =
COL2 AND COL1 = 10이라면 옵티마이저는 COL2=10이라고 추론하지만,
WHERE COL1 = COL2 AND COL2 = COL3이면 COL1=COL3이라고
초론하지는
않는다.
20. KEEP IT SIMPLE, STUPID.
가능하면 SQL문을 간단하게 만들라. 매우 복잡한 SQL문은 옵티마이저를 무력
화시킬 수도 있다. 때로는 다수의 간단한 SQL문이
단일의 복잡한 SQL문보다
성능이 좋을 수도 있다. 오라클의 비용에 근거한 옵티마이저는 아직은 완벽하지
않다. 그래서 EXPLAIN PLAN에 주의를
기울여야 한다. 여기서 비용이란 상대적인
개념이기에 정확히 그것이 무엇을 의미하는지 알지 목한다. 하지만 분명한 것은
적은 비용이 보다 좋은 성능을 의미한다는 것이다.
종종 임시 테이블을 사용하여 많은 테이블들을 포함하는 복잡한 SQL 조인을 쪼
개는 것이 효율적일 수도 있다. 예를 들면, 조인이
대량의 데이터가 있는 8개의
테이블을 포함할 때, 복잡한 SQL을 두 세개의 SQL로 쪼개는 것이 낫을 수 있
다. 각각의 질의는 많아야 네개정도의 테이블들을 포함하며 그 중간 값을 저장
하는 것이 낫을 수 있다.
21. YOU CAN REACH THE SAME DESTINATION IN DIFFERENT WAYS.
많은 경우에, 하나 이상의 SQL문은 의도한
같은 결과를 줄 수 있다. 각각의
SQL은 다른 접근 경로를 사용하며 다르게 수행한다. 예를들면, MINUS(-) 산술
자는 WHERE NOT IN (SELECT ) OR WHERE NOT EXISTS 보다
더 빠르다.
예를들면, STATE와 AREA_CODE에 각각
다른 인덱스가 걸려 있다. 인덱스에
도 불구하고 다음의 질의는 NOT IN의 사용으로 인해 테이블 전체를 조사하게
된다.
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE STATE IN (''VA'', ''DC'', ''MD'')
AND AREA_CODE NOT IN (804, 410);
그러나 같은 질의가 다음 처럼 쓰여진다면 인덱스를 사용하게 된다
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE STATE IN (''VA'', ''DC'', ''MD'')
MINUS
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE AREA_CODE IN (804, 410);
WHERE절에 OR을 포함한다면 OR대신에 UNION을 사용할 수 있다. 그래서,
SQL 질의를 수행하기 전에 먼저 실행계획을 조심스럽게 평가해야 한다. 이러한
평가는 EXPLAIN PLAN AND TKPROF를 이용하여 할 수 있다.
22. USE THE SPECIAL COLUMNS.
ROWID AND ROWNUM 열을 이용하라. ROWID를 이용하는 것이 가장 빠르다.
예를들면, ROWID를 이용한 UPDATE는
다음과 같다.
SELECT ROWID, SALARY
INTO TEMP_ROWID, TEMP_SALARY
FROM EMPLOYEE;
UPDATE EMPLOYEE
SET SALARY = TEMP_SALARY * 1.5
WHERE ROWID = TEMP_ROWID;
ROWID값은 데이터베이스에서 언제나 같지는 않다. 그래서, SQL이나 응용 프
로그램이용시 ROWID값을 절대화 시키지 말라. 리턴되는
행들의 숫자를 제한
시키기위해 ROWNUM을 이용하라. 만약에 리턴되는
행들을 정확히 모른다면
리턴되는 행들의 숫자를 제한하기위해 ROWNUM을 사용하라
다음의 질의는 100개 이상의 행들을 리턴하지는 않는다.
SELECT EMPLOYE.SS#, DEPARTMENT.DEPT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE EMPLOYEE.DEPT_ID = DEPARTMENT.DEPT_ID
AND ROWNUM < 100;
23.함축적인 커서대신 명시적인 커서를 사용하라.
함축적 커서는 여분의 FETCH를 발생시킨다. 명시적
커서는 DECLARE, OPEN,
FETCH와 CLOSE CURSOR문을 사용하여 개발자에 의해서 생성된다. 함축 커서는
DELETE, UPDATE, INSERT와 SELECT문을 사용하면 오라클에 의해서 생성
된다.
24.오라클 병렬 쿼리 옵션을 찾아서 이용하라.
병렬 쿼리 옵션을 사용하면, 보다 빠른 성능으로 SQL을
병렬로 실행할 수 있다.
오라클 7에서는, 오직 FULL TABLE SCAN에 기반한 쿼리만이 병렬로 수행될 수 있다.
오라클 8에서는, 인덱스가 분할되어있다면 INDEXED RANGE SCANS에 기반한 쿼리도
병렬로 처리될 수 있다. 병렬 쿼리 옵션은 다수의 디스크 드라이버를 포함하는
SMP와 MPP SYSTEM에서만 사용될 수 있다.
오라클 서버는 많은 우수한 특성을 가지고 있지만, 이러한 특성의 존재만으로는
빠른 성능을 보장하지 않는다. 이러한 특성을 위해서 데이터베이스를 조정해야하
며 특성을 이용하기 위해 특별하게 SQL을 작성해야 한다.
예를 들면, 다음의
SQL은 병렬로 수행될 수 있다.
SELECT * --+PARALLEL(ORDERS,6)
FROM ORDERS;
25.네트웍 소통량을 줄이고 한번에 처리되는 작업량을 늘려라.
ARRAY PROCESSING과 PL/SQL BLOCK을 사용하면 보다 나은 성능을 얻을
수 있고
네트웍 소통량을 줄인다. ARRAY PROCESSING은 하나의 SQL문으로 많은 ROW를 처
리할 수 있게 한다. 예를 들면, INSERT문에서
배열을 사용하면 테이블내의
1,000 ROW를 삽입할 수 있다. 이러한 기술을 사용하면 주요한 성능 향상을 클라
이언트/서버와 배치시스템에서 얻어질 수 있다.
복합 SQL문은 과도한 네트웍 소통을 유발할 수 있다. 그러나
만일 SQL문이 단
일 PL/SQL 블록안에 있다면, 전체 블록은
오라클 서버에 보내져서 그곳에서 수
행되고, 결과는 클라이언트의 APPLICATION에게
돌아온다.
개발자와 사용자는 종종 SQL을 데이터베이스에서 데이터를 검색하고 전송하는
간단한 방법으로 사용한다. 때때로 직접적으로 SQL을
작성하지 않고 코드 발생
기를 사용하여 작성한 APPLICATION은 심각한 성능 문제를 일으킨다. 이러한 성능
감퇴는 데이터베이스가 커지면서 증가한다.
SQL은 유연하기 때문에, 다양한 SQL문으로
같은 결과를 얻을 수 있다. 그러나
어떤 문은 다른 것보다 더 효율적이다. 여기에 기술된 팁과 기법을 사용하면 빠
르게 사용자에게 정보를 제공할 수 있는 APPLICATION과 리포트를 얻을 수 있다.
이올린에 북마크하기

