这两天看小布老师的视频学习了一下从客户端到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语句追踪的更多相关文章

  1. Oracle SQL语句追踪

    Oracle SQL语句追踪 1   SQL语句追踪 追踪SQL语句的执行过程需要在Oracle服务器端进行,Oracle服务器端会检测并记录访问进程所执行的所有SQL语句.下面使用的命令都是在命令行 ...

  2. oracle 修改表的sql语句

    oracle 修改表的sql语句     1增加一个列:ALTER TABLE 表名 ADD(列名 数据类型);如:ALTER TABLE emp ADD(license varchar2(256)) ...

  3. 查询Oracle正在执行的sql语句

    --查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...

  4. oracle 监控执行的sql语句

    oracle 监控执行的sql语句 select * from v$sqlarea a where module='PL/SQL Developer' order by a.FIRST_LOAD_TI ...

  5. oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)

    先列上我的数据库表格: c_date(Date格式)     date_type(String格式) 2011-01-01                   0 2012-03-07         ...

  6. Oracle数据库常用的Sql语句整理

    Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...

  7. Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数

    Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ...

  8. 查询Oracle正在执行的sql语句及kill被锁的表

    查询Oracle正在执行的sql语句及执行该语句的用户SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, pa ...

  9. oracle sqlplus及常用sql语句

    常用sql语句 有需求才有动力 http://blog.csdn.net/yitian20000/article/details/6256716 常用sql语句 创建表空间:create tables ...

随机推荐

  1. PHP程序开发人员要掌握的知识

    文件目录处理函数包80%以上的函数的功能的灵活运用. 日期时间函数中的80%以上的函数的功能的灵活运用 数学函数库中的100%的内容. 网络库中的60%以上的内容,对各个函数的功能比较熟悉. 字符串处 ...

  2. Apache Virtual Include

    2.目录支持includes:     <Directory   />             Options   None             //不支持includes       ...

  3. 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)

    本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...

  4. 开发中遇到的angularJs的小问题

    1.在使用自定义指令后如果需要将指令内部的数据传给外层controller需要设置scope属性,此时注意,如果指令内传出的数据在某种情况下需要清空,如传出一个选中元素的数组,点击清空按钮则清空选中这 ...

  5. Lsp修复

    打开电脑,进入命令提示符窗口,快捷键win+r.   在窗口中输入“cmd”进入命令符窗口.       在窗口中输入:输入netsh winsock reset,然后按下回车键.   然后稍等片刻, ...

  6. 帝国cms在任意位置调用指定id的栏目名称和链接

    注意,这个代码无须放在灵动标签中,直接写入模板相应的位置就行了.[1]调用栏目名称: <?=$class_r[栏目ID]['classname']?>   示例:<?=$class_ ...

  7. 用Enterprise Architect从源码自动生成类图

    http://blog.csdn.net/zhouyong0/article/details/8281192 /*references:感谢资源分享者.info:简单记录如何通过工具从源码生成类图,便 ...

  8. ubuntu下为opera26.0安装flash

    因为 Adobe Flash 不再支持 linux Google 便开发了PepperFlashPlayer来替代原来的 Adobe Flash 下面介绍 PepperFlashPlayer 在安装方 ...

  9. Tomcat根目录下work文件夹的作用

    今天遇到了这样的一个问题:就是我之前把项目部署到了tomcat下,运行没有任何问题,后来我把我之前的改项目的原项目文件部署上去后,运行时总是出现之前的界面,而服务器又是启动正常的;通过仔细的检查后,发 ...

  10. spm使用之五修改spm自带文档主题模板

    spm自带的文档的主题模板, 其文件在C:\Documents and Settings\Administrator\.spm\themes 目录下, 有个叫做cmd 文件夹的. 其实 cmd这个文件 ...