位置: 文档库 > 数据库 > 在AIX系统根据Oracle进程pid查询sql语句

在AIX系统根据Oracle进程pid查询sql语句

挺身而出 上传于 2020-08-28 02:34

《在AIX系统根据Oracle进程pid查询sql语句》

在AIX操作系统环境下管理Oracle数据库时,系统管理员和DBA经常需要追踪特定进程执行的SQL语句,以诊断性能问题、排查锁冲突或监控异常活动。由于Oracle在AIX上以独立进程形式运行,每个会话对应一个操作系统级进程(pid),通过pid反向查询其执行的SQL语句成为关键诊断手段。本文将系统阐述从AIX系统获取Oracle进程pid到解析其SQL语句的全流程方法,涵盖基础原理、工具使用及实战案例。

一、技术背景与原理

Oracle数据库在AIX系统中的运行机制决定了进程与会话的对应关系。每个Oracle服务器进程(如专用服务器进程)在操作系统层面表现为独立的进程,其进程ID(pid)可通过ps命令查看。这些进程与Oracle内部会话(session)通过SGA中的共享内存结构关联,具体通过UGA(User Global Area)中的会话标识符(sid,serial#)建立映射关系。要查询某pid执行的SQL,需先获取其对应的sid,再通过Oracle动态性能视图查询SQL信息。

二、方法论:三步定位法

1. 获取Oracle进程pid列表

在AIX终端执行以下命令列出所有Oracle进程:

ps -ef | grep ora_ | grep -v grep

输出示例:

oracle   12345     1   0 10:00:00 ?        0:00 ora_pmon_ORCL
oracle   23456     1   0 10:00:01 ?        0:01 ora_dbw0_ORCL
oracle   34567     1   0 10:00:02 ?        0:02 ora_ckpt_ORCL
oracle   45678  32100   0 10:05:00 ?        0:15 ora_j000_ORCL

重点关注ora_开头的进程,其中数字后缀为实例名(如ORCL)。记录目标pid(如45678)。

2. 通过pid查询Oracle会话信息

使用Oracle提供的oradebug工具或直接查询v$process视图。推荐方法:

(1)登录SQL*Plus:

sqlplus / as sysdba

(2)执行以下查询获取sid,serial#:

SELECT s.sid, s.serial#, s.username, s.program 
FROM v$session s, v$process p 
WHERE p.addr = s.paddr AND p.spid = '45678';

输出示例:

SID    SERIAL# USERNAME   PROGRAM
-----  ------- ---------- ------------------------
123     45678   SCOTT      sqlplus.exe

3. 查询SQL语句

获取sid后,可通过以下方式查询当前执行的SQL:

方法一:v$session视图

SELECT sql.sql_text 
FROM v$session s, v$sql sql 
WHERE s.sql_id = sql.sql_id AND s.sid = 123;

方法二:v$sqltext视图(完整SQL拆分显示)

SELECT sql.piece, sql.sql_text 
FROM v$session s, v$sqltext sql 
WHERE s.sql_id = sql.sql_id AND s.sid = 123 
ORDER BY sql.piece;

方法三:AWR报告(历史SQL)

SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(
  l_dbid => (SELECT dbid FROM v$database),
  l_inst_num => (SELECT instance_number FROM v$instance),
  l_bid => (SELECT min(snap_id) FROM dba_hist_snapshot WHERE begin_interval_time > SYSDATE-1),
  l_eid => (SELECT max(snap_id) FROM dba_hist_snapshot)
));

三、高级技巧与问题处理

1. 处理无SQL_ID的情况

当会话未执行SQL时,v$session.sql_id为空。此时可查询最近执行的SQL:

SELECT sql_id, last_active_time 
FROM v$session 
WHERE sid = 123 
ORDER BY last_active_time DESC;

2. 使用AIX工具辅助诊断

(1)topas监控进程资源占用

topas -P 45678

(2)truss跟踪系统调用

truss -p 45678 -o /tmp/trace.log

3. 自动化脚本示例

创建get_sql_by_pid.sh脚本:

#!/bin/ksh
if [ $# -ne 1 ]; then
  echo "Usage: $0 "
  exit 1
fi

PID=$1
SQLPLUS="/usr/oracle/product/11.2.0/dbhome_1/bin/sqlplus"
CREDENTIALS="sys/password as sysdba"

QUERY="
SET LINESIZE 200 PAGESIZE 0 FEEDBACK OFF
SELECT s.sid, s.serial#, sql.sql_text
FROM v\$session s, v\$process p, v\$sql sql
WHERE p.spid = '$PID'
AND p.addr = s.paddr
AND s.sql_id = sql.sql_id(+);
EXIT;"

$SQLPLUS -S "$CREDENTIALS" 

四、典型应用场景

1. 性能瓶颈分析

当发现某个Oracle进程CPU占用率持续高于80%时,通过pid定位到sid后,可查询其执行的SQL是否缺少索引或存在全表扫描:

SELECT sql.executions, sql.disk_reads/DECODE(sql.executions,0,1,sql.executions) reads_per_exec
FROM v$session s, v$sql sql
WHERE s.sql_id = sql.sql_id AND s.sid = 123;

2. 锁等待诊断

当出现ORA-00060错误时,通过pid找到阻塞会话的sid,再查询其执行的SQL:

SELECT l.session_id, s.sql_id, sql.sql_text
FROM v$locked_object l, v$session s, v$sql sql
WHERE l.session_id = s.sid
AND s.sql_id = sql.sql_id(+)
AND l.oracle_username = 'SCOTT';

3. 安全审计

监控可疑进程执行的SQL,如检测到非授权用户进程:

SELECT s.osuser, s.machine, sql.sql_text
FROM v$session s, v$sql sql
WHERE s.sql_id = sql.sql_id
AND s.program NOT LIKE '%oracle%'
AND s.status = 'ACTIVE';

五、注意事项

1. 权限要求

执行查询需具有SYSDBA权限或SELECT_CATALOG_ROLE角色。无权限时可通过以下方式授权:

GRANT SELECT ON v_$session TO username;
GRANT SELECT ON v_$sql TO username;

2. 多实例环境处理

在RAC环境中,需指定实例名查询:

SET ORACLE_SID=ORCL2
sqlplus sys/password@ORCL2 as sysdba

3. 性能影响

频繁查询v$sql视图可能产生轻微性能开销,建议在非高峰期执行或使用AWR快照分析。

六、总结与展望

通过AIX系统pid查询Oracle SQL语句是数据库诊断的核心技能,掌握该方法可显著提升问题解决效率。未来随着Oracle 19c/21c的自动索引、SQL计划管理等新特性普及,诊断工具将更加智能化。建议DBA持续关注Oracle官方文档中的诊断包(Diagnostic and Tuning Packs)更新,结合AIX的PerfTools工具构建立体化监控体系。

关键词:AIX系统、Oracle进程、pid查询、SQL语句、v$session视图性能诊断、锁等待、自动化脚本

简介:本文详细介绍在AIX操作系统环境下通过Oracle进程pid查询其执行SQL语句的方法,涵盖从获取pid到解析SQL的全流程,包括基础命令使用、高级诊断技巧、典型应用场景及注意事项,适用于DBA和系统管理员进行数据库性能优化和问题排查。