oracle v session表,Oracle技术之V$SESSION_LONGOPS超过系统时间
检查一个系统,意外发现数据库的v$session_longops中时间远远超过了系统时间。
查询结果如下:
[oracle@datasd ~]$ sqlplus / as sysdba
SQL*Plus:> Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database10gEnterprise Edition> With the Partitioning, OLAP and Data Mining options
SQL>>
Session> 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>> 会话已更改。
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
Fixed>
Variable> Database Buffers 838860800 bytes
Redo Buffers 1191936 bytes
数据库装载完毕。
数据库已经打开。
SQL>> 会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-20 17:48:19
SQL> select max(start_time), max(last_update_time)
2 from v$session_longops;
MAX(START_TIME) MAX(LAST_UPDATE_TIM
------------------- -------------------
SQL> set autot trace stat
SQL> select * from ndmain.cat_product;
已选择124350行。
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo> 0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 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;
MAX(START_TIME) MAX(LAST_UPDATE_TIM
------------------- -------------------
2010-12-20 17:48:49 2010-12-20 17:49:01
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-12-20 17:50:05
可以看到,重启数据库后,问题消失。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
oracle v session表,Oracle技术之V$SESSION_LONGOPS超过系统时间相关推荐
- oracle v session表,Oracle临时表(Session临时表与Transaction临时表)
一.临时表与临时表分类 临时表是在Oracle 8i中引入一种新的表的种类.Oracle数据库中的临时表是一种特殊的表,它可以作为临时保存数据的一种方式.Session级临时表是指在一个会话周期内都数 ...
- Oracle常用数据字典表 Oracle常用数据字典表 查看当前用户的缺省表空间
Oracle常用数据字典表 Oracle常用数据字典表 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; ...
- V$session表的妙用
v$session 表中比较常用的几个字段说明^_^ 1. sid,serial# 通过sid我们可以查询与这个session相关的各种统计信息,处理信息. a. select * from v$se ...
- Oracle v$session/v$sql 表
在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ...
- oracle v$context,30.Oracle杂记——Oracle常用动态视图v$session
30.Oracle杂记--Oracle常用动态视图v$session 视图v$session:有关会话的信息 这个视图包含了超级多的列,说明其包含巨大的信息,小伙伴千万要记得使用,不然浪费掉了ORAC ...
- Oracle v$session v$active_session_history dba_hist_active_sess_history
v$session:实时 v$active_session_history : 每1秒将v$session中记录保存到 v$active_session_history 视图中,只会加载非idle会话 ...
- oracle时区参考表,ORACLE 时区
商业和数据库很多时候必须跨时区工作,从9i开始,oracle环境开始有了时区意识,通过指定数据库的时区和使用TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL ...
- oracle+12c+大表,ORACLE 12C新特性-在线迁移表或分区 | 信春哥,系统稳,闭眼上线不回滚!...
今天测试一下ORACLE 12C的一个新功能-在线移动表或分区,这其实在10g版本就已经支持了,难道是官方文档写错了,先不按照文档描述的去测试,看看是否堆表也可以在线迁移.以下是实验过程: 下面先看下 ...
- oracle v$sql last_load_time,Oracle 等待事件V$视图
等待事件V$视图 本节包含一些显示等待事件的V$ 脚本.从个人角度来说,我更喜欢使用STATSPACK 报表.AWR 报表或企业管理器来查找等待事件.也就是说,有些很好的视图可以查看等待事件. Ora ...
最新文章
- oracle数据库解决system表空间已爆满的问题
- [导入]silverlight 2.0希伯来语及阿拉伯语的support.zip(344.42 KB)
- 戴尔携手英特尔揭示技术与员工潜能背后的真相
- keepalived基础及使用DR模型构建一个real_server
- 听飞狐聊JavaScript设计模式系列07
- 【病毒分析】——熊猫烧香 专杀工具C源码
- Delphi Web前端开发教程(7):基于TMS WEB Core框架
- 2021接力题典1800【数学一】-汤家凤【题目册】
- CF 592D(Super M-虚树直径)
- java中int count什么意思_int groupCount()
- python爬虫爬取京东商品评价_python爬取京东商品信息及评论
- MySQL 升级--1
- 51单片机可以晚电子游戏吗_电子游戏是在浪费时间吗
- 程序员升职记 全关卡攻略通俗思路 Human Resource Machine
- win7计算机无用系统文件夹,c盘怎么清理到最干净(win7如何删除c盘无用文件)...
- 三星SDS推出企业人工智能聊天机器人Brity
- ml1220纽扣电池供电时长
- 《重来》与去”完美主义“
- php .accdb,PHP:调试与Access数据库(.accdb)的PDO连接
- 杰里之Linein api 数据结构【篇】