v$sql、v$sqlarea中都只存放用户最后执行的一条sql语句吗?sql语句历史记录在哪里呢?

seai 2010-01-28 11:39:49
过程如下:
# sqlplu / as sysdba
SQL> select userenv('sid') from dual;
131
SQL> select 1 from dual;
SQL> select 2 from dual;
SQL> select sid,username,sql_address from v$session c,v$sqlarea s
2 where c.sql_address = s.address(+) and sid = 131
3 ;

只查到一条记录!
...全文
512 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
suiziguo 2010-01-28
  • 打赏
  • 举报
回复
select null from dual
select 1 from dual
select TRUNC(SYSDATE+1)+12/24 from dual
select user from dual
select sysdate + 1 / (24 * 60) from dual
SELECT sql_text FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
SELECT sql_text FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
select userenv('sid') from dual

SQL_TEXT
--------------------------------------------------------------------------------

SELECT * FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
select 2 from dual
select 'x' from dual

请参见1楼。
你要查询的历史,是包括SQL语句及其sid的历史???
如果是这样,很遗憾,无法做到,因为SID可以重用,过一段时间,该SID已经被其他用户占用,所以即使查出来,也无法回放该语句执行的场景。

如果你只是想查询SQL历史记录,则只要该SQL未被清除出shared_pool,完全可以办到。最后的办法是用like,毛估估SQL内容。
seai 2010-01-28
  • 打赏
  • 举报
回复
那就是没有办法查到历史记录了?
suiziguo 2010-01-28
  • 打赏
  • 举报
回复
sid忘记改了,但是肯定最多只有一条结果。因为s.address最多保存你刚刚执行的那个sql_address,当session inactive时,变为'00'。
suiziguo 2010-01-28
  • 打赏
  • 举报
回复
SQL> select userenv('sid') from dual;

USERENV('SID')
--------------
146

SQL> select 1 from dual;

1
----------
1

SQL> select 2 from dual;

2
----------
2

SQL> select sid,username,sql_address from v$session c,v$sqlarea s
2 where c.sql_address = s.address(+) and sid = 131;

未选定行

SQL> SELECT sql_text FROM v$sqlarea
2 WHERE sql_text LIKE '%select%dual%';

SQL_TEXT
--------------------------------------------------------------------------------

select length(chr(2000000000)) l4, length(chr(2000000)) l3, length(chr(20000))
l2 from dual

select null from dual
select 1 from dual
select TRUNC(SYSDATE+1)+12/24 from dual
select user from dual
select sysdate + 1 / (24 * 60) from dual
SELECT sql_text FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
SELECT sql_text FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
select userenv('sid') from dual

SQL_TEXT
--------------------------------------------------------------------------------

SELECT * FROM v$sqlarea WHERE sql_text LIKE '%select%dual%'
select 2 from dual
select 'x' from dual

已选择12行。

SQL>

s.address是正在执行的SQL address,执行过了,一般为'00'。
所以对于历史记录,它们俩无关联性。

seai 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 suiziguo 的回复:]
你要查询的历史,是包括SQL语句及其sid的历史???
如果是这样,很遗憾,无法做到,因为SID可以重用,过一段时间,该SID已经被其他用户占用,所以即使查出来,也无法回放该语句执行的场景。

如果你只是想查询SQL历史记录,则只要该SQL未被清除出shared_pool,完全可以办到。最后的办法是用like,毛估估SQL内容。
[/Quote]

希望查到某个session或者user的sql历史记录

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧