这两天看小布老师的视频学习了一下从客户端到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: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 1 0000000085079BB0 00 00 ACTIVE 000000008528FF28 2 000000008507BC30 00 00 ACTIVE 000000008528D0B8 3 000000008507DCB0 00 00 ACTIVE 000000008528A248 4 000000008507FD30 00 00 ACTIVE 00000000852873D8 5 0000000085081DB0 00 00 ACTIVE 0000000085284568 6 0000000085083E30 00 00 ACTIVE 00000000852816F8 7 0000000085085EB0 00 00 ACTIVE 000000008527E888 8 0000000085087F30 00 00 ACTIVE 000000008527BA18 9 000000008508C030 00 00 ACTIVE 0000000085278BA8 10 000000008508E0B0 00 00 ACTIVE 0000000085272EC8 12 0000000085090130 00 00 ACTIVE 0000000085267508 16 00000000850921B0 00 000000007F66DAF8 ACTIVE 0000000085261828 18 0000000085094230 00 00 ACTIVE 0000000085255E68 22 00000000850962B0 00 00 ACTIVE 0000000085250188 24 000000008509A3B0 00 00 ACTIVE 000000008524A4A8 26 0000000085098330 00 00 ACTIVE 00000000853FABD8 125 000000008508AFF0 000000007D8D2848000000007F5CC218 SYS ACTIVE 00000000853F7D68 126 000000008507ABF0 00 00 ACTIVE 00000000853F4EF8 127 000000008507CC70 00 00 ACTIVE 00000000853F2088 128 000000008507ECF0 00 00 ACTIVE 00000000853EF218 129 0000000085080D70 00 00 ACTIVE 00000000853EC3A8 130 0000000085082DF0 00 00 ACTIVE 00000000853E9538 131 0000000085084E70 00 00 ACTIVE 00000000853E66C8 132 0000000085086EF0 00 000000007F719690 ACTIVE 00000000853DDB78 135 000000008508D070 00 00 ACTIVE 00000000853DAD08 136 000000008508F0F0 00 00 ACTIVE 00000000853D21B8 139 0000000085091170 00 00 ACTIVE 00000000853CF348 140 00000000850931F0 00 00 ACTIVE 00000000853CC4D8 141 0000000085095270 00 00 ACTIVE 00000000853C67F8 143 00000000850972F0 000000007F497D500000000085438D78 HR INACTIVE 00000000853C0B18 145 0000000085099370 00 00 ACTIVE 31 rows selected. Elapsed: 00:00: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 (3,'lisi') 0000000085438D78 Elapsed: 00:00: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 2636 000000008507ABF0 2638 000000008507BC30 2642 000000008507CC70 2644 000000008507DCB0 2646 000000008507ECF0 2648 000000008507FD30 2650 0000000085080D70 2652 0000000085081DB0 2654 0000000085082DF0 2656 0000000085083E30 2658 0000000085084E70 2660 0000000085085EB0 2662 0000000085086EF0 2664 0000000085087F30 2666 0000000085088F70 2668 0000000085089FB0 2670 000000008508AFF0 3642 000000008508C030 2683 000000008508D070 2685 000000008508E0B0 2687 000000008508F0F0 2689 0000000085090130 2691 0000000085091170 2695 00000000850921B0 2710 00000000850931F0 2712 0000000085094230 2756 0000000085095270 2708 00000000850962B0 3710 00000000850972F0 3685 31 rows selected. Elapsed: 00:00:00.01 SQL>
根据图1 可以知道:
v$session.PADDR=v$ process.ADDR
对应的行为黄色底纹的行(最后一行),他的SPID就是进程号。此时我们执行ps -ef | grep 3685进程查询
[oracle@locahost ~]$ ps -ef | grep 3685 oracle 3685 1 0 14:43 ? 00:00:00 oracleHDWKXT (LOCAL=NO) oracle 3813 2800 0 15:25 pts/3 00:00:00 grep 3685
如图:
果然是我们的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通信。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上都是单一语句的查询,下面附录一些连接查询:
1>> select addr, sid, username, s.status, process, programfrom v$transaction t ,v$session s where t.ses_addr=s.saddr;
图8
2>>select sql_text, address, hash_value from v$sql q, v$session s where s.sid = 143and s.prev_sql_addr = q.address ;
图9