DBMS_JOB 排程任務於 2004-11-17 上午 01:00 後全部停止執行,DBA_JOBS.NEXT_DATE 顯示應執行時間已過,但 LAST_DATE 停留在前一天。手動 DBMS_JOB.RUN() 正常。ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0 再設回 5,PMON 重啟 CJQ0,但 Job 仍不跑。反覆切換導致 CJQ0 直接死亡。CJQ0 正常啟動,但 Job 依然不執行。slgcsf() / slgcs() on Solaris will stop incrementing after 497 days。命中 Bug 2658749 / 3018952。Solaris gethrtime() 返回奈秒數。Oracle 內部 slgcs() 封裝此呼叫作為高精度計時器。當系統運行時間超過 **497 天 2 小時 28 分鐘** (約 42949672950000000 奈秒),gethrtime() 返回值超過 32 位無符號整數上限,導致 slgcs() 固定返回 0xFFFFFFFF。
Job 排程邏輯 kkJSsrh() 依賴 slgcs() 計算下次執行時間差 (now - kkjlsrt)。計時器停止遞增 → 時間差恆為 0 → 排程判斷「尚未到期」 → 永不觸發執行。
bash-2.03$ uptime
10:00pm up 500 day(s), 14:57, 1 user, load average: 1.31, 1.09, 1.08
bash-2.03$ date
Fri Nov 19 22:00:14 CST 2004
主機運行 500 天,精確落在 497 天臨界點之後。
V$TIMER 重新遞增。slgcs() 處理溢位),但 Solaris 平台 9.2.0.6 當時尚未釋出。DBMS_SCHEDULER (10g+ 更穩健)。V$TIMER (百秒計時器) 可作為快速健康檢查:若查詢兩次值不變,計時器已凍結。