从客户端到SQL跟踪

效果:可以在oracle服务器端看到正在执行的sql语句

涉及到四张表:

常用sql:

select addr,ses_addr from v$transaction;

select saddr,sid,username,status from v$session;

select addr,username,s.prev_sql_addr,process,program from  v$transaction t, v$session s where t.ses_addr = s.saddr;

select addr ,pid ,spid,program from v$process;


1:V$Transaction表

             事务的四个特性:


                             1:Atomicity: 原子性;
                             2:Consistency  一致性;
                             3:Isolation : 独立性   每个Transaciton都是独立的。提交前,别的事务看不到 
                             4:Durability :持久性   这些改变提交后会写到磁盘上。


当你执行第一个修改数据的语句的时候 ,一个隐含的Transaction就开始了执行 commit 或者 rollback 语句的时候,这个 Transaction就显式的结束了。

Oralcle Transaction 的相关语句;
commit
rollback
savepoint
rollback to <savepoint>
set transaction

正在执行的事务可以通过V$Transaction动态视图看到,这个事务的信息。

举个例子:  首先创建一张表,然后插入数据,在没有执行以上的 oracle transaction 相关语句时,这个事务正在进行,
我们可以通过查看 V$Transacion动态视图,查看这个表的信息。

ex:
SQL> create table test (id varchar(50), name varchar(20));

表已创建。

SQL> desc  test;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------

 ID                                                 VARCHAR2(50)
 NAME                                               VARCHAR2(20)

SQL> insert into test('101','topwqp');
insert into test('101','topwqp')
                 *
第 1 行出现错误:
ORA-00928: 缺失 SELECT 关键字


SQL> insert into test values('101','topwqp');

已创建 1 行。

以上是一个sqlplus客户端执行的sql语句:
我们可以通过sysdba权限登录服务器端看正在执行的事务:
sqlplus /nolog
conn as sysdba;

登录后查看
这个就是正在执行的事务:
SQL> select addr,ses_addr from v$transaction;

ADDR     SES_ADDR
-------- --------
27E7193C 28C65B10


ADDR列代表事务状态的地址:
ADDRRAW(4 | 8)Address of the transaction state object

2: V$SESSION

如何通过这个事务查看到执行的SQL?

V$session  和 V$Transaction  通过    两列关联:

V$transaction 的 SES_ADDR  和 V$session  SADDR  两列可以关联;  

到 v$session中查看 :
字段分析:
SID  session identifier
username 哪个用户连上的
status  当前状态:  active 活跃   inactive 非活跃
SQL> select saddr,sid,paddr,username,status from v$session;

SADDR           SID PADDR    USERNAME                       STATUS
-------- ---------- -------- ------------------------------ --------
28C65B10        127 29692248 HR                             INACTIVE
28C81050        138 296983E0                                ACTIVE
28C83810        139 29697908 SYS                            ACTIVE
28C8FED0        144 29696E30                                ACTIVE
28C99DD0        148 29696358                                ACTIVE
28C9C590        149 29694DA8                                ACTIVE
28CA1510        151 296942D0                                ACTIVE
28CA3CD0        152 29695880                                ACTIVE
28CADBD0        156 2968F6E8                                ACTIVE
28CB0390        157 2968EC10                                ACTIVE
28CB2B50        158 2968E138                                ACTIVE
当username为空 是代表 background process 后台进程。

这两个表关联看到 username HR  是我们正在执行,找到
28C65B10

对应的PADDR 为: 29692248
v$重要的字段分析:
SADDRRAW(4 | 8)Session address
USERNAMEVARCHAR2(30)Oracle username
PADDRRAW(4 | 8)Address of the process that owns the session
PROCESSVARCHAR2(12)Operating system client process ID
PROGRAMVARCHAR2(48)Operating system program name
PREV_SQL_ADDRRAW(4 | 8)Used with PREV_HASH_VALUE to identify the last SQL statement executed

通过 v$transaction的   ses_addr的列值 为28C65B10
在 v$session表中 通过 ses_addr 和  V$session  列 saddr列关联
我们根据已经查到的 SADDR  28C65B10  找到   PADDR
PADDR是 v$process这个表中的客户端执行的进程号

这样我们可以看到相应的 进程名称;

以上单独写太麻烦:

可以通过以下语句关联:
select addr,username,s.prev_sql_addr,process,program from 
v$transaction t, v$session s where t.ses_addr = s.saddr;




显示结果有点乱: 格式化以下:
SQL> col username format a20
SQL> col process format a20
SQL> col program format a20

SQL> select addr,username,s.prev_sql_addr,process,program from
  2  v$transaction t, v$session s where t.ses_addr = s.saddr;

ADDR     USERNAME             PREV_SQL PROCESS              PROGRAM
-------- -------------------- -------- -------------------- --------------------

27E7193C HR                   23102CA4 5272:604             sqlplus.exe

PREV_SQL_ADDR是我们上一次执行的 sql的地址
通过以上查询可以看出:
addr 代表  V$Transaction 的 事务编号 , username 为哪个用户执行的这个事务,
sql_addr 是执行的sql的地址, process 是那个客户端进程的进程号,program为程序名
看截图:



从上图可以看到就是sqlplus执行的语句进程号就是 5272


3:V$SQL

下面我们可以看到 这个客户端执行的SQL;
通过以上查询结果中的 prev_sql_addr号查询对应的sql;
执行结果如下:

SQL> select sql_text,address from v$sql where  address='23102CA4';

SQL_TEXT                                           ADDRESS
-------------------------------------------------- --------
insert into test values('102','topwqp')            23102CA4
我们就找到 正在执行的sql语句了。

4:Relationship


以上这四张表之间的关系为:



5:netstat 命令

一些其他的解释:
windows  命令行cmd下执行
netstat  ? 或  netstat -help可以看到netstat命令的帮助信息。(前提必须是管理员身份登录)

netstat代表当前计算机正在和外部计算机通讯的一些信息,
-b显示连接信息 o显示PID
如果没有 就要把 资源管理器中的 显示所有用户进程中 选上可以看到
C:\Windows\system32>netstat ?

显示协议统计和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval]

  -a            显示所有连接和侦听端口。
  -b            显示在创建每个连接或侦听端口时涉及的可执行程序。
                在某些情况下,已知可执行程序承载多个独立的
                组件,这些情况下,显示创建连接或侦听端口时涉
                及的组件序列。此情况下,可执行程序的名称
                位于底部[]中,它调用的组件位于顶部,直至达
                到 TCP/IP。注意,此选项可能很耗时,并且在您没有
                足够权限时可能失败。
  -e            显示以太网统计。此选项可以与 -s 选项结合使用。
  -f            显示外部地址的完全限定域名(FQDN)。
  -n            以数字形式显示地址和端口号。
  -o            显示拥有的与每个连接关联的进程 ID。
  -p proto      显示 proto 指定的协议的连接;proto 可以是下列任
                何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选
                项一起用来显示每个协议的统计,proto 可以是下列任
                何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP
                或 UDPv6。
  -r            显示路由表。
  -s            显示每个协议的统计。默认情况下,显示
                IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6
                的统计;-p 选项可用于指定默认的子网。
  -t            显示当前连接卸载状态。
  interval      重新显示选定的统计,各个显示间暂停的间隔秒数。
                按 CTRL+C 停止重新显示统计。如果省略,则 netstat
                将打印当前的配置信息一次。

执行 netstat -bo命令得到以下信息:
C:\Windows\system32>netstat -bo

活动连接

  协议  本地地址          外部地址        状态           PID
  TCP    127.0.0.1:49155        topwqp-PC:49156        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49156        topwqp-PC:49155        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49157        topwqp-PC:49158        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49157        topwqp-PC:49161        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49157        topwqp-PC:49164        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49157        topwqp-PC:49167        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49158        topwqp-PC:49157        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49159        topwqp-PC:49160        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49160        topwqp-PC:49159        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49161        topwqp-PC:49157        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49162        topwqp-PC:49163        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49163        topwqp-PC:49162        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49164        topwqp-PC:49157        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49165        topwqp-PC:49166        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49166        topwqp-PC:49165        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49167        topwqp-PC:49157        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49168        topwqp-PC:49169        ESTABLISHED     1936
 [memcached.exe]
  TCP    127.0.0.1:49169        topwqp-PC:49168        ESTABLISHED     1936
 [memcached.exe]
  TCP    192.168.0.147:1521     topwqp-PC:50793        ESTABLISHED     2684
 [TNSLSNR.exe]
最后一行代表了 数据库服务器的进程号,以及和外部机器通讯的ip地址,端口号; 

 TCP    192.168.0.147:1521     topwqp-PC:50793        ESTABLISHED     2684
[TNSLSNR.exe]




这是这个服务器端进程

6:PS

P 相当于一个客户端进程, 客户端和后台服务器 是通过

P---P 进程对进程通信, 也可以是多个线程。 P相当于一个tomcat,weblogic
websphere 等这些服务器,

这些服务器有这些模式: 单进程, 单进程多线程,  多进程多线程。


应用服务器和数据库服务器通信通常就是SQL语句;


应用服务器启动时,会首先和数据库服务器建立连接,这些连接一般都是长连接


现在只研究应用服务器和数据库服务器之间的连接;


从客户端先找到TCP/IP连接 然后再找到对应的进程,然后找到
进程对应的Transaction 然后看SQL 从而知道执行了那些SQL
以及为什么慢。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值