檢查一個系統,意外探索資料庫的v$session_longops中時間遠遠超過了系統時間。
查詢結果如下:
[oracle@datasd ~]$ sqlplus / as sysdba
SQL*Plus: Release10.2.0.3.0 - Production on星期一12月20 14:57:04 2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database10gEnterprise Edition Release10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-20 14:57:22
SQL> select max(start_time), max(last_update_time)
2 from v$session_longops;
MAX(START_TIME) MAX(LAST_UPDATE_TIM
------------------- -------------------
2022-03-25 13:51:24 2022-03-25 13:51:25
從v$session_longops查詢的時間比sysdate看到的時間快了20多年。看到這個現象的第一個反應是bug。
於是查詢了metalink,看看有沒有v$session_longops視圖時間變快的記錄,把整個metalink翻了個遍也沒有找到有價值的資訊。
SQL> select instance_name, startup_time
2 from v$instance;
INSTANCE_NAME STARTUP_TIME
---------------- -------------------
shandong 2008-01-15 15:19:28
SQL> host uptime
15:01:21 up 1069 days, 22:12, 2 users, load average: 0.00, 0.00, 0.00
進一步檢查系統,探索資料庫和系統的啟動時間都接近3年了。
由於沒有可以借鑒的資訊,只能猜測可能導致問題的原因:
一、資料庫的bug,導致v$session_longops記錄的時間變快;
二、作業系統已耗用時間超過了500天,導致作業系統或Oracle資料庫中某些變數溢出,從而導致了這個問題。
三、作業系統上時間曾經被手工改動過,發現修改錯誤後,調整回來,但是v$session_longops視圖中的時間沒有自動回調。
前兩種的可能性並不大,因為如果是這兩種情況,那麼應該是比較普遍的,不太可能metalink中沒有任何的記錄。
第三種可能性可以自己來類比一下:
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
會話已更改。
SQL> select sid from v$mystat where rownum = 1;
SID
----------
18
SQL> set autot trace stat
SQL> select * from ndmain.cat_product;
已選擇124350行。
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
20274 consistent gets
12867 physical reads
0 redo size
75995724 bytes sent via SQL*Net to client
91682 bytes received via SQL*Net from client
8291 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
124350 rows processed
SQL> set autot off
SQL> select max(start_time), max(last_update_time)
2 from v$session_longops
3 where sid = 18;
MAX(START_TIME) MAX(LAST_UPDATE_TIM
------------------- -------------------
2010-12-20 15:40:54 2010-12-20 15:41:06
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-20 15:41:47