레이블이 오라클교육인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클교육인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 23일 수요일

오라클 SQL 튜닝의 도구 – SQL*TRACE와 TKPROF [ORACLE강좌]

오라클  SQL 튜닝의 도구 – SQL*TRACE와 TKPROF [ORACLE강좌]

Oracle의 SQL*TRACE는 사용자가 실행 한 SQL문에 대해 구문분석(Parsing), 실행(execute), 추출(fetch) 부분으로 나누어 각 단계에서 걸리는 Overhead와 시간 등의 통계 정보를 일정한 형태로 저장 합니다. EXPALIN PLAN에서 제공하는 정보와 더블어 CPU/IO의 필요량, 실행계획의 각 단계에서의 레코드 개수등의 정보도 확인 가능 합니다. EXPLAIN PLAN 명령어와 함께 자주 사용되는 튜닝의 도구 입니다. 

SQL*TRACE나 TKPROF를 실행 했을 때의 결과는 이해하기가 쉽지 않지만 강력한 튜닝의 도구 입니다. SQL*TRACE에 의해 분석되는 결과는 바이너리 형태로 운영체제의 파일 시스템에 생성 됩니다. 물론 바이너리 이므로 결과를 직접 눈으로 보면 이해가 되지 않지만 TKPROF 유틸리티를 이용하여 텍스트 파일 형태로 변환 시켜 확인이 가능 합니다. 

SQL*TRACE의 결과는 데이터베이스 전체 또는 특정 세션에 대해 적용 할 수 있는데 데이터베이스 전체에 트레이스를 적용하면 실제 Application 수행에 추가적인 부하를 가져오므로 특별한 경우를 제외하고 전체 데이터베이스 시스템에 TRACE를 거는 것은 삼가 해야 합니다. 대부분은 특정 세션에 대해서만 부분적으로 활성화 하여 사용 합니다. 


SQL*TRACE의 사용 

SQL TRACE를 사용하기 전에 몇 가지 설정이 필요한데 먼저 초기파일에서 USER_DUMP_DEST 파라미터를 확인해야 합니다. 이 매개변수는 TRACE를 실행 할 때 생성되는 파일의 위치를 설정 하는 것입니다. 또한 시간 정보를 TRACE 항목에 추가할려면 TIMED_STATISTICS 항목을 TRUE로 해야 하거나 SQL*Plus등에서는 alter session set timed_statistics=true 라고 해주어야 합니다. 아래에 자세히 확인 하도록 합니다. 

TIMED_STATISTICS 

시간 통계 정보에 대해 수집여부를 결정, 기본값은 false 
세션레벨에서는 alter session set timed_statistics=true라고 하면 됩니다. 

MAX_DUMP_FILE_SIZE 

TRACE의 결과로 생기는 바이너리 파일의 최대 사이즈를 단위는 블록 입니다. 기본값은 500 블록 입니다. 또한 세션 레벨에서 다음과 같이 지정 가능 합니다. Alter session set max_dump_file_size = 800(800개의 시스템 블록) 

USER_DUMP_DEST 

TRACE의 결과로 생기는 바이너리 파일의 위치를 지정 합니다. 세션레벨에서는 alter session set  user_dump_dest = “C:\oracle\admin\wink\udump” 등으로 지정 합니다. 

위의 세개의 파라미터를 init.ora 파일에 지정하였다면 SQL*TRACE의 시작을 전체 데이터베이스에서 할건지 세션 레벨에서 할건지를 정할 수가 있습니다. 인스턴스 레벨에서 할려면 init.ora 파일에서 SQL_TRACE 항목을 TRUE로 설정하면 되구요 세션 레벨에서 할려면 alter session set sql_trace = true 라고 하면 됩니다. 

자 이제 실습을 위해 위의 3개의 매개변수를 init.ora 에 설정토록 합니다. 

MAX_DUMP_SIZE = 800 
TIMED_STATISTICS = TRUE 
USER_DUMP_DEST = C:\oracle\admin\wink\udump 

다음을 따라 하도록 합니다. 

SQL> conn / as sysdba 
연결되었습니다. 
SQL> shutdown immediate 
데이터베이스가 닫혔습니다. 
데이터베이스가 마운트 해제되었습니다. 
ORACLE 인스턴스가 종료되었습니다. 
SQL> startup open 
ORACLE 인스턴스가 시작되었습니다. 

Total System Global Area 135338868 bytes 
Fixed Size 453492 bytes 
Variable Size 109051904 bytes 
Database Buffers 25165824 bytes 
Redo Buffers 667648 bytes 
데이터베이스가 마운트되었습니다. 
데이터베이스가 열렸습니다. 

SQL>conn scott/tiger 

SQL> alter session set sql_trace=true; 

세션이 변경되었습니다. 

SQL> select job,avg(sal) from emp 
2 group by job 
3 having avg(sal) > (select avg(sal) from emp 
4 where job = 'SALESMAN'); 

JOB AVG(SAL) 
--------- ---------- 
ANALYST 3000 
MANAGER 2758.33333 
PRESIDENT 5000 

session에서 trace를 중지 

SQL> alter session set sql_trace=false; 

SQL*Plus를 종료하고 c:\oracle\admin\wink\udump에 가보면 trc 파일이 생겼을 것 
입니다. 저의 경우 DB SID가 wink이므로 wink_ora_3316.trc 와 같은 파일이 생겼습니다. 

TKPROF를 이용하여 TRACE파일을 텍스트 파일로 변경 하기 

TKPROF Utility를 이용하면 매우 유용한 분석 정보를 얻을 수 있습니다. 즉 TKPROF의 결과 파일은 트레이스가 실행되는 동안 프로세스에 의해 데이터베이스에서 실행된 작업에 대한 요약 정보 입니다. 

텍스트 파일의 내용을 보면 PARSE, EXECUTION, FETCH시 작업을 실행 한 횟수, CPU 사용 시간, 검색된 행이 무엇인지, SQL이 수행된 총 소요시간, DISK IO 블록 수, 조건을 만족하는 전체 행의 수, 수행된 SQL문이 사용한 SGA 영역의 크기, SQL문장의 실행 계획, 해당 세션에서 작업했던 전체 작업에 대한 CPU, 메모리, 블록의 크기 등의 정보를 확인 할 수 있습니다. 

SQL문을 해석하기 위해서는 아래의 단계가 필요 합니다. 

파싱(parse) 

SQL문을 실행 계획으로 번역 하는 것을 말합니다. 해당 SQL을 실행 하는데 필요한 적절한 권한, 컬럼이 있는지, 참조된 객체에 관한 확인 등의 작업이 이루어지게 됩니다. 

실행(execution) 

오라클에 의해 SQL문을 실제 실행 한 것을 말합니다. 

추출/인출(fetch) 

쿼리에 의해 추출된 레코드를 이여기 합니다. Select 문에서만 이용 됩니다. 


다음은 TKPROF의 통계 정보 컬럼 입니다. 

Count : 분석, 실행, 추출을 몇번 했는지를 나타 냅니다. 
CPU : 분석, 실행, 추출에 대한 CPU 처리 시간(CURSOR를 공유하면 분석단계의 처리 시간은 0 입니다.) 
Elapsed : 분석, 실행, 추출 처리 단계별로 처리된 소요 시간 
Disk : 테이블의 데이터를 읽기 위해 데이터 파일로부터 읽어 들인 블록 수 
Query : SELECT로 데이터를 읽어 올 때 이미 다른 사용자에 의해 같은 데이터가 사용 되었다면 그 블록에서 데이터를 가져옵니다. 
Current : 메모리에 저장된 데이터를 가지고 오기 위해 읽은 버퍼의 블록 수(update, insert, delete 후 select 했을 때) 

TKPROF를 실행하기 위한 문법 

Explain = 사용자계정/패스워드(명시된 사용자에 대해 EXPLAIN PLAN 실행) 
Print = n (트레이스 파일내의 분석된 SQL문의 수를 n 만큼만 제한할 때 이용) 
Record = 파일명(트레이스 파일내에 분석된 SQL문을 지정한 파일에 저장) 
Sort=option(트레이스 파일내에 분석된 SQL문을 지정한 옵션에 의해 정렬) 
Sys=[NO](트레이스 파일내에 생성된 SQL 문장 중에 오라클 서버가 내부적인 작업을 위해 실행한 SQL문장을 출력 시 포함 할건지를 결정) 
Table=스키마.테이블명(실행 계획을 지정한 테이블에 저장) 

이전의 SQL*TRACE에 의해 생긴 바이너리 파일을 TKPROF를 이용하여 분석을 해보도록 하겠습니다. 

명령프롬픝에서 다음과 같이 실행 합니다.(TRACE 파일이 만들어진 곳에서 실행) 

C:\oracle\admin\wink\udump>tkprof wink_ora_3316.trc sql1.tkp sys=no explain=scot 
t/tiger 

TKPROF: Release 9.2.0.1.0 - Production on 목 Dec 16 01:33:23 2004 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

다음은 sql1.tkp 파일의 내용 입니다. 



TKPROF: Release 9.2.0.1.0 - Production on 목 Dec 16 01:33:23 2004 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

Trace file: wink_ora_3316.trc 
Sort options: default 

******************************************************************************** 
count = number of times OCI procedure was executed 
cpu = cpu time in seconds executing 
elapsed = elapsed time in seconds executing 
disk = number of physical reads of buffers from disk 
query = number of buffers gotten for consistent read 
current = number of buffers gotten in current mode (usually for update) 
rows = number of rows processed by the fetch or execute call 
******************************************************************************** 

alter session set sql_trace=true 


call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 0 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 1 0.00 0.00 0 0 0 0 

Misses in library cache during parse: 0 
Optimizer goal: CHOOSE 
Parsing user id: 59 (SCOTT) 
******************************************************************************** 


아래는 사용자가 실행한 SQL 문장 입니다. 

select job,avg(sal) from emp 
group by job 
having avg(sal) > (select avg(sal) from emp 
where job = 'SALESMAN') 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 2 0.00 0.00 0 6 0 3 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 4 0.00 0.01 0 6 0 3 

Misses in library cache during parse: 1 이 값이 0이라는 의미는 실행한 SQL문이 이전에 실행 된적이 없었음을 나타 냅니다. 
Optimizer goal: CHOOSE 옵티마이저 모드 입니다. 
Parsing user id: 59 (SCOTT) 

Rows Row Source Operation 
------- --------------------------------------------------- 
3 FILTER 
5 SORT GROUP BY 
14 TABLE ACCESS FULL EMP 
1 SORT AGGREGATE 
4 TABLE ACCESS FULL EMP 


Rows Execution Plan 
------- --------------------------------------------------- 
0 SELECT STATEMENT GOAL: CHOOSE 
3 FILTER 
5 SORT (GROUP BY) 
14 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 
1 SORT (AGGREGATE) 
4 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 

******************************************************************************** 

alter session set sql_trace=false 


call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.01 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 2 0.01 0.00 0 0 0 0 

Misses in library cache during parse: 0 
Optimizer goal: CHOOSE 
Parsing user id: 59 (SCOTT) 



******************************************************************************** 
아래의 TOTAL은 전체 작업 결과에 대한 분석 결과 입니다. 

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 2 0.00 0.00 0 0 0 0 
Execute 3 0.01 0.00 0 0 0 0 
Fetch 2 0.00 0.00 0 6 0 3 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 7 0.01 0.01 0 6 0 3 

Misses in library cache during parse: 1 


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 1 0.01 0.00 0 3 0 1 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 3 0.01 0.00 0 3 0 1 

Misses in library cache during parse: 0 

3 user SQL statements in session. 
1 internal SQL statements in session. 
4 SQL statements in session. 
1 statement EXPLAINed in this session. 
******************************************************************************** 
Trace file: wink_ora_3316.trc 
Trace file compatibility: 9.00.01 
Sort options: default 

1 session in tracefile. 
3 user SQL statements in trace file. 
1 internal SQL statements in trace file. 
4 SQL statements in trace file. 
4 unique SQL statements in trace file. 
1 SQL statements EXPLAINed using schema: 
SCOTT.prof$plan_table 
Default table was used. 
Table was created. 
Table was dropped. 
54 lines in trace file. 

2013년 10월 17일 목요일

오라클 물리적 구조

Oracle 물리적 구조 oracle physical structure



------------------- 
물리적 DataBase구조 
-------------------- 
oracle 설치된 폴다에 가보면 oradata 폴더에 대부분파일이 위치한다,
확인해 보자.

A. DataFile 
- 모든 Oracle DataBAse는 하나이상의 DataFile을 가지며, DB의 영역이 부족할 때 자동으로 
확장할 수 있는 기능이 있다. 
- 하나이상의 DataFile이 TableSpace를 형성한다. 
- 수정된 Data나 새로운 Data는 파일에 즉시 Write할 필요가 없다.즉 디스크 Access량을 줄이고 
성능을 향상시키려면 Data를 메모리에 저장했다가 DBWR BackGround Process가 한번에 디스크에 
저장한다. 
B. Redo Log File 
- Oracle DB는 2개 이상의 Redo Log File을 가진다. 
- Redo Log의 주기능은 변경사항을 저장,이미 수정된 Data가 장애 때문에 DataFile에 기록되지 
못했다면 수정된 부분이 Redo Log에 있으므로 수행한 작업을 손실하지는 않는다. 
C.  Control File 
- Control File에는 DB이름, DataFile과 Redo Log File의 위치,DB생성시간등이 기록되어 있다. 
- Oracle은 Instance가 시작될때마다 DataBase와 Redo Log File을 지정한다. 새 DataFile이나 
Redo Log File이 생성되는 경우에는 Oracle은 Control File을 자동으로 수정한다. 

D, 파라미터파일
     -데이터베이스 이름
   - SGA메모리 구조와 할당크기
   - 컨트롤 파일명과 위치
   - 아카이브 파일정보
   - 언두세그먼트 정보

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  





2013년 8월 16일 금요일

오라클 Optimizer Mode Setting 방법

오라클 Optimizer Mode Setting 방법

대한민국오라클학원/오라클학원/오라클교육/오라클강의/구로 오라클/가산오라클/오라클강


--------------------------
1.        Instance 수준의 셋팅 방법
--------------------------


오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


-        DB의 설정 파일(initSID.ora or spfileSID.ora)에 전체적으로 적용이 되도록 정의하는 방법이며 다음과 같이 기술하며 OPTIMIZER MODE는 REUL, CHOOSE, ALL_ROOWS, FIRST_ROWS와 같은 종류가 있습니다. CHOOSE인 경우 한테이블이라도 Analyzed되어 있는 경우엔 비용기반 접근 방식을 이용하는 것이며 RULE인 경우 규칙기반 접근 방식을 사용, ALL_ROWS인 경우 비용기반 옵티마이저의 한 방법이며 모든 ROW들을 처리한다고 할 때 그 비용을 최소화 하는 방법으로 실행계획을 수립하며,  FIRST_ROWS인 경우엔 최초 ROW를 추출하는데 드는 비용을 최소화 하도록 실행 계획을 구성하는 것입니다.

-        예) OPTIMIZER_MODE=FIRST_ROWS

-        만약 initSID or spfileSID.ora에 아무 내용도 정의하지 않은 경우 기본적으로 CHOOSE 방식이 됩니다.

-------------------------
2.        Session 수준의 셋팅 방법
-------------------------

-        alter session이라는 명령을 이용하면 현재 접속된 세션 레벨에서 옵티마이저 모드를 정의할 수 있습니다.

-        예) alter session set optimizer_goal=rule 앞과 같이 정의하면 해당 세션이 끝나기 전까지는 규칙 기반(,RULE-BASED) 옵티마이저 모드를 이용하게 됩니다.

--------------------------
3.        Statement 수준의 셋팅 방법
--------------------------

-        힌트(Hint) 구문을 이용한다면 매 SQL 문장마다 서로 다른 옵티마이저 모드를 적용할 수 있습니다.

-        예) SELECT /*+ FIRST_ROWS */
                          ENAME,
                          SAL,
                          JOB
              FROM EMP
              WHERE SAL > (SELECT MAX(SAL)
                                    FROM  EMP
                                    WHERE DEPTNO = 10)

2013년 8월 13일 화요일

Time Base Recovery(1) 중요한 테이블이나 테이블의 데이터를 삭제 했을 때의 복구 방법 입니다. 관리자는 2005년 1월 10일 10시 30분경에 전날(1월9일) 오전 10시 무렵에 중요한 emp 테이블을 실수로 삭제 했다는 보고를 받았습니다. ----------------------------- 복구 과정 ----------------------------- 1. 현재 데이터베이스를 종료 SQL>conn / as sysdba SQL>shutdown immediate (또는 shutdown abort) 2. 현재 DB에 대해 cold backup을 실시 (cold backup에 관한 사항은 이전 강좌를 참고) (데이터파일과 리두 로그 파일, 컨트롤 파일도 같이 백업) 3. 마운트 단계까지 DB 시작 SQL>startup mount 4. 가장 최근에 백업된 데이터 파일로부터 복원 SQL>host copy c:\backup\*.dbf c:\oracle\oradata\wink\ (윈도우) SQL>!cp /backup/*.dbf /oracle/oradata/wink(유닉스 계열) 5. LOG_ARCHIVE_DEST로 지정된 아카이브 로그 폴더에 아카이브 로그 파일이 있는지 확인 (만약 Archive Log가 있는 디스크에 장애가 있어 접근이 어렵다면 아카이브 파일을 임의의 장소에 저장하고 alter system archive log start to ‘디렉토리이름’ 명령으로 변경 합니다) 6. recover 명령으로 1월9일 오전 10시 이전으로 복구(여기서는 9시 55분 상태로 복구) SQL>recover database until ‘2005-01-09 09:55:00’ 7. resetlogs 옵션을 이용하여 DB를 Open SQL>alter database open resetlogs; 8. 삭제된 emp 테이블이 있는지 확인 9. 복구 완료를 확인 하였으면 DB를 종료 후 cold backup을 한 후 Archive Log를 삭제 이상과 같은 방법으로 Time-Base Recovery를 진행하면 되지만 개인적인 생각 입니다만 Export Utility를 이용하여 매일매일 DB를 백업 받아 두었다면 Import를 이용하여 간단하게 복구를 진행 할 수 있을 것 같습니다. (물론 대량의 데이터를 매일매일 Export 한다는 것이 부담스러울 수도 있지만 말입니다. 제가 과거에 백화점에 근무 할 때도 매일매일 export로 전체 DB를 백업 받았던 기억이 납니다… ) [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecBACKUP&wr_id=2

Time Base Recovery

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

중요한 테이블이나 테이블의 데이터를 삭제 했을 때의 복구 방법 입니다.

관리자는 2005년 1월 10일 10시 30분경에 전날(1월9일) 오전 10시 무렵에 중요한 emp 테이블을 실수로 삭제 했다는 보고를 받았습니다.


-----------------------------
복구 과정
-----------------------------

1.        현재 데이터베이스를 종료

SQL>conn / as sysdba
SQL>shutdown immediate (또는 shutdown abort)

2.        현재 DB에 대해 cold backup을 실시 (cold backup에 관한 사항은 이전 강좌를 참고)
(데이터파일과 리두 로그 파일, 컨트롤 파일도 같이 백업)

3.        마운트 단계까지 DB 시작

SQL>startup mount

4.        가장 최근에 백업된 데이터 파일로부터 복원

SQL>host copy c:\backup\*.dbf c:\oracle\oradata\wink\ (윈도우)

SQL>!cp /backup/*.dbf /oracle/oradata/wink(유닉스 계열)

5.        LOG_ARCHIVE_DEST로 지정된 아카이브 로그 폴더에 아카이브 로그 파일이 있는지 확인 (만약 Archive Log가 있는 디스크에 장애가 있어 접근이 어렵다면 아카이브 파일을 임의의 장소에 저장하고 alter system archive log start to ‘디렉토리이름’ 명령으로 변경 합니다)


6.        recover 명령으로 1월9일 오전 10시 이전으로 복구(여기서는 9시 55분 상태로 복구)

SQL>recover database until ‘2005-01-09 09:55:00’

7.        resetlogs 옵션을 이용하여 DB를 Open

SQL>alter database open resetlogs;

8.        삭제된 emp 테이블이 있는지 확인

9.        복구 완료를 확인 하였으면 DB를 종료 후 cold backup을 한 후 Archive Log를 삭제


이상과 같은 방법으로 Time-Base Recovery를 진행하면 되지만 개인적인 생각 입니다만 Export Utility를 이용하여 매일매일 DB를 백업 받아 두었다면 Import를 이용하여 간단하게 복구를 진행 할 수 있을 것 같습니다. (물론 대량의 데이터를 매일매일 Export 한다는 것이 부담스러울 수도 있지만 말입니다. 제가 과거에 백화점에 근무 할 때도 매일매일 export로 전체 DB를 백업 받았던 기억이 납니다… )


[ORACLEJAVA커뮤니티강좌, 백업/복구]오라클 불완전 복구 과정과 주의사항

불완전 복구 과정과 주의사항.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터 
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  


------------------
복구과정
------------------

1. 오류를 확인하고 데이터베이스를 종료
2. close 백업(cold 백업)을 실시
3. 모든 데이터 파일을 복원(때에 따라서는 컨트롤 파일을 복구해야 하는 경우도 있슴)
4. startup mount 단계로 시작하여 recover 명령으로 복구
5. resetlog 옵션을 이용하여 데이터베이스를 오픈 한 다음 정상적인 동작을 확인
6. 데이터베이스를 종료하고 cold backup을 실시


--------------------
주의 사항
--------------------

-        불완전 복구(incomplete recovery)는 완전 복구(Complete Recovery)와는 달리 백업된 전체 데이터를 복원하고 recovery 하므로 반드시 복구 전에 데이터베이스를 종료 해야 합니다.
-        복구 실패에 대비해 recovery 전에 cold backup을 실시 합니다.
-        cold backup시 redo log file과 control file도 포함하여 백업을 하며 아카이브 로그도 별도의 공간에 백업을 해 둡니다.
-        불완전 복구는 mount 상태에서 복구가 진행되므로 일반 사용자는 DB를 사용할 수 없습니다.
-        백업된 모든 데이터 파일과 백업 시점에서 복구를 원하는 시점까지의 아카이브 로그가 필요 합니다.
-        복구가 끝난 후 resetlog 옵션을 통해 데이터베이스를 시작하면 로그 시퀀스가 초기화 되어 이전의 로그 파일이나 Archive Log File은 더 이상 이용할 수 없습니다. 그러므로 반드시 정상적으로 동작하는 것을 확인 후 cold backup을 해야 합니다. cold backup이 끝나면 이전에 만들어진 Archive Log File은 삭제 합니다.

오라클 export와 tablespace

oracle, oracle교육, oracle강좌, oraclejava, javaoracle, 오라클, 오라클자바, 자바오라클, 오라클교육, 오라클강좌, 구로디지털 오라클, 구로 오라클, 가산 오라클

export와 tablespace


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터 
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

oracle9i에서는 지정된 tablespace의 object를 export 받기위한 옵션으로 tablespace parameter를 사용할 수 있게 되었습니다. (8i에서 이 parameter는 다른 데이터베이스로 옮길 테이블스페이스를 지정하였으나 9i에서는 지정된 테이블스페이스의 object를 export 하겠다는 개념으로 바뀜)

이 parameter를 사용하기 위해서는 해당 user에게 export_full_database privilege가 부여되어 있어야 하는데 아래의 예제를 보면서 이해 바랍니다.

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


C:\Documents and Settings\이종철>sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on Fri Mar 11 08:48:31 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL> create tablesapce test datafile
  2  'c:\oracle\oradata\wink\test01.dbf' size 1m;
create tablesapce test datafile
      *
ERROR at line 1:
ORA-00901: invalid CREATE command


SQL> create tablespace  test datafile
  2  'c:\oracle\oradata\wink\test01.dbf' size 1m;

Tablespace created.

SQL> conn scott/tiger
Connected.

SQL> create table mytest (
  2  id number,
  3  name varchar2(20),
  4  addr varchar2(50),
  5  amount number,
  6  hiredate date)
  7  partition by list(addr)
  8  (
  9  partition test_1 values ('서울','부산'),
 10  partition test_2 values ('광주','대구'),
 11  partition test_3 values ('제주','춘천') tablespace test,
 12  partition test_4 values ('수원','대전') tablespace users
 13  )
 14  /

Table created.

SQL> insert into mytest values (1,'1길동','서울',10000, sysdate);

1 row created.

SQL> insert into mytest values (2,'2길동','부산',20000, sysdate);

1 row created.

SQL> insert into mytest values (3,'3길동','제주',30000, sysdate);

1 row created.

SQL> insert into mytest values (4,'4길동','춘천',40000, sysdate);

1 row created.

SQL> insert into mytest values (5,'5길동','대전',50000, sysdate);

1 row created.

SQL> select segment_name, partition_name
  2  from user_segments
  3  where tablespace_name = 'TEST';

SEGMENT_NAME
--------------------------------------------------------------------------------

PARTITION_NAME
------------------------------
MYTEST
TEST_3


SQL> conn / as sysdba
Connected.
SQL> grant exp_full_database to scott;

Grant succeeded.

SQL> grant imp_full_database to scott;

Grant succeeded.

SQL> exit

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
EXP-00000: Export terminated unsuccessfully

C:\Documents and Settings\이종철>exp userid=scott/tiger tablespaces=test

Export: Release 9.2.0.1.0 - Production on Fri Mar 11 08:59:16 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses KO16MSWIN949 character set (possible charset conversion)

About to export selected tablespaces ...
For tablespace TEST ...
. exporting cluster definitions
. exporting table definitions
. . exporting table                        MYTEST
. . exporting partition                        TEST_1          2 rows exported
. . exporting partition                        TEST_2          0 rows exported
. . exporting partition                        TEST_3          2 rows exported
. . exporting partition                        TEST_4          1 rows exported
. exporting referential integrity constraints
. exporting triggers
Export terminated successfully without warnings.


===================================================================
한가지 특이한 점은 지정된 tablespace 내의 object와 연관된 다른 tablespace의 object도 같이 export/import 된다는 것이다.
===================================================================

[ORACLEJAVA커뮤니티]DBMS_STATS 패키지 사용하기 오라클강좌

DBMS_STATS 패키지 사용하기 오라클강좌

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터 
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
 
 
오라클은 테이블이나 인덱스와 같은 데이터베이스 오브젝트에 대한 통계 정보 생성을 용이하게 하기 위해 DBMS_STATS 패키지를 제공 합니다이 패키지를 이용하면 테이블이나 인덱스의 모든 데이터를 근간으로 통계 정보를 생성 할 수 있으며 생성된 Sample 데이터를 기반에서 하여 통계 정보를 평가 하는 것이 가능 합니다.
 
대용량의 테이블이라면 모든 데이터를 가지고 액세스 경로를 추측 하는 것 보다 이러한 샘플링 데이터를 가지고 추측하는 것이 훨씬 용이하다대체로 샘플링 데이터는 5% 이하로 row block에 만들며 DBMS_STATS PACKAGE automatic sampling procedure를 이용하는 것이 좋습니다.
 
통계정보용 테이블 생성하기 DBMS_STATS 패키지의 create_stat_table 프러시져를 이용하여 만들면 됩니다아래의 예를 보죠
 
SQL> conn / as sysdba
연결되었습니다.
SQL> execute dbms_stats.create_stat_table('scott','stat_tab','users');
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
여기에서 사용된 인자는 계정통계정보용 테이블 이름테이블스페이스 이름 입니다.
 
자 이번에는 통계정보를 모아 볼까요,,,
 
DBMS_STATS 패키지에는 몇 개의 유용한 프러시저가 있는데 다른 레벨로 통계 정보를 생성 할 수 있습니다.
 
Gather_database_ stats: 데이터베이스의 모든 Object에 대해 통계 정보를 생성 합니다.
Gather_schema_ stats: 해당 스키마의 Object에 대해 통계 정보를 생성 합니다.
Gather_table_stats : 테이블과 그 테이블과 연관된 인덱스에 대해 대해 통계 정보를 생성 합니다.
Gather_index_stats : 인덱스에 대해 대해 통계 정보를 생성 합니다.
 
아래의 예제를 참고 하세요
 
아래는 SCOTT이라는 스키마 계정과 EMP라는 테이블에 대해 통계 정보를 생성 했습니다.
 
SQL> execute dbms_stats.gather_schema_stats(ownname => 'scott');
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
SQL>  execute dbms_stats.gather_table_stats('scott','emp');
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
SQL>select * from dba_tables where owner = SCOTT 으로 확인 하자.
 
)위의 예제인 경우 자동으로 테이블과 인덱스의 모든 데이터에 대해 통계 정보가 계산 됩니다만약 만들 통계정보가 단순히 샘플이거나 큰 테이블의 모든 데이터가 아니라 일부의 레코드에 대해 제한하는 경우엔 dbms_stats.auto_sample_size를 이용 합니다아래의 예를 참고 하세요~
 
SQL> execute dbms_stats.gather_schema_stats(ownname => 'scott', estimate_percen => dbms_stats.auto_sample_size);
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
이번에 시스템과 관련된 통계 정보를 생성하여 보도록 하겠습니다.
 
dbms_stats를 이용하여 CBO(cost based optimizer)에게 system performance 통계정보를 제공 할 수 있는데  이 패키지는 CPU 사용과 I/O 퍼센트 등의 정보도 통계정보를 생성시 추가 합니다. dbms_stats.gather_system_stats 프러시저를 이용하면 되며 파라미터는 다음과 같습니다.
 
Gathering_mode : 통계 정보에 대한 수집을 특정한 시기 또는 기간에 하는 경우에는 interval 이나 start/stop 값을 주면 됩니다. noworkload라고 하면 시스템은 통계 정보를 general하게 수집 합니다.
 
Interval : Gathering_mode에서 interval이라고 한 경우에만 사용 합니다.
Stattab : 시스템의 통계 정보가 모아질 테이블을 기술 합니다.
 
Statown : 시스템의 통계 정보가 모아질 테이블의 Owner를 기술 합니다. (현재 패키지를 실행 할 Schema와 다를 경우에 기술 합니다)
 
SQL> begin
  2  dbms_stats.gather_system_stats (
  3     gathering_mode => 'interval',
  4     interval => 60,
  5     stattab => 'stat_tab',
  6     statown => 'scott');
  7  end;
8  /
 
PL/SQL 처리가 정상적으로 완료되었습니다.
 
)DBMS_STATS.gather_system_stats 를 사용전에 job_queue_processes 매개변수를 SET 시켜야 합니다기본값은 0으로 양수값으로 세팅 해야 합니다그렇지 않으면 gather_system_stats 프러시져가 동작하지 않을 수 있습니다현재 세션에서 이 값을 다이나믹하게 설정 할려면 alter system set job_queue_processes = 20 이라고 하면 됩니다.

oracle cursor sgaring parameter

cursor sgaring parameter

CURSOT_SHARING 파라미터


 
구로디지털 오엔제이프로그래밍실무교육센터
www.onjprogramming.co.kr
 
 
 
비슷한 조건 문을 가지는 문장에 대해 SQL문을 공유하기 위해서는 이전 강좌 처럼 바인드 변수를 이용 할 수 있습니다. 이전강좌에서 상수 값을 다르게 주게 되는 경우 서로 다른 SQL로 인식을 하여 하드 파싱(처음 보는 SQL문으로 인식하여 일일이 파싱)을 한다고 하였습니다.

 Oracle 8.1.6
에서 소개된 Cursor_Sharing 변수는 각각의 문장들에 대해 bind 변수로 처리하지 않게 되더라도 내부적으로 바인드 변수로 처리하여 각각의 Cursor에 대해 공유가 가능 하도록 했습니다. 실제 이 기능은 Bind 변수를 쓰는 것 보다는 빠르지 않지만 Literal SQL문을 이용하는 것보다 20~30% 성능 향상이 있는 것으로 검증 되었습니다.
 
1. CURSOR_SHARING = EXACT
 
SQL문장이 모두 동일해야만 Soft Parsing이 가능 합니다.(재사용 한다는 이야깁니다.) Where절의 상수까지도 같아야 합니다.
 
다음예문을 참고 하세요~
SQL>conn / as sysdba
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
SQL> alter session set cursor_sharing = exact;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 
 SQL                                        COUNT(*)    총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = 10         1            1
select dname from dept where deptno = 40         1            1
 
파싱을 2번한 것을 알 수 있습니다
 
 
2. CURSOR_SHARING = SIMILAR
 
SQL문은 동일 해야 하며 조건에 정의된 바인드 변수의 값이 다르더라도 하나의 SQL문으로 간주하여 Soft Parsing 합니다. 이 값은 결국 다른 상수 값을 사용하더라도 하나의 SQL문으로 인식합니다, 3번의 경우(FORCE)와 같은 결과를 나타냅니다.
 
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
SQL> alter session set cursor_sharing = similar;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 SQL                               COUNT(*)          총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = :"         1            2
 
파싱이 한번만 일어남을 알수 있다
 
 
 
3. CURSOR_SHARING = FORCE
 
WHERE 조건절에 정의된 상수가 다르더라도 Soft Parsiing을 합니다.
 
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
 
SQL> alter session set cursor_sharing = force;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 SQL                               COUNT(*)          총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = :"         1            2