반응형

아래 내용은 http://home.bcline.com/hoya1/ 의 게시판에 있는 내용으로서 오라클 사용자 분들에게 유용할 것으로 판단되어 올려 둡니다. 참조하시기 바랍니다. 혹시 도움이 되셨다면 원래의 홈페이지에 들리셔서 감사의 말씀 좀 전하도록 하세요. :-)

==============================

 

ORA-01157 cannot identify data file %s

 

01157, 00000, "cannot identify data file %s - file not found"

// *Cause: The background process was not able to find one of the data files.

// The database will prohibit access to this file but other files will

// be unaffected. However the first instance to open the database will

// need to access all online data files. Accompanying error from the

// operating system describes why file was not found.

// *Action: Have operating system make file available to database. Then either

// open the database or do ALTER SYSTEM CHECK DATAFILES.

 

1. 데이타 화일을 백업받아놨다면

--- ERROR위치에 데이타화일을 옮겨 놓고 기동시킨다.

2. 데이타 화일이 없을시

--- 문제의 데이타 화일을 확인후 회이을 오라클상에서 삭제하여 오라클이 정상적으로 가동하도록 만들어 주어야 한다.

가동한 후에는 이 데이타 화일로 구성된 테이블 스페이스도 지워주어야 한다.

1>connect internal

2>startup mount

3>alter database datafile '/oracle/data/user1.dbf' offline drop

4>drop tablespace 테이블스페이스명 including contents;

 

ORA-1547 Tablesapce에서 Free Space 부족시

 

***ORA-1547(Failed to allocate extent of sizes% in tablespace ‘USERS’)

 

***발생원인

1. table이 요구하는 next extent의 크기가 tablespace의 freespace를 초과할때.

2. index생성시 rollback segment나 sort area로 쓰이는 temporay tablespace부족할때

3. SQL*Forms30등을 사용할때, 관련 table을 포함하고 있는 Tool tablespace부족할때 발생한다.

 

***해결방법

 

1. 다음 스크립트을 이용해 테이블 스페이스별 프리영역을 체크한다.

 

SELECT a.tablespace_name,

a.total "Total(Mb)",

a.total - b.free "Used(Mb)",

nvl(b.free,0) "Free(Mb)",

round((a.total - nvl(b.free,0))*100/total,0) "Used(%)"

from ( select tablespace_name,

round((sum(bytes)/1024/1024),0) as total

from dba_data_files

group by tablespace_name) a,

( select tablespace_name,

round((sum(bytes)/1024/1024),0) as free

from dba_free_space

group by tablespace_name) b

where a.tablespace_name = b.tablespace_name(+)

order by a.tablespace_name;

 

->FREE영역의 사용율을 보고 사용되는 FREE SPACE를 볼수 있다.

 

2. 해당 테이블 스페이스가 사용하는 SEGMENT를 DBA_SEGMENTS를 이용해 조사하여 불필요하게 혹은 TEMP성으로 생성된 테이블을 DROP한다.

 

3. 해당 tablespace의 datafile size를 늘려준다

-> alter database datafile ‘users01’ resize 10m;

-> alter tablespace add datafile ‘users02’ to TBLSPACE;

 

4. table의 next를 check 후 지나치게 큰 next size 조정한다

-> alter table AAA storage ( next 2m);

 

5. export/Import로 fragmenation을 정리한다.

 

ORA-00604 error occurred at recursive SQL level %s

 

// *Cause: An error occurred while processing a recursive SQL statement

// (a statement applying to internal dictionary tables).

// *Action: If the situation described in the next error on the stack

// can be corrected, do so; otherwise contact Oracle Support

 

이 에러는 내부적으로 SQL명령이 실행될 때 발생한다. 예를 들어 현재 할당된 익스텐트가 가득 차서

다음 익스텐트를 할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여

SELECT명령을 내리게 되는 것과 같은 경우이다.

 

이 문제가 발생하 우선 alert.log 화일을 검사하여 ORA-600 과 같은 에러가 발생했는가를 확인한다. ORA-600 에러가 발생했다면 오라클측에 지원을 요청하도록 하고 그렇지 않다면 다른 원인을 검사해 봐야 한다.

 

가장 먼저 고려할 사항은 ?/dbs/init.ora 화일에 지정된 open_cursors 의 크기를 알아보는 것이다.

이 값이 설정이 안되어 있으면 Default가 50이므로

open_cursors=255

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

와 같이 설정하도록 한다. 이 값은 단지 커서의 최대 값을 지정하는 것이므로 커서를 적게 쓰는 프로그램에 아무런 영향을 끼치지 않는다. open_cursors를 변경하고 DB를 Shutdown 하고 Startup 시키면 된다.

 

* Cursor란 무엇인가?

Cursor는 SQL문장을 실행하기위해 DATABASE가 사용하는 Memory의 영역을 말한다.

DATABASE에서 갖는 Open_Cursor의 Default값은 50이다.

Maximum값은 User가 사용하는 System 에 따라 결정된다.

User의 환경에 따라 Open_Cursor의 적정값을 설정할 필요 있다.

 

만약 이 방법으로 해결이 안되면 다음의 방법을 따른다.

정확한 에러의 원인을 찾기 위해서 init.ora 화일에 다음과 같은 라인을 추가한다.

events = "604 trace name errorstack"

 

이렇게 init.ora를 변경하고 DB를 Shutdown 하고 Startup 하면 ORA-604 에러가 발생하는 경우에 자세한 정보를 Trace 화일에 기록해 주므로 이 화일을 검사하여 에러의 원인을 찾을 수 있다.

 

에러의 다른 원인으로는 init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES 의 값이 너무 작게 설정된 경우를 생각해 볼 수 있다.

이와같은 경우는 이들 값을 크게 설정해 주도록 한다.

 

테이블 스페이스가 가득 차거나 Extent 갯수의 최대 허용값을 초과해서 에러가 발생하는 경우 ORA-604 에러가 함께 발생할 수가 있는데 이와같은 경우에는 이들 문제를 먼저 해결하면 ORA-604 에러는 함께 해결 된다.

 

**참조:ORACLE BULLETIN NOTES

 

ORA-12154: TNS:서비스명를 해석할 수 없습니다.

 

oracle 홈아래 network\admin의 tnsnames.ora file에서 설정한 alias를 해석못한다는 의미입니다.

아마도 tnsnames.ora file에서 설정한 host나 db sid등이 맞는지 확인 해 조세요,,,

 

< 예제 : TNSNAMES.ORA >

NT_SRV.world =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS =

(COMMUNITY = NTCommun.world)

(PROTOCOL = TCP)

(Host = 127.1.1.10)

(Port = 1521)

)

)

(CONNECT_DATA = (SID = ORCL)

)

)

 

ORA-01658: unable to create INITIAL extent for segment in tablespace WEBDB01

 

ORA 01658 ERROR는 다음과 같은 경우에 발생합니다.

* DML 수행시

* OBJECT 생성시

* Forms, Reports, CDE TOOL 수행시

* application. 수행시

 

ct40:/user4/guest/sdh/sql> oerr ora 01658

01658, 00000, "unable to create INITIAL extent for segment in tablespace %s"

// *Cause: Failed to find sufficient contiguous space to allocate INITIAL

// extent for segment being created.

// *Action: Use ALTER TABLESPACE ADD DATAFILE to add additional space to the

// tablespace or retry with a smaller value for INITIAL

 

오라클에서 EXTENT를 ALLLOCATE할려구 할시.. 충분한 여유공간이 없어서 생기는 에러입니다..

그럼 원인은

1. WEBDB01에 층분한 여유공간이 없다.

2. INITIAL EXTENT의 크기가 지나치게 크게 잡혔다.

 

CASE1 :

다음 스크립트로 먼저 FREESPACE를 CHECK하시면 FREE영역이 거의 없음을 확인 할수 있을 겁니다..

SELECT a.tablespace_name,
             a.total "Total(Mb)",
             a.total - b.free "Used(Mb)",
             nvl(b.free,0) "Free(Mb)",
             round((a.total - nvl(b.free,0))*100/total,0)  "Used(%)"
from     (select   tablespace_name, round((sum(bytes)/1024/1024),0) as total
             from     dba_data_files
             group   by tablespace_name) a,
           (select  tablespace_name, round((sum(bytes)/1024/1024),0) as free
            from      dba_free_space
            group by tablespace_name) b
where   a.tablespace_name = b.tablespace_name(+)
order by a.tablespace_name
TABLESPACE_NAME                 Total(Mb)   Used(Mb)   Free(Mb)    Used(%)
------------------------------ ---------- ---------- ---------- ----------
BRS1_CODE                               4          1          3         25
D2K_D1                               2000       1232        768         62
D2K_D2                               2000       1418        582         71
..............................................

WEBDB01에 여유분의 데이타 화일을 추가시키시거나, 불필요하게 그 테이블스페이스를 점유하고

있는 OBJECT를 정리합니다.

CASE2: 
   select SEGMENT_NAME, SEGMENT_TYPE, INITIAL_EXTENT, NEXT_EXTENT
   where TABLESPACE_NAME ='WEBDB01'
   and    SEGMENT_NAME= 'AAA '

로 INITIAL_EXTENT의 크기를 확인해 크게 잡혔다면 작게 사이즈를 조정합니다.

 

ORA-20003 - The object that you specified is invalid and cannot be described.

 

1. 호출하고 있는 프로시져의 권한이 있는지, VALID 한지 확인 합니다.

 

** PROCEDURE 의 INVALID

select count(*) from dba_objects

where status='INVALID';

 

select object_name,object_type,owner

from dba_objects

where status='INVALID';

 

 

OBJECT_NAME OBJECT_TYPE OWNER

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

CURSOR_TEST PROCEDURE SCOTT

 

-> INVALID 하다면 재 컴파일 합니다.

 

2. 프로시져가 실제로 존재하는지 확인합니다.

3. 포로시져 이름이나 파라미터를 확인합니다.

 

ora-00102 에러중에서 MTS_DISPATCHERS

 

발생윈인:

 

ORA-00101 에러는 MTS_DISPATCHERS 파라미터에 대한 잘못고니 SETTING 으로 발생합니다.

 

o You are installing 8.1.5 software and creating the default

database on NT (or Linux) and receive the ORA-0101 error.

 

00101, 00000, "invalid specification for system parameter mts_dispatchers"

// *Cause: The syntax for the "mts_dispatchers" parameter is incorrect.

// *Action: refer to the manual for correct syntax.

 

o You ignore this error and continue with the install and

immediately receive the ORA-0102 error.

 

00102, 00000, "network protocol %s cannot be used by dispatchers"

// *Cause: The network specified in "mts_dispatchers" doesn't have the

functionalities required by the dispatchers.

// *Action: refer to the manual on network protocols supported by the

dispatchers.

 

 

해결 방법:

 

Solution Description:

=====================

mts_dispatchers = "(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)"

# Uncomment the following line when your listener is configured for

# SSL

# (listener.ora and sqlnet.ora)

# mts_dispatchers =

# "(PROTOCOL=TCPS)(PRE=oracle.aurora.server.SGiopServer)"

 

mts_servers = 1

 

o After this you should be able to complete your install without

receiving these errors.

 

o A possible workaround may be to # out the parameters

mts_dispatchers and mts_servers.

 

00102 문제에서 log 파일에서 에러와 어떻게 풀어야 할지

 

## listener.ora

LISTENER =

(ADDRESS_LIST =

(ADDRESS= (PROTOCOL= TCP)(Host=192.168.1.1)(Port= 1521))

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = naun)

(ENVS = 'EPC_DISABLED = TRUE')

)

)

STARTUP_WAIT_TIME_LISTENER = 0

CONNECT_TIMEOUT_LISTENER = 10

TRACE_LEVEL_LISTENER = OFF

 

## tnsnames.ora

linux.world =

(DESCRIPTION =

(ADDRESS = (PROTOCOL=TCP) (host= 192.168.1.1)(port= 1521))

(CONNECT_DATA =

(SID = naun))

)

 

이와같이 고치시고 리스너 다시 START후 실행해보세요

 

ORA-12571: TNS:packet writer failure 에러

 

LISTENER.ORA and TNSNAMES.ORA,의 IP와 host명을 확인해 보세여

 

또한

SQLNET.ORA 의 다음 entry를 Client, 서버단에서 모두 제거 하세요..

SQLNET.EXPIRE_TIME=0

 

출처 : http://database.sarang.net/?inc=read&aid=9199&criteria=oracle&subcrit=&id=&limit=20&keyword=exp+%C6%C4%C0%CF+%B0%CB%BB%E7&page=1

반응형
반응형

sysaux 테이블스페이스는 오라클 10g 버전을 통하여 새롭게 소개되는 테이블스페이스로서 기존의 시스템 테이블스페이스에 저장되어 관리되어 오던 여러 요소들 가운데, 일부 또는 별도의 테이블스페이스의 생성을 요구하는 이들 요소를 한 공간에 저장, 관리하는 기능을 제공하게 될 시스템 관리 테이블스페이스이다.

sysaux 테이블스페이스에 저장, 관리되어지는 기능은 다음과 같다.

STATSPACK statspack 패키지, 정보저장공간 perstat
LOGMGR Logminer 정보저장공간 system
STREAMS 오라클 스트림 정보저장공간 sys
SMC 서버관리 요소 저장공간 sys
ODM 오라클 데이터 mining 정보 저장공간 dmsys
WM workspace manager 정보 저장공간 wmsys
ORDIM 오라클 인터미니어 ORDPLUG 요소 정보 저장공간 ordsys
TEXT 오라클 text 정보 저장공간 ctxsys
ULTRASEARCH 오라클 ultrasearch 정보 저장공간 wksys
JOB_SCHEDULER 오라클 job scheduler 정보 저장공간 sys
XSOQHIST OLAP API 테이블 정보 저장공간 sys
LOGSTDBY logical standby system
EM enterprise manager 정보 저장공간 sysman

기본적으로 오라클을 설치하면 sysaux 테이블스페이스가 설정되지만, 사용자가 다음과 같이 임의로 데이터 파일의 위치와 이름을 지정하여 만들 수도 있다.

SQL> crerate database jo  2  datafile '/export/home0/oracle/app/oracle/oradata/orcl/jo_system.dbf' size 500M 3  sysaux datafile '/export/home0/oracle/app/oracle/oradata/orcl/jo_sysaux.dbf' size 200M 4  default temporary tablespace temp_ts 5  tempfile '/export/home0/oracle/app/oracle/oradata/orcl/jo_temp.dbf' size 50M 6  undo tablespace undo 7  datafile '/export/home0/oracle/app/oracle/oradata/orcl/jo_undo.dbf' size 100M; 그리고 다음과 같이 이미 생성된 sysaux 테이블스페이스의 공간을 인위적으로 조절할 수 도 있다. SQL> alter tablespace sysaux add datafile 2  '/export/home0/oracle/app/oracle/oradata/orcl/jo_sysaux02.dbf' size 200M; sysaux 테이블스페이스는 다음과 같은 점에 유의해야 한다.

. 일단 데이터베이스를 시작하게 되면 sysaux 테이블스페이스를 제거할 수 없다.
. sysaux 테이블스페이스는 오라클 이동 가능 테이블스페이스(transportable tablespace) 기능을 사용하여 다른 데이터베이스에 이동할 수 없다.
. 데이터베이스가 시작되어진 상태에서 sysaux 테이블스페이스의 이름을 변경(rename)할 수 없다.
. 오라클 10g 버전으로 migration하는 경우 sysaux 테이블스페이스를 생성해 줄 수 있는데 이때 반드시 데이터베이스는 migrate 모드에서 오픈 되어져 있어야 한다.
. sysaux 테이블스페이스에 손상이 발생한 경우 전체 시스템에는 별 영향을 주지 않는다.
단, sysaux 테이블스페이스에 저장, 관리되고 있는 아큐펀트에 대한 기능을 사용할 수 없다.

SQL>  select occupant_name,schema_name from v$sysaux_occupants; 
 
OCCUPANT_NAME      SCHEMA_NAME
------------------ -----------------------
LOGMNR             SYSTEM
LOGSTDBY           SYSTEM
STREAMS            SYS
XDB                XDB
AO                 SYS
XSOQHIST           SYS
XSAMD              OLAPSYS
SM/AWR             SYS
SM/ADVISOR         SYS
SM/OPTSTAT         SYS
SM/OTHER           SYS
STATSPACK          PERFSTAT
ODM                DMSYS
SDO                MDSYS
WM                 WMSYS
ORDIM              ORDSYS
ORDIM/PLUGINS      ORDPLUGINS
ORDIM/SQLMM        SI_INFORMTN_SCHEMA
EM                 SYSMAN
TEXT               CTXSYS
ULTRASEARCH        WKSYS
JOB_SCHEDULER      SYS
 
22 rows selected.
 
SQL>

[출처] sysaux 테이블스페이스란?|작성자 레인보우

 

 

 

-- 조회방법


select OCCUPANT_NAME,SCHEMA_NAME,SPACE_USAGE_KBYTES from V$sysaux_occupants;


select sum(bytes)/1024/1024/1024 from dba_segments where tablespace_name='SYSAUX';

 

반응형
반응형

결정 요소 : UNDO_RETENTION, DB_BLOCK_SIZE, 초당 생성되는 UNDO 데이터 블럭 수

SELECT SUM(UNDOBLKS)/SUM((EDN_TIME-BEGIN_TIME)*86400) FROM V$UNDOSTAT;

==> 초당 UNDO 데이터 블럭 수

 

SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"

FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),

          (SELECT (SUM(undoblks)/SUM(((end_time-begin_time)*86400))) AS UPS

           FROM v$undostat),

          (SELECT value AS DBS FROM v$parameter WHERE name = 'db_block_size');

반응형
반응형


토드에서 스키마 브라우져(Schema Brwoser) 에서

TAB들이 난무할때 좌우 선택 형태로 변환시키는거...







 

반응형
반응형

1. RANK () OVER ( [query_partition_clause] order_by_clause)

2. DENSE_RANK () OVER ( [query_partition_clause] order_by_clause)

3. PERCENT_RANK () OVER ([query_partition_clause] order_by_clause )

  --그룹 수에 대한 값의 순위 퍼센트를 계산범위 : 0 < PERCENT_RANK < 1

4. CUME_DIST ( ) OVER ( [query_partition_clause] order_by_clause )

  -- 누적 분포 (전체 중 특정한 값의 위치를 계산), 범위 : 0 < CUME_DIST < 1

5. NTILE (expr) OVER ( [query_partition_clause] order_by_clause )

  -- 분위수 계산

6. ROW_NUMBER () OVER ( [query_partition_clause] order_by_clause )

  -- 행의 수 계산 (파티션 내에서 각 행에 대해 1로 시작하여 정렬되어 정의되는 유일한 수를 할당)

 

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

[누적합]  :   ROWS UNBOUNDED PRECEDING

[이동평균]  :   ROWS 2 PRECEDING  (시간에 근거 - 시계열)

[중심평균]  :  현재 행이 중심이 된다.   (. 전날과 다음날과의 평균)

 

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

RATIO_TO_REPORT  : RATIO_TO_REPORT ( expr ) OVER ( [query_partition_clause] )

 

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

{LAG | LEAD} ( value_expr [, offset] [, default] )  OVER ( [query_partition_clause] order_by_clause )

 

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

[CUME DIST]  :   RANK () OVER ( [query_partition_clause] order_by_clause)  --> 누적분포

반응형
반응형

EXPORT받은 DUMP 파일의 CHARACTER SET 확인 방법
====================================================

다른 server에서 export받아온 dump file을 import시킬 경우 자주 겪게 되는
문제가 CHARACTERset에 관련된 것이다.
양쪽의 CHARACTERset이 같고 .profile의 환경변수(NLS_LANG)도 맞다고
생각되는 데도 import 시 segment fault가 발생되거나
imp-16, 36, 37, 38, 42, 43, 45, 49 등의 error가 발생되면 dump받아온 file을
의심해볼 필요가 있다.

이 때 dump file을 8진수로 변환해 보면 현재 export받은 file의
CHARACTERset을 쉽게 알 수 있다.


오라클 export file은 특별한 CHARACTER set을 사용해서 쓰여진다.
version 5, 6에서는 export 시 단지 두개의 CHARACTER set-ASCII와 EBCIDC-만이
지원되었으나, version 7에서는 지원하는 모든 CHARACTER set이 export 시에
사용될 수 있다. export 시 사용된 CHARACTER set은 dump file 내에 code로써
기술되는데 file의 첫 byte가 이것을 나타낸다.

1st byte 의미
----------------------------------------------------
1 version 5, 6의 ASCII CHARACTER set
2 version 5, 6의 EBCDIC CHARACTER set
3 version 7의 CHARACTER set.

"3"일 경우 두, 세번째 byte를 보고서 CHARACTER set을 판단한다.
아래에는 우리가 흔히 접하는 character set에 대한 CHARACTER set ID이다.

2nd 3rd value
--------------------------------------------------
000 001 US7ASCII
000 002 WE8DEC
000 037 WE8ISO8859P1
003 110 KO16KSC5601
003 147 UTF8 (oracle8.0 이상부터 지원)
: :
: :

export file을 체크하기 위해서는 다음의 unix command를 사용한다.


$ od -b expdat.dmp|more

0000000 003 000 001 105 130 120 117 122 124 072 126 060 067 056 060 062
0000020 056 060 062 012 104 112 115 113 111 115 012 122 124 101 102 114
          :
          :
위의 경우 1st byte가 003이므로 version 7이며, 3rd byte가 001이므로 ID가
1번인 US7ASCII가 CHARACTER set이 된다.

(비고:
  HP-UX에서 TEST 결과 DB CHARACTERSET이 무엇으로 지정되었건 EXPORT 시는
  USER의 .PROFILE에 있는 환경 변수를 기준하여 DUMP FILE을 WRITE하므로
  EXPORT 실시 때의 OS USER의 환경변수인 NLS_LANG 값이 상당히 중요함.)

          
from www.oracle.co.kr 
반응형
반응형

SQL> set markup html on
반응형
반응형

출처:http://blog.naver.com/rojinsong?Redirect=Log&logNo=50004423503

$ORACLE_HOME 디렉토리에 있는 설치화일을 전부삭제
/etc밑에 orainst.loc, oratab 삭제
/usr/local/bin/oraenv 파일삭제
/tmp디렉토리에서 관련파일삭제
elete the /etc/oratab file. If using 9iAS delete the /etc/emtab file also.
# rm /etc/oratab /etc/emtab
끝 재설치 하면됩니다.

반응형
반응형

얼마 전 database.sarang.net의 오라클 게시판에 DBMS_JOB을 이용해 원하는 작업을 08시, 14시, 20시에 실행시키는 방법을 묻는 질문이 올라왔다. 작업 간격이 규칙적일 때는 문제가 간단하지만 원하는 시간 간격이 불규칙하므로 그냥 JOB을 세 개 등록하면 어떻겠냐고 답했더니 이번에는 이 작업을 평일에만 실행시키게 하고 싶다고 했다. 즉 평일 08시, 14시, 20시에 작업이 실행되도록 하고 싶다는 것이었다.

그럼 문제를 풀기 전에 DBMS_JOB.SUBMIT 프로시저를 살펴보자. DBMS_JOB을 이용해 JOB을 등록시키려면 SUBMIT 프로시저를 사용해야 한다. 파라미터 중 next_date와 interval를 통해 작업 실행 시각을 조절할 수 있다.

DBMS_JOB.SUBMIT (
job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE DEFAULT sysdate,
interval IN VARCHAR2 DEFAULT 'null',
no_parse IN BOOLEAN DEFAULT FALSE,
instance IN BINARY_INTEGER DEFAULT any_instance,
force IN BOOLEAN DEFAULT FALSE);

next_date의 디폴트 값은 sysdate이므로 값을 주지 않으면 등록 즉시 실행된다. 그 다음 실행 시각은 JOB이 실행되기 직전 interval에 지정된 수식을 이용해 계산한다. (interval이 NULL일 경우는 작업이 한 번만 실행된다.) 파라미터 이름이 interval이기는 하지만 실제 의미는 interval이 아니라 "다음 실행될 시점을 계산할 수식"인 것이다. 만약 어떤 작업을 1시간에 1번씩 실행시키고 싶다면 interval을 'sysdate+1/24'로 주면 된다. 작업을 시작하기 전에 sysdate+1/24를 통해 다음 실행할 시각을 구하면 작업 시작 시간으로부터 1시간 후인 시각이 된다. 다음 작업 시작 시각을 알고 싶으면 ALL_JOBS의 NEXT_DATE 컬럼을 조회해 확인할 수 있다.

interval
작업 주기
'sysdate + 1/24'
1시간에 1번
'sysdate + 1'
1일에 1번
'sysdate + 7'
7일(일주일)에 한번

그런데 위와 같이 하면 작업 주기만 지정한 것일 뿐이다. 특정 시각에 JOB을 실행시키려면 다음과 같이 하면 된다.

interval
작업 시각
'trunc(sysdate) + 1 + 1/24'
매일 01시에 작업 실행
'trunc(sysdate, ''D'') + 7'
매주 일요일 00시에 작업 실행

interval 파라미터는 문자열로 주어야 하므로 수식 내에 따옴표(single quotation)이 있으면 따옴표를 두 개 써줘야 하는 것에 유의해야 한다. interval 수식이 복잡할 때는 확인하기가 어려울 수 있는데, 그럴 때는 interval 수식으로 직접 쿼리를 작성해 확인할 수 있다.
select trunc(sysdate, 'D') + 7 from dual;
이제 다음과 같이 다양한 경우에 대한 interval을 구해보자.

  1. 매주 토요일 새벽 1시에 실행
  2. 매월 1일 새벽 0시에 실행
  3. 매월 말일 밤 11시에 실행
  4. 평일(월화수목금) 밤 10시에 실행
  5. 불규칙한 시각, 8시, 14시, 20시에 한번씩

1번은 쉽다. 일단 next_date를 이번 주 토요일 새벽 1시로 지정하고, 그 다음 실행될 날은 거기서 7일 후가 된다. 즉,
next_date=>to_date('2007102701','YYYYMMDDHH24'),
interval=>'sysdate + 7'
월초나 월말의 경우는 add_months나 last_day를 이용해 구하면 된다.
매월1일 새벽 0시 작업 실행
next_date=>add_months(trunc(sysdate,'MM'),1),
interval=>'add_months(trunc(sysdate,''MM''),1)'

매월 말일 밤 11시에 작업 실행
next_date=>last_day(trunc(sysdate))+23/24,
interval=>'last_day(trunc(sysdate)+1)+23/24' -- 말일+1일은 다음달 1일
평일만 실행되도록 하기 위해서는 interval이 좀더 복잡해진다.
interval=>'trunc(sysdate) + decode(to_char(sysdate,''D''), ''6'', 3, ''7'', 2, 1) + 22/24'

요일을 구한 다음 토요일(to_char(sysdate,'D')='6')에는 작업 후 3일 후에, 일요일(to_char(sysdate,'D')='7')에는 작업 후 2일 후에, 평일에는 자업 후 1일 후에 작업이 다시 시작되도록 하면 된다. 이를 위해 DECODE 함수를 활용했다.

불규칙한 시간 간격일 경우에도 작업 시각을 기반으로 DECODE를 활용하면 가능할 것 같다. 그러나 하루 수행 횟수가 서너 번 정도라면 그냥 각 시각마다 실행되도록 서너 개의 JOB을 등록시켜주는 것도 생각해볼 수 있다.

원래 문제는 불규칙한 시각+평일 조건을 만족해야 하므로 하나의 interval 수식으로 해결하려면 수식이 무척 복잡해질 것 같다. interval 수식이 복잡해지면 이해가기도 어려워 진고, 나중에 수정하고 싶을 때 문제가 생길 수도 있다.

참고로 10g부터는 DBMS_JOB 대신 DBMS_SCHEDULER을 쓰도록 권고하고 있다.

출처 : http://ntalbs.blogspot.com/2007/10/database.html

반응형

'Database > ORACLE' 카테고리의 다른 글

ORACLE 조회 결과를 HTML로 출력하기  (0) 2009.03.08
LINUX에서 ORACLE 삭제  (0) 2009.03.08
DB NAME 과 SID 조회  (0) 2009.03.08
분석 함수  (0) 2009.03.08
집합 함수  (0) 2009.03.08
반응형

Oracle SID를 알려면 다음 처럼 질의 합니다.

SQL> select instance from v$thread;

INSTANCE
----------------
NEWS

Oracle DB_NAME은 다음 처럼 질의 하구요...

SQL> select name from v$database;

NAME
---------
NEWS

ORACLE_SID나 DB_SID는 같은 값을 가리키며 v$thread에서 확인 가능!!
DB_NAME은 v$database에서 확인 가능!!!
반응형

'Database > ORACLE' 카테고리의 다른 글

LINUX에서 ORACLE 삭제  (0) 2009.03.08
원하는 시간에만 DB 작업 실행시키기  (0) 2009.03.08
분석 함수  (0) 2009.03.08
집합 함수  (0) 2009.03.08
ORACLE 10G PL/SQL USER GUIDE AND REFERENCE  (0) 2009.03.08

+ Recent posts