今天看视频学习了怎样在查看客户端执行的sql,把它记录下来
C:\Users\tyty>sqlplus u1/u1@10.201.1.134/tyodz
SQL*Plus: Release 10.2.0.3.0 - Production on 星期一 9月 26 14:40:05 2011
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create table test (a int);
表已创建。
SQL> insert into test values (9);
已创建 1 行。
在Windows上连接远端服务器上的数据库,在服务器上可以查看这个用户的会话,也可以查看这个会话的transaction。
SQL> select sid,username,status from v$session where username is not null;
SID USERNAME STATUS
---------- ------------------------------ --------
130 U1 INACTIVE
137 SYS ACTIVE
SQL> select addr from v$transaction;
ADDR
--------
378D67AC
在操作系统层上查看网络连接的情况
[oracle@centos ~]$ netstat -anp|more
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address Sta
-
.......
tcp 0 0 10.201.1.134:1521 10.52.23.20:58314 EST
ABLISHED 8654/oracletyodz
.......
可以看到监听与Windows端的58314端口进行连接,Linux端的进程为8654,这个进程就是oracle的专有服务器进程。
[oracle@centos ~]$ ps -ef|grep 8654
oracle 8654 1 0 18:05 ? 00:00:00 oracletyodz (LOCAL=NO)
在上面可以看到,在Windows上与oracle进行连接的端口为58314,下面查看这个端口号对应Windows的什么应用程序
C:\Users\tyty>netstat -b
活动连接
协议 本地地址 外部地址 状态
。。。。。。
TCP 10.52.23.20:58314 10.201.1.134:1521 ESTABLISHED
[sqlplus.exe]
发现就是u1用户的sqlplus
下面查看数据库上的transaction
SQL> select addr,ses_addr,xid from v$transaction;
ADDR SES_ADDR XID
-------- -------- ----------------
378D67AC 38840234 06000300B7020000 只有一行
SQL> select saddr,sid,username,status from v$session where username is not null;
SADDR SID USERNAME STATUS
-------- ---------- ------------------------------ --------
393F46BC 130 SYS ACTIVE
38840234 139 U1 INACTIVE
SQL> select saddr,sid,paddr,username,status from v$session where username is not null;
SADDR SID PADDR USERNAME STATUS
-------- ---------- -------- ------------------------------ --------
393F46BC 130 3925D5A8 SYS ACTIVE
38840234 139 3925759C U1 INACTIVE
通过$transaction的ses_addr和$session的saddr可以找出这个会话是那个用户发起的,就是u1用户
SQL> select addr,spid from v$process;
ADDR SPID
-------- ------------------------
3924B584
3924C030 2861
3924CADC 2863
3924D588 2867
3924E034 2869
3924EAE0 2871
3924F58C 2877
39250038 2875
39250AE4 2879
39251590 2881
3925203C 2883
ADDR SPID
-------- ------------------------
39252AE8 2885
39253594 2887
39254040 2889
39254AEC 2891
39255598 2893
39256044 2895
39256AF0 8700
3925759C 8654 --这一行
39258048 8717
39258AF4 2916
392595A0 2918
ADDR SPID
-------- ------------------------
3925A04C 2920
3925AAF8 2922
3925B5A4 2924
3925C050 2926
3925CAFC 2928
3925D5A8 8703
3925E054 2948
3925EB00 2940
39260058 2942
31 rows selected.
通过$session的PADDR和$process的addr又可以找oracle服务器发起这个transaction进程的pid
SQL> !ps -ef|grep 8654
oracle 8654 1 0 18:05 ? 00:00:00 oracletyodz (LOCAL=NO)
在通过netstat命令就可以找到客户端,与前面的相同
SQL> select sid,prev_sql_addr,username ,status from v$session where username is not null;
SID PREV_SQL USERNAME STATUS
---------- -------- ------------------------------ --------
130 31D52240 SYS ACTIVE
139 38DBC15C U1 INACTIVE
通过$session的prev_sql_addr可以找到这个会话上一次执行sql的hash值。
SQL> select sql_text,address from v$sql where address='38DBC15C';
SQL_TEXT
--------------------------------------------------------------------------------
ADDRESS
--------
insert into test values (9)
38DBC15C
查询v$sql就能看到想要查找的transaction所执行的sql。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25361369/viewspace-708300/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25361369/viewspace-708300/