效果:可以在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: 原子性;
1:Atomicity: 原子性;
2:Consistency 一致性;
3:Isolation : 独立性 每个Transaciton都是独立的。提交前,别的事务看不到
4:Durability :持久性 这些改变提交后会写到磁盘上。
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 行。
我们可以通过sysdba权限登录服务器端看正在执行的事务:
sqlplus /nolog
conn as sysdba;
登录后查看
这个就是正在执行的事务:
SQL> select addr,ses_addr from v$transaction;
ADDR SES_ADDR
-------- --------
27E7193C 28C65B10
ADDR列代表事务状态的地址:
ADDR | RAW(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 非活跃
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$重要的字段分析:
SADDR | RAW(4 | 8) | Session address |
USERNAME | VARCHAR2(30) | Oracle username |
PADDR | RAW(4 | 8) | Address of the process that owns the session |
PROCESS | VARCHAR2(12) | Operating system client process ID |
PROGRAM | VARCHAR2(48) | Operating system program name |
PREV_SQL_ADDR | RAW(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
以及为什么慢。
P---P 进程对进程通信, 也可以是多个线程。 P相当于一个tomcat,weblogic
websphere 等这些服务器,
这些服务器有这些模式: 单进程, 单进程多线程, 多进程多线程。
应用服务器和数据库服务器通信通常就是SQL语句;
应用服务器启动时,会首先和数据库服务器建立连接,这些连接一般都是长连接
现在只研究应用服务器和数据库服务器之间的连接;
从客户端先找到TCP/IP连接 然后再找到对应的进程,然后找到
进程对应的Transaction 然后看SQL 从而知道执行了那些SQL
以及为什么慢。