2018年6月6日 星期三

ORACLE 11G 設定帶有參數的 SCHEDULER JOB


---------- 建立一個 SCHEDULER 裏頭的 PROGRAM 先設定變數型態
---------- 以下範例的 PROCEDURE 是需要帶入兩個參數 , 這邊先設定變數型態 一個是 NUMBER 另外一個是 VARCHAR2

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'DBA_TN_REPORT_P'
     ,program_type         => 'STORED_PROCEDURE'
     ,program_action       => 'DBA_TN_REPORT'
     ,number_of_arguments  => 2
     ,enabled              => FALSE
     ,comments             => 'DBA_TN_REPORT'
    );

  SYS.DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT
    (
      program_name         => 'DBA_TN_REPORT_P'
     ,argument_name        => 't_thread_no'
     ,argument_position    => 1
     ,argument_type        => 'NUMBER'
     ,default_value        => ''
    );

   SYS.DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT
    (
      program_name         => 'DBA_TN_REPORT_P'
     ,argument_name        => 't_over_night'
     ,argument_position    => 2
     ,argument_type        => 'VARCHAR2'
     ,default_value        => ''
    );

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



---------- 建立一個 SCHEDULER 設定排程, 且這邊帶入參數

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'DBA_TN_REPORT_JOB'
      ,start_date      => TO_TIMESTAMP_TZ('2017/04/14 01:54:00.000000 +08:00','yyyy/mm/dd hh24:mi:ss.ff tzr')
      ,repeat_interval => 'FREQ=minutely; INTERVAL= 3'
      ,end_date        => NULL
      ,program_name    => 'DBA_TN_REPORT_P'
      ,comments        => 'DBA_TN_REPORT_P'
    );
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'RESTARTABLE'
     ,value     => FALSE);
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'LOGGING_LEVEL'
     ,value     => SYS.DBMS_SCHEDULER.LOGGING_OFF);
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'MAX_FAILURES');
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'MAX_RUNS');
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'STOP_ON_WINDOW_CLOSE'
     ,value     => FALSE);
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'JOB_PRIORITY'
     ,value     => 3);
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'SCHEDULE_LIMIT');
  SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
    ( name      => 'DBA_TN_REPORT_JOB'
     ,attribute => 'AUTO_DROP'
     ,value     => FALSE);

---  這邊帶入想要的值進去
  SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
    ( job_name             => 'DBA_TN_REPORT_JOB'
     ,argument_name        => 't_thread_no'
     ,argument_value       => 1);
 
 
  SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE
    ( job_name             => 'DBA_TN_REPORT_JOB'
     ,argument_name        => 't_over_night'
     ,argument_value       => 's');
END;
/

ORACLE RAC ASM 出現 壞BLOCK


線上業務系統的DB,,, 突然被告知無法寫資料進去某張table

本以為是 table block 壞掉,,  
但被RD人員無法執行的SQL是 insert into .... select * from 

噴出來的錯誤訊息是 
### Cause: java.sql.SQLException: ORA-01578: ORACLE data block corrupted (file # 39, block # 288386)

查了一下 此 block 的 object  是什麼
select * from dba_extents where file_id = 39  and block_id >= 288381   and  block_id  <= 288386 +10

還好此 object 是 index ....  重新 rebuild  就可以正常運作


之後使用dbv 檢測一下此datafile
* 這邊的userid 必須可以登入 asm 且需要 sysasm 權限


[grid@db-15 ~]$ dbv file='+***_***01/**/datafile/l****.285.9909' userid=sysasm/******

DBVERIFY: Release 11.2.0.4.0 - Production on Wed Jun 6 15:25:28 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = +***_***01/**/datafile/l****.285.976987909


DBVERIFY - Verification complete

Total Pages Examined         : 1310720
Total Pages Processed (Data) : 431638
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 345145
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 4632
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 529305
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 0 (0.0)


沒有看到 Total Pages Marked Corrupt  筆數
...............

select * from v$database_block_corruption; 
也沒有資料了


比較可惜的是 此案例是線上生產DB, 比較急著要處理 ,就沒有完整紀錄處理前後DB的狀態





案例二:
出現了也是 相關錯誤, 但不是index ,

而是 partition table 的extent出現錯誤

這不過是已經沒資料的 partition table , 剛好可以直接砍掉, 
在重新執行一次 就沒問題


看來搜尋到空的partition table 的壞掉區段 他也會爆錯