메뉴 건너뛰기

Korea Oracle User Group

Admin

DBMS_SCHEDULER을 통해 OS 레벨(EXTERNAL)의 shell 수행하기

 

Test Case 1(실패 케이스)

 

원인 : 선행 작업으로 CREDENTIAL을 생성해야 하는데 이 과정이 생략되어 발생한 실패케이스 이다.

 

목적은 tkprof를 수행하여 10046 트레이스 파일을 분석하는 것이 목적이다.

아래의 코드로 DBMS_SCHEDULER을 등록해서 사용하는 방법을 테스트 한다.

 

BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name            => 'TKPR_JOB',
        job_type            => 'EXECUTABLE',
        job_action          => '/bin/bash',
        number_of_arguments => 3,
        start_date          => SYSDATE,
        repeat_interval     => null,
        end_date            => null,
        enabled             => FALSE,
        auto_drop           => TRUE);

    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name            => 'TKPR_JOB',
        argument_position   => 1,
        argument_value      => '/home/oracle/DBA/script/SHELL/temp/temp.sh');

    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name            => 'TKPR_JOB',
        argument_position   => 2,
        argument_value      => '/home/oracle/DBA/script/SHELL/temp/testdb_ora_5627.trc');

    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name            => 'TKPR_JOB',
        argument_position   => 3,
        argument_value      => '/home/oracle/DBA/script/SHELL/temp/test_tkprof.txt');

    DBMS_SCHEDULER.ENABLE(name => 'TKPR_JOB');
END;
/

 

temp.sh 의 내용은 아래와 같다.

 

#!/bin/bash

export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/home/oracle/app/oracle/product/12.1.0/:/home/oracle/12.1.0/grid:/home/oracle/app/oracle/product/12.1.0//bin

/home/oracle//app/oracle/product/12.1.0/bin/tkprof $1 $2 sys=no

 

Test Case 2 (성공 케이스)

 

1. 권한 부여

 

DB 사용 유저에게 권한을 부여한다.

 

GRANT CREATE JOB TO DB_MONITORING;
GRANT CREATE EXTERNAL JOB TO DB_MONITORING;
GRANT CREATE CREDENTIAL TO DB_MONITORING;

 

2 credential 생성

 

오라클 버전이 12.1 버전이라서 DBMS_CREDENTIAL 패키지를 사용한다.

 

BEGIN
  DBMS_CREDENTIAL.create_credential(
    credential_name => 'oracle_db_tkprof',
    username        => 'oracle',
    password        => 'oracle'
  );
END;
/

 

만약 오라클 버전이 11. 버전인 경우 아래와 같이 credential을 생성한다.

 

BEGIN
    DBMS_SCHEDULER.CREATE_CREDENTIAL(
        credential_name     => 'ORACLE_DB_TKPROF',
        username            => 'oracle',
        password            => 'oracle');
END;
/

 

3 External Shell Job 생성 및 실행

 

DECLARE
  l_script   VARCHAR2(32767);
BEGIN
  l_script := '#!/bin/bash
/bin/bash /home/oracle/DBA/script/SHELL/temp/temp.sh /home/oracle/DBA/script/SHELL/temp/testdb_ora_5627.trc /home/oracle/DBA/script/SHELL/temp/test_tkprof.txt';

  DBMS_SCHEDULER.create_job(
        job_name        => 'TKPR_JOB',
        job_type        => 'EXTERNAL_SCRIPT',
        job_action      => l_script,
        start_date      => SYSDATE,
        repeat_interval => null,
        end_date        => null,
        credential_name => 'oracle_db_tkprof',
        enabled         => TRUE,
        auto_drop       => TRUE);
END;
/

 

 

4 Job을 실행한 결과

 

COL JDATE FOR A20
COL OWNER FOR A15
COL JOB_CLASS FOR A10
COL CREDENTIAL_NAME FOR A20
COL OPERATION FOR A10
COL STATUS FOR A10
SELECT TO_CHAR(LOG_DATE,'YYYYMMDD HH24:MI:SS') JDATE
     , OWNER
     , OPERATION
     , STATUS
     , CREDENTIAL_NAME
FROM DBA_SCHEDULER_JOB_LOG
WHERE OWNER = 'DB_MONITORING'
AND JOB_NAME = 'TKPR_JOB';

JDATE                OWNER           OPERATION  STATUS     CREDENTIAL_NAME
-------------------- --------------- ---------- ---------- --------------------
20170405 09:45:32    DB_MONITORING   RUN        SUCCEEDED  ORACLE_DB_TKPROF

1 row selected.

 

또 다른 결과

 

COL JDATE FOR A20
COL OWNER FOR A15
COL CREDENTIAL_NAME FOR A20
COL STATUS FOR A10
COL SESSION_ID FOR A10
COL REQ_START_DATE FOR A20
COL ACTUAL_START_DATE FOR A20
COL CPU_USED FOR A20
COL ADDITIONAL_INFO FOR A40
COL OUTPUT FOR A40
SELECT TO_CHAR(LOG_DATE,'YYYYMMDD HH24:MI:SS') JDATE
      ,INSTANCE_ID
      ,SESSION_ID
      ,OWNER
      ,STATUS
      ,ERROR#
      ,REQ_START_DATE
      ,ACTUAL_START_DATE
      ,CPU_USED
      ,CREDENTIAL_NAME
      ,ADDITIONAL_INFO
      ,OUTPUT
FROM DBA_SCHEDULER_JOB_RUN_DETAILS
WHERE OWNER = 'DB_MONITORING'
AND JOB_NAME = 'TKPR_JOB';

JDATE                INSTANCE_ID SESSION_ID OWNER           STATUS         ERROR# REQ_START_DATE       ACTUAL_START_DATE    CPU_USED             CREDENTIAL_NAME      ADDITIONAL_INFO                          OUTPUT
-------------------- ----------- ---------- --------------- ---------- ---------- -------------------- -------------------- -------------------- -------------------- ---------------------------------------- ----------------------------------------
20170405 09:45:32              1 260,41585  DB_MONITORING   SUCCEEDED           0 05-APR-17 09.45.28.9 05-APR-17 09.45.28.9 +000 00:00:00.00     ORACLE_DB_TKPROF     EXTERNAL_LOG_ID="job_94499_452594",
                                                                                  27105 AM +09:00      44428 AM +09:00                                                USERNAME="oracle"                        TKPROF: Release 12.1.0.2.0 - Development on 수 4월 5 09:45:31 2017
                                                                                                                                                                                                               Copyright (c) 1982, 2014, Oracle and/or
                                                                                                                                                                                                               its affiliates.  All rights reserved.

1 row selected.

 

 

 

아래는 OS 레벨에서 생성된 파일을 확인한 내용이다.

 

 

/home/oracle/DBA/script/SHELL/temp> ls -al
합계 708
drwxr-xr-x. 2 oracle oracle   4096 2017-04-05 09:46 .
drwxr-xr-x. 3 oracle oracle   4096 2017-04-04 16:38 ..
-rwxr-xr-x. 1 oracle oracle    277 2017-04-04 19:15 temp.sh
-rw-rw-rw-. 1 oracle oracle  89012 2017-04-05 09:45 test_tkprof.txt
-rw-r-----. 1 oracle oracle 621526 2017-04-04 17:09 testdb_ora_5627.trc

 

5. credential 권한을 타 유저에게 부여하여 수행하기

 

GRANT EXECUTE ON ORACLE_DB_TKPROF TO KWAN;

DECLARE
  l_script   VARCHAR2(32767);
BEGIN
  l_script := '#!/bin/bash
/bin/bash /home/oracle/DBA/script/SHELL/temp/temp.sh /home/oracle/DBA/script/SHELL/temp/testdb_ora_5627.trc /home/oracle/DBA/script/SHELL/temp/test_tkprof.txt';

  DBMS_SCHEDULER.create_job(
        job_name        => 'TKPR_JOB',
        job_type        => 'EXTERNAL_SCRIPT',
        job_action      => l_script,
        start_date      => SYSDATE,
        repeat_interval => null,
        end_date        => null,
        credential_name => 'db_monitoring.oracle_db_tkprof',
        enabled         => TRUE,
        auto_drop       => TRUE);
END;
/

 

 

OS 레벨의 결과 내용

 

/home/oracle/DBA/script/SHELL/temp> ls -al
합계 708
drwxr-xr-x. 2 oracle oracle   4096 2017-04-05 11:09 .
drwxr-xr-x. 3 oracle oracle   4096 2017-04-04 16:38 ..
-rwxr-xr-x. 1 oracle oracle    277 2017-04-04 19:15 temp.sh
-rw-rw-rw-. 1 oracle oracle  89012 2017-04-05 11:09 test_tkprof.txt
-rw-r-----. 1 oracle oracle 621526 2017-04-04 17:09 testdb_ora_5627.trc

 

 

번호 제목 글쓴이 날짜 조회 수
34 Windows 접속 에러 ORA-12638 [1] file Talros 2024.02.14 477
33 Python 을 이용해 파일 업로드 해 보기 [1] file Talros 2023.04.19 1053
32 수집된 통계가 바로 반영되지 않고 원할 때 반영하도록 하는 방식 명품관 2023.04.04 746
31 ORA-28014: Cannot Drop Administrative Users 에러 현상 [1] 명품관 2023.03.27 2053
30 ORA-3136 inbound connection time out & JDBC Io exception: Connection reset [1] Talros 2023.02.24 1413
29 default 값을 포함한 컬럼 추가시 오라클 버전별 개선 사항 [1] 명품관 2023.01.17 1264
28 mbr(multi block read) 과 sbr(single block read) 사이에 과연 어떤 방식을 선택해야 할까요? [1] 명품관 2022.09.16 776
27 Schema password 재 사용 불가능 하게 하기 [1] Talros 2022.01.26 3857
26 Pga 메모리 설정관련 내용 [1] 우뽕 2021.03.05 2386
25 DB option Enable / Disable 정리 방법 - Mos 참고 file 우뽕 2021.01.31 1417
24 RECO 프로세스 트레이스 발생 하면서 ORA-02019 에러 발생시 명품관 2021.01.12 1484
23 OS 터미널 접속 없이 오라클 접속을 통해 OS CPU 사용율 모니터링 하기 [3] file 명품관 2020.12.22 1181
22 SQL Plan Management(SPM) - 3 Manual Plan Capture 명품관 2020.06.01 2044
21 SQL Plan Management(SPM) - 2 DBMS_SPM.CONFIG로 필터링 file 명품관 2020.03.26 991
20 SQL Plan Management(SPM) - 1 파라미터의 기능 확인 명품관 2020.03.19 1499
19 [12cR2 이상] 오브젝트 이름 30자이상 사용 가능 우뽕 2020.01.22 8105
18 Alert log 에서 갑자기 패치 정보가 나타나는 현상 Talros 2019.09.23 2032
17 External Table 기능을 사용해 파일 읽기 명품관 2017.04.05 1099
» DBMS_SCHEDULER을 통해 OS 레벨(EXTERNAL)의 shell 수행하기 명품관 2017.04.05 5946
15 오라클 패치 정보를 조회할 수 있는 뷰 DBA_REGISTRY_SQLPATCH 명품관 2017.03.02 5892
위로