最近有一個針對Oracle數(shù)據(jù)庫的一些指標(biāo)測試,其中包含了對多項Oracle數(shù)據(jù)庫的異常指標(biāo)進行了模擬涂籽。其中包含了模擬Oracle數(shù)據(jù)庫失敗job的指標(biāo)項苹祟,測試之后對Oracle失敗job的產(chǎn)生和清理有了一些了解。
失敗job的產(chǎn)生
Oracle數(shù)據(jù)庫在服務(wù)過程中為什么會出現(xiàn)失敗job评雌?出現(xiàn)失敗job會對數(shù)據(jù)庫有什么影響树枫?
在Oracle數(shù)據(jù)庫中能夠造成job失敗的原因有很多。以下是針對數(shù)據(jù)庫失敗job的一次模擬
最近測試過程中是通過定時任務(wù)往數(shù)據(jù)表中插入數(shù)據(jù)景东,接著刪除數(shù)據(jù)表砂轻。盡管數(shù)據(jù)表消失了,但是設(shè)置的定時任務(wù)并沒有退出斤吐,而根據(jù)定時任務(wù)的設(shè)置插入事務(wù)仍然不斷向已經(jīng)被刪除的表中插入數(shù)據(jù)搔涝,于是在數(shù)據(jù)庫中產(chǎn)生了大量的失敗job。
模擬過程
- 創(chuàng)建存儲過程并向表中插入數(shù)據(jù)
/* 數(shù)據(jù)庫中創(chuàng)建tab_time表和err_job存儲過程 */
SQL> create table tab_time(current_time timestamp);
SQL> CREATE OR REPLACE PROCEDURE err_job AS BEGIN
INSERT INTO tab_time VALUES ( SYSDATE );
commit;
END;
/
/* 調(diào)用創(chuàng)建的err_job存儲過程 */
SQL> BEGIN
err_job;
END;
/
/* 創(chuàng)建job,每10s向tab_ime插入一條數(shù)據(jù) */
SQL> DECLARE
job1 NUMBER;
BEGIN
dbms_job.submit ( job1, 'err_job;', SYSDATE, 'sysdate+10/86400' );
commit;
END;
/
- 查詢tab_time數(shù)據(jù)表中是否插入了數(shù)據(jù)
SQL> select * from tab_time;
CURRENT_TIME
---------------------------------------------------------------------------
19-MAR-22 11.41.49.000000 AM
19-MAR-22 11.42.07.000000 AM
- 刪除tab_time數(shù)據(jù)表
SQL> DROP TABLE tab_time;
失敗job查詢記清理
Oracle數(shù)據(jù)庫中執(zhí)行失敗的job會記錄在對應(yīng)的user_jobs視圖中曲初,該試圖包含如下字段
SQL> desc user_jobs
Name Null? Type
-------------------------------------------------------------------------- -------- --------------------------------------------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)
MISC_ENV RAW(32)
INSTANCE NUMBER
- JOB: 對應(yīng)用戶執(zhí)行的job id
- LOG_USER:對應(yīng)執(zhí)行job的用戶名稱
- SCHEMA_USER:表結(jié)構(gòu)所屬的用戶
- LAST_DATE: 最后一次任務(wù)執(zhí)行失敗的時間
- LAST_SEC: 任務(wù)執(zhí)行失敗的時分秒
- FAILURES: 任務(wù)執(zhí)行失敗的次數(shù)
- WHAT: 任務(wù)失敗對應(yīng)的存儲過程
- 查詢失敗job的數(shù)量
SQL> select JOB,FAILURES from user_jobs where failures <>0;
JOB FAILURES
---------- ----------
4 16
以上查詢結(jié)果說明体谒,job4 失敗了16次
- 清理失敗job
/* 通過調(diào)用dbms_job.remove()清理執(zhí)行失敗的job*/
SQL> BEGIN
dbms_job.remove(4);
commit;
end;
/
PL/SQL procedure successfully completed.
清理后再次查詢失敗次數(shù)>0的job,可以看到已經(jīng)沒有失敗job了
SQL> select JOB,FAILURES from user_jobs where failures <>0;
no rows selected