是什么让你查到Oracle正在执行的SQL语句?

查询我们数据库正在执行的SQL语句,下面会用到与操作系统相关的一些方法来实现它。在实现之前,先来聊聊Oracle是怎么样建立一个会话的。

抛开网络这一方面,简单点来说,Oracle客户端通过sqlplus与Oracle服务器建立连接,在建立连接之前,Oracle客户端先向服务器的监听发送一个请求,监听接收到请求后,SQL·NET首先检查用户是否能登陆,或者用户名密码是否正确,正确的话则建立一个会话,建立会话之后,服务器端Oracle用户也会创建一个服务器进程oracle[Oracle_SID] (LOCAL=NO)来负责与该客户端通讯,执行会话在服务器端的操作。

那么,当我们执行一条SQL语句时,首先要先通过操作系统的oracleorcl进程将SQL语句写入到16进制的内存地址中,形成了进程的paddr。可以通过数据库的v$process查询oracleorcl的spid得到paddr。注意,这paddr是操作系统的内存地址的,想要进一步从paddr中得到正在执行的SQL语句,还要知道这个paddr映射在数据库中的sql_address,所以能看到v$process的paddr和v$session的sql_address是映射关系的,并且在内存地址中都是16进制。前者是OS中进程所共享的内存空间,后者是Oracle数据库分配PGA的Private SQL Area(私有SQL区)中会话执行SQL时使用的内存空间。

得到sql_address之后,已经很清楚得知道SQL语句存放在Oracle数据库中的SQL地址,接着要借助下一个动态性能视图:V$SQLAREA,这个视图详细的记载了SQL地址(sql_address)对应的SQL语句(sql_text),只需要加上一个where条件子句就能得到当前执行的SQL语句了。

 来看看流程图是怎么走的。

是什么让你查到Oracle正在执行的SQL语句?_第1张图片

下面贴上SQL语句来。

SELECT sql_text FROM v$sqlarea where address in(

SELECT sql_address from v$session where paddr in(

SELECT addr FROM v$process where spid=3141));

3141是服务器进程的pid。

----------------

以上内容纯粹是个人学习,如有错误,请一起探讨更正,谢谢!

你可能感兴趣的:(是什么让你查到Oracle正在执行的SQL语句?)