SQL>> 会话已更改。
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> 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
可以看到,现在v$session_longops中记录的时间和系统时间是吻合的。
下面修改操作系统的时间:
[root@localhost ~]# date
Mon Dec 20 15:42:43 CST 2010
[root@localhost ~]# date -s 20111220
Tue Dec 20 00:00:00 CST 2011
[root@localhost ~]# date -s 17:35:00
Tue Dec 20 17:35:00 CST 2011
将系统时间调快一年,然后查询系统时间,并构造长操作,检查v$session_longops中记录的时间:
SQL> select sysdate from dual;
SYSDATE
-------------------
2011-12-20 17:35:11
SQL> set autot trace stat
SQL> select * from ndmain.cat_product;
已选择124350行。
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
20274 consistent gets
12842 physical reads
0 redo> 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
------------------- -------------------
2011-12-20 17:35:29 2011-12-20 17:35:43
由于操作系统的时间改变,因此Oracle中sysdate和v$session_longops中记录的时间都提前了一年,下面将操作系统时间复原:
[root@localhost ~]# date -s 20101220
Mon Dec 20 00:00:00 CST 2010
[root@localhost ~]# date -s 17:36:00
Mon Dec 20 17:36:00 CST 2010
再次检查操作系统时间和v$session_longops中记录的时间:
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-20 17:36: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> 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
------------------- -------------------
2011-12-21 11:15:25 2011-12-21 11:15:43
可以看到,Oracle中的sysdate和操作系统中保持一致,而v$session_longops中不仅没有回到正常时间值,反而又向前增加了。
其实这与v$session_longops视图的性能有关,Oracle不允许这个时间递增的视图出现时间回退的现象,所以这个视图记录的时间永远会增加,而不会随着sysdate时间回退而减少。
解决这个问题最好的方法就是重启数据库,由于v$session_longops是动态视图,本质是Oracle底层代码实现的SQL接口,并不是保存在数据库中的数据,因此重启后这些不正常的数据应该会被清除掉:
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup
ORACLE例程已经启动。
Total System Global Area 1192827100 bytes