oracle从客户端到sql语句追踪
这两天看小布老师的视频学习了一下从客户端到oracle数据库发送执行的SQL语句的跟踪,整理一下笔记。
需要用到的命令:netstat
oracle端要用到的四个视图为:
V$session:当前有多少个用户连接到数据库服务器上
V$transaction 事务信息
V$process 进程信息
V$SQL:当前正在运行的一些SQL的情况
这四个图的关系为:

图1
下面进行探索:
第一步:
首先在数据库端以sysdba身份登录oracle,查询v%transaction视图
SQL> select ADDR from v$transaction;
no rows selected
显示当前没事务在处理
第二步:
windows端使用SQL/PLUS以HR用户连接到远程oracle,执行语句
insert into t values (3,'lisi');

图2
再次查询事务视图:
SQL> select ADDR,SES_ADDR from v$transaction; ADDR SES_ADDR ---------------- ---------------- 00000000830EE248 00000000853C67F8 Elapsed: ::00.00
这里显示已经有了一个事务。
第三步:
查询v$session视图
SQL> select SADDR,SID,PADDR,SQL_ADDRESS,PREV_SQL_ADDR,USERNAME,STATUS fromv$session;
SADDR SID PADDR SQL_ADDRESS PREV_SQL_ADDR USERNAME STATUS
---------------- -------------------------- ---------------- ---------------- -------- ----------
0000000085292D98 0000000085079BB0 ACTIVE
000000008528FF28 000000008507BC30 ACTIVE
000000008528D0B8 000000008507DCB0 ACTIVE
000000008528A248 000000008507FD30 ACTIVE
00000000852873D8 0000000085081DB0 ACTIVE
0000000085083E30 ACTIVE
00000000852816F8 0000000085085EB0 ACTIVE
000000008527E888 0000000085087F30 ACTIVE
000000008527BA18 000000008508C030 ACTIVE
0000000085278BA8 000000008508E0B0 ACTIVE
0000000085272EC8 ACTIVE
00000000850921B0 000000007F66DAF8 ACTIVE
ACTIVE
0000000085255E68 00000000850962B0 ACTIVE
000000008509A3B0 ACTIVE
000000008524A4A8 ACTIVE
00000000853FABD8 000000008508AFF0 000000007D8D2848000000007F5CC218 SYS ACTIVE
00000000853F7D68 000000008507ABF0 ACTIVE
00000000853F4EF8 000000008507CC70 ACTIVE
00000000853F2088 000000008507ECF0 ACTIVE
00000000853EF218 0000000085080D70 ACTIVE
00000000853EC3A8 0000000085082DF0 ACTIVE
00000000853E9538 0000000085084E70 ACTIVE
00000000853E66C8 0000000085086EF0 000000007F719690 ACTIVE
00000000853DDB78 000000008508D070 ACTIVE
00000000853DAD08 000000008508F0F0 ACTIVE
00000000853D21B8 ACTIVE
00000000853CF348 00000000850931F0 ACTIVE
00000000853CC4D8 ACTIVE
00000000853C67F8 00000000850972F0 000000007F497D500000000085438D78 HR INACTIVE
00000000853C0B18 ACTIVE
rows selected.
Elapsed: ::00.02
如图:

图3
这里我们可以看到已经显示出了所有连接到数据库上的session里面就有我当前的HR的连接。黄色底纹的那一行中SADDR和v$transaction中的SES_ADDR相对应,即:
v$session.SADDR=v$transaction.SES_ADDR
第四步:
查询v$sql视图,找到正在执行的语句。
SQL> select SQL_TEXT,ADDRESS from v$sql where ADDRESS='0000000085438D78'; SQL_TEXT ADDRESS ---------------------------------------------------------------------------- insert into t values (,'lisi') 0000000085438D78 Elapsed: ::00.03
如图:

图4
到此,我们已经找到了正在执行的语句,v$session和v$sql两个视图的关系,从图1也能看出:
v$session. PREV_SQL_ADDR=v$sql. ADDRESS
其他
查询v$ process视图
SQL> select ADDR,SPID from v$process; ADDR SPID ------------------------------------------------------ 0000000085078B70 0000000085079BB0 000000008507ABF0 000000008507BC30 000000008507CC70 000000008507DCB0 000000008507ECF0 000000008507FD30 0000000085080D70 0000000085081DB0 0000000085082DF0 0000000085083E30 0000000085084E70 0000000085085EB0 0000000085086EF0 0000000085087F30 0000000085088F70 0000000085089FB0 000000008508AFF0 000000008508C030 000000008508D070 000000008508E0B0 000000008508F0F0 00000000850921B0 00000000850931F0 00000000850962B0 00000000850972F0 rows selected. Elapsed: ::00.01 SQL>
根据图1 可以知道:
v$session.PADDR=v$ process.ADDR
对应的行为黄色底纹的行(最后一行),他的SPID就是进程号。此时我们执行ps -ef | grep 3685进程查询
[oracle@locahost ~]$ ps -ef | grep oracle : ? :: oracleHDWKXT (LOCAL=NO) oracle : pts/ :: grep
如图:
图5
果然是我们的oracle的session进程。
再执行命令:
netstat -apn | more

图6
注:我本机的ip地址为172.17.33.92,远端oracle 的ip为172.17.28.180
可以看到我本机和远端linux一共有2个连接:
tcp 0 0::ffff:172.17.38.180:22 ::ffff:172.17.33.92:59119 ESTABLISHED -
tcp 0 0::ffff:172.17.38.180:1521 ::ffff:172.17.33.92:51416 ESTABLISHED 3685/oracleHDWKXT
其中第一条是我的SecureCRT,另一条PID为3685的进程连接的是就是我的DOS啦
(Foreign Address指的是客户端的ip和端口。这里有两个客户端端口,分别是59119和51416都是我们正在执行的SQL/PLUS正在连接的进程。)
在windows打开DOS窗口,执行netstat -b 命令,可以查看到,这两个端口都是sqlplus在使用的。
TCP 172.17.33.92:51416 bogon:1521 ESTABLISHED
[sqlplus.exe]
…………
TCP 172.17.33.92:59119 bogon:ssh ESTABLISHED
[SecureCRT.exe]

图7
果然是我的sqlplus占用的51416端口在和远程oracle通信。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上都是单一语句的查询,下面附录一些连接查询:
>> select addr, sid, username, s.status, process, programfrom v$transaction t ,v$session s where t.ses_addr=s.saddr;

图8
>>select sql_text, address, hash_value from v$sql q, v$session s where s.sid = 143and s.prev_sql_addr = q.address ;

图9
oracle从客户端到sql语句追踪的更多相关文章
- Oracle SQL语句追踪
Oracle SQL语句追踪 1 SQL语句追踪 追踪SQL语句的执行过程需要在Oracle服务器端进行,Oracle服务器端会检测并记录访问进程所执行的所有SQL语句.下面使用的命令都是在命令行 ...
- oracle 修改表的sql语句
oracle 修改表的sql语句 1增加一个列:ALTER TABLE 表名 ADD(列名 数据类型);如:ALTER TABLE emp ADD(license varchar2(256)) ...
- 查询Oracle正在执行的sql语句
--查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...
- oracle 监控执行的sql语句
oracle 监控执行的sql语句 select * from v$sqlarea a where module='PL/SQL Developer' order by a.FIRST_LOAD_TI ...
- oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)
先列上我的数据库表格: c_date(Date格式) date_type(String格式) 2011-01-01 0 2012-03-07 ...
- Oracle数据库常用的Sql语句整理
Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...
- Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数
Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ...
- 查询Oracle正在执行的sql语句及kill被锁的表
查询Oracle正在执行的sql语句及执行该语句的用户SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, pa ...
- oracle sqlplus及常用sql语句
常用sql语句 有需求才有动力 http://blog.csdn.net/yitian20000/article/details/6256716 常用sql语句 创建表空间:create tables ...
随机推荐
- 【感悟】看Hyouka的感想 (1)
最近偶然从B站看到了<冰菓>这个(个人觉得是推理)番 我突然觉得自己曾经做的一些行为欠妥 有才能者的不自知,是对无才能者的讽刺 举个例子就是:即当别人说你很牛的时候,你却说你只 ...
- Python 基础-python-列表-元组-字典-集合
列表格式:name = []name = [name1, name2, name3, name4, name5] #针对列表的操作 name.index("name1")#查询指定 ...
- [译]36 Days of Web Testing(五)
Day 23 禁用CSS Disable CSS 为什么 ? CSS,层叠样式表,是用来定义web页面布局和显示的机制.通过修改CSS样式,可以改变整个页面的外观. 但是有一些人,因为之前的选择或者 ...
- seajs 和spm的使用简介
说实话, 前端开发是一个令人头痛的事情. nodejs出现了很久了, 一直不是很习惯用nodejs, 当初刚出来的时候, 就下载了express, 想搭建个网站, 结果不是我的菜, 愣是用的不习惯,也 ...
- BZOJ 1854 游戏
Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有\(2\)个属性,这些属性的值用\([1,10000]\)之间的数表示.当他使用某种装备时,他只能使用该 ...
- Android UI基础教程 目录
从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...
- uva 10130 SuperSale
一个01背包问题: 刚刚开始把题目看错了,以为物品的数目是有限的,然后让你求一个家庭里最多能够拿多个价值的东西: 这样一来的话,这个题目就有点意思了: 但是后来发现竟然是个简单的01背包问题 = = ...
- iOS获取图片的Base64String,兼容Android,java,web,jpg(jpeg),png
呃呃呃……需求的来源又是同学,对!又是! 废话不哆嗦,怎么把一张图在iOS上转一个Base64String出来,稍微了解的,或者随便搜一下,都能搞定一大堆,但是!!!! 自己(iOS)转自己用,完全没 ...
- 【POJ3294】 Life Forms (后缀数组+二分)
Life Forms Description You may have wondered why most extraterrestrial life forms resemble humans, d ...
- Zlib压缩算法在Java与Delphi间交互实现(压缩XML交互)
一个典型应用中,使用delphi作为客户端,J2EE服务端,两者之间用XML作为数据交换,为了提高效率,对XML数据进行压缩,为此需要找到一种压缩/解压算法能够两个平台之间交互处理,使用ZLIB算法就 ...