[20211203]演示job啟動時間改變的情況.txt
[20211203]演示job啟動時間改變的情況.txt
--//生產系統出現job啟動時間改變的情況,開發還是習慣使用job方式排程後臺任務,實際上應該嘗試使用schedule。
--//透過例子演示出來。
1.環境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
--//GRANT EXECUTE ON SYS.DBMS_LOCK TO SCOTT;
2.建立儲存過程:
CREATE OR REPLACE PROCEDURE SCOTT.foo
AS
BEGIN
NULL;
dbms_lock.sleep (600);
END;
DECLARE
X NUMBER;
BEGIN
begin
SYS.DBMS_JOB.SUBMIT
(
job => X
,what => 'SCOTT.FOO;'
,next_date => to_date('12/03/2021 17:15:02','mm/dd/yyyy hh24:mi:ss')
,interval => 'SYSDATE+1'
,no_parse => FALSE
);
:JobNumber := to_char(X);
exception
when others then
begin
raise;
end;
end;
END;
--//等17:15
SYS@book> select * from DBA_JOBS_RUNNING where job=371;
SID JOB FAILURES LAST_DATE LAST_SEC THIS_DATE THIS_SEC INSTANCE
---------- ---------- ---------- ------------------- ---------------- ------------------- ---------------- ----------
30 371 2021-12-03 17:15:02 17:15:02 0
--//已經啟動。
SYS@book> select sysdate from dual ;
SYSDATE
-------------------
2021-12-03 17:16:08
SYS@book> shutdown abort
ORACLE instance shut down.
SYS@book> startup
ORACLE instance started.
Total System Global Area 643084288 bytes
Fixed Size 2255872 bytes
Variable Size 205521920 bytes
Database Buffers 427819008 bytes
Redo Buffers 7487488 bytes
Database mounted.
Database opened.
SYS@book> select * from DBA_JOBS_RUNNING where job=371;
SID JOB FAILURES LAST_DATE LAST_SEC THIS_DATE THIS_SEC INSTANCE
---------- ---------- ---------- ------------------- ---------------- ------------------- ---------------- ----------
323 371 2021-12-03 17:16:39 17:16:39 0
--//可以發現啟動資料庫後,job重新執行。開始時間是2021-12-03 17:16:39,查詢job的定義還是:
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'SCOTT.FOO;'
,next_date => to_date('03/12/2021 17:15:02','dd/mm/yyyy hh24:mi:ss')
,interval => 'SYSDATE+1'
,no_parse => FALSE
);
SYS@book> select * from DBA_JOBS_RUNNING where job=371;
no rows selected
--//執行完成。
--//再次檢視定義:
DECLARE
X NUMBER;
user_name varchar2(30);
BEGIN
select user into user_name from dual;
execute immediate 'alter session set current_schema = SCOTT';
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => 'SCOTT.FOO;'
,next_date => to_date('04/12/2021 17:16:39','dd/mm/yyyy hh24:mi:ss')
,interval => 'SYSDATE+1'
,no_parse => FALSE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
execute immediate 'alter session set current_schema = ' || user_name ;
EXCEPTION
WHEN OTHERS THEN
execute immediate 'alter session set current_schema = ' || user_name ;
RAISE;
END;
COMMIT;
END;
/
--//現在下次的啟動實際變成了to_date('04/12/2021 17:16:39','dd/mm/yyyy hh24:mi:ss')。
--//我們生產系統遇到的情況就是這樣,資料庫重啟後,中斷的job啟動,這樣下次啟動job時間變成新的啟動時間。
--//實際上最主要的問題出現在interval => 'SYSDATE+1'定義上,如果我修改為
--//interval => 'trunc(SYSDATE+1)+17/24',這樣無論何種情況都是每天啟動都是17點,除了job中斷的情況(比如上面的資料庫異常關
--//閉)。另外注意如果寫成trunc(SYSDATE)+17/24,永遠都不會執行.
--//個人建議job時間設定為固定時間,而不是interval => 'SYSDATE+1'。我貼一個生產系統類似例子:
> select trunc(scsj),min(scsj) from XXXXX group by trunc(scsj) order by 1;
TRUNC(SCSJ) MIN(SCSJ)
------------------- -------------------
2021-08-19 00:00:00 2021-08-19 00:00:01
2021-08-20 00:00:00 2021-08-20 00:00:01
2021-08-21 00:00:00 2021-08-21 00:00:03
2021-08-22 00:00:00 2021-08-22 00:00:05
2021-08-23 00:00:00 2021-08-23 00:00:07 --//不知道為什麼這裡變大,我估計啟動時還是03秒。
2021-08-24 00:00:00 2021-08-24 00:00:03
2021-08-25 00:00:00 2021-08-25 00:00:04
2021-08-26 00:00:00 2021-08-26 00:00:06
2021-08-27 00:00:00 2021-08-27 00:00:07
2021-08-28 00:00:00 2021-08-28 00:00:08
2021-08-29 00:00:00 2021-08-29 00:00:08
...
2021-11-29 00:00:00 2021-11-29 00:02:17
2021-11-30 00:00:00 2021-11-30 00:02:18
2021-12-01 00:00:00 2021-12-01 00:02:19
2021-12-02 00:00:00 2021-12-02 00:02:19
2021-12-03 00:00:00 2021-12-03 00:02:19
2021-12-04 00:00:00 2021-12-04 00:02:21
2021-12-05 00:00:00 2021-12-05 00:02:24
2021-12-06 00:00:00 2021-12-06 00:02:26
110 rows selected.
--//該job 8/19啟用,scsj是執行插入的時間,但是你可以發現每天都在往後推遲一點點時間,到現在已經要2:26才開始插入,現在job的
--//next_date => to_date('07/12/2021 00:02:26','dd/mm/yyyy hh24:mi:ss').
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2845862/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20211011]跟蹤freespace空間的變化情況.txt
- [20211209]pdb資料庫kill job遇到的奇怪情況.txt資料庫
- [20190513]如何看windows的啟動時間.txtWindows
- vue在不確定介面何時請求完的情況下,如何改變陣列Vue陣列
- 不重啟mysql情況修改引數變數MySql變數
- [20201106]瞭解oracle資料庫啟動時間.txtOracle資料庫
- 時間可以改變一切
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況(網路的情況).txt
- [20231024]NULL值在索引的情況.txtNull索引
- [20180316]改變oracle使用者口令時限.txtOracle
- SQL中除數為0處理情況演示SQL
- [20211020]改變備庫的rman配置.txt
- [20211203]為什麼出現負數3.txt
- Flask 框架啟動無法改變埠Flask框架
- 變數轉化為判斷條件時的各種情況變數
- 使用RecyclerView動態改變item時遇到的坑View
- 線性時間選擇(含平均情況O(n)和最壞情況O(n)演算法)演算法
- [20180310]12c exp 無法dirct的情況.txt
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況.txt
- [20220216]為什麼出現這樣的情況.txt
- 如何在不重新啟動phantomjs的情況下修改HTTP代理?JSHTTP
- Apollo啟動配置排查,超時時間的配置
- docker容器無法啟動的情況下,如果修改配置檔案Docker
- Linux 檢視程式啟動時間、執行時間Linux
- APP啟動時間優化APP優化
- App啟動時間(翻譯)APP
- 總結Oracle根據時間查詢的一些常見情況Oracle
- [20201112]nid改變資料庫名字.txt資料庫
- Activity啟動模式(GIF 動態演示)模式
- flutter改變圖示和名稱、啟動圖Flutter
- 監控java程式啟動時的CPU使用情況Java
- 《前端實戰總結》如何在不重新整理頁面的情況下改變URL前端
- 演示如何建立 POSIX 相容的間隔定時器定時器
- 不用vuex的情況下,隔代元件間的通訊Vue元件
- [20231011]查詢sys.optstat_snapshot$瞭解表的DML情況.txt
- 3.1.5.3 在不掛載資料庫的情況下啟動例項資料庫
- [20211015]centos 7改變runlevels使用systemctl.txtCentOS
- Oracle11g RAC啟動關閉情況大概總結Oracle