启用用户进程跟踪

本文详细介绍Oracle数据库中的SQL跟踪机制,包括用户进程跟踪文件的作用、如何启用不同级别的跟踪、跟踪文件的内容解析及实例演示等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--========================

-- 启用用户进程跟踪

--========================

 

一、用户进程跟踪文件

    用户跟踪文件在根据需要跟踪会话实际操作的时候根据要求产生

    通常用于帮助调整应用程序,比如检查由SQL的不良写法所致的相关问题等等

    由用户进程发出,服务器进程产生该类文件

    包含跟踪SQL命令的统计信息、包含用户的错误信息

    缺省情况下当用户出现会话错误时产生

    位置由user_dump_dest设定

    文件大小由max_dump_file_size 决定

    可以设定记录会话的所有信息

    分为基于会话级别和基于实例级别,大多数情况下,session级别进行跟踪

   

    在专用服务器模式中

        仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)

    在共享模式中

        对任何一个会话的跟踪会分布到每个共享服务器进程所生成的跟踪文件内

 

二、不同级别的跟踪 

    instance level

        alter system set sql_trace = true;

       

    session level:

        使用alter session命令启用跟踪

        alter session set sql_trace = true;

        使用dbms包来启用跟踪

        dbms_system.SET_SQL_TRACE_IN_SESSION

           

    上述两类级别跟踪文件位置由user_dump_dest设定,且生成的跟踪文件名为<SID>_ora_<SPID>.trc

    其中SID为实例名称,SPID为系统进程号(Unix)或线程号(Windows)

   

    1.演示基于实例级别的跟踪

        SQL> show parameter user_dump   --查看用户跟踪文件所在的位置

 

        NAME                                 TYPE        VALUE

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

        user_dump_dest                       string      /u01/app/oracle/admin/orcl/udu

                                                         mp

        SQL> ho rm -f /u01/app/oracle/admin/orcl/udump/*  --清除跟踪文件夹下先前产生的跟踪文件*/

 

        SQL> alter system set sql_trace = true;           --设置sql_trace参数启用实例级别的跟踪

 

        System altered.    

       

        --开启一个会话连接

        SQL> conn scott/tiger@orcl

        Connected.

 

        SQL> select s.username,s.sid,p.spid from v$session s,v$process p

          2  where s.paddr = p.addr and s.username = 'SCOTT'; --获取需要跟踪的特定SPID

 

        USERNAME                              SID SPID

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

        SCOTT                                 134 7826

 

        [oracle@robinson ~]$ ls $ORACLE_BASE/admin/orcl/udump

        orcl_ora_4457.trc  orcl_ora_4462.trc  orcl_ora_6283.trc  orcl_ora_7826.trc

        orcl_ora_4459.trc  orcl_ora_5027.trc  orcl_ora_6524.trc  orcl_ora_7833.trc

       

        --使用tail -f 逐步跟踪会话文件

        [oracle@robinson ~]$ tail -f $ORACLE_BASE/admin/orcl/udump/orcl_ora_7826.trc

        =====================

        PARSING IN CURSOR #3 len=40 dep=0 uid=54 oct=3 lid=54 tim=1253678938645444 hv=3933222116 ad='2dbb8df8'

        SELECT DECODE('A','A','1','2') FROM DUAL

        END OF STMT

        PARSE #3:c=1000,e=1076,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1253678938645434

        EXEC #3:c=0,e=41,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1253678938645588

        FETCH #3:c=0,e=20,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1253678938645673

        STAT #3 id=1 cnt=1 pid=0 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=8 us)'

        XCTEND rlbk=0, rd_only=1

        XCTEND rlbk=0, rd_only=1

        *** 2010-09-06 18:04:56.482

        =====================

        PARSING IN CURSOR #4 len=44 dep=0 uid=54 oct=3 lid=54 tim=1253679195783434 hv=24946478 ad='2d43cb14'

        select * from scott.emp where ename ='SCOTT'

        END OF STMT

        PARSE #4:c=1999,e=2262,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1253679195783423

        EXEC #4:c=0,e=52,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1253679195783643

        FETCH #4:c=0,e=208,p=0,cr=7,cu=0,mis=0,r=1,dep=0,og=1,tim=1253679195783930

        FETCH #4:c=0,e=73,p=0,cr=1,cu=0,mis=0,r=0,dep=0,og=1,tim=1253679195826698

        STAT #4 id=1 cnt=1 pid=0 pos=1 obj=51148 op='TABLE ACCESS FULL EMP (cr=8 pr=0 pw=0 time=194 us)'   

       

        --scott登陆的会话中执行下面的语句,则跟踪文件orcl_ora_7826.trc同步显示所执行的数据操纵语句

        SQL> select * from scott.emp where ename ='SCOTT';

 

             EMPNO ENAME                JOB                       MGR HIREDATE

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

               SAL       COMM     DEPTNO

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

              7788 SCOTT                ANALYST                  7566 19-4-87

              3100                    20   

       

        --由上可知,整个语句的执行详细处理步骤,最后提示使用了全表扫描

        关于实例级别的跟踪,专用服务器模式每个服务器进程都会生成自己的跟踪信息流

            共享模式则每个共享服务器都存在一个跟踪文件,且跟踪文件包含的跟踪信息与该共享服务器为其服务的所有会话

            而执行的所有SQL语句相关

       

        --关闭实例级别的跟踪

        SQL> alter system set sql_trace = false;

 

        System altered.

       

    2.演示基于会话级别的跟踪

        一个会话自身能够交互地启用针对该会话的跟踪,其它会话也可以编程启用针对该会话进行跟踪

        --清理上次跟踪的会话文件,且同样可以使用上面的方式来进行跟踪,只不过修改跟踪的参数不同而已

        SQL> ho rm -f /u01/app/oracle/admin/orcl/udump/*       --*/

       

        SQL> conn system/redhat

        Connected.

        SQL> alter session set sql_trace=true;

 

        Session altered.

 

        --执行SQL 语句则开始跟踪,跟踪完毕后执行下面的语句关闭跟踪

        --此处跟踪的方法同实例级别跟踪

 

        SQL> alter session set sql_trace = false;

 

        Session altered.

 

        --开启另一会话使用dbms包进行跟踪

        SQL> conn system/redhat

        Connected.

        SQL> select sid,serial# from v$session where username = 'SYSTEM';

 

               SID    SERIAL#

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

               133       1141

              

        SQL> exec dbms_monitor.session_trace_enable(session_id=>133,serial_num=>1141);

 

        PL/SQL procedure successfully completed.

 

        SQL> update scott.emp set sal = sal + 500 where ename = 'SCOTT';

 

        1 row updated.

 

        SQL> exec dbms_monitor.session_trace_disable(session_id=>133,serial_num=>1141);

 

        PL/SQL procedure successfully completed.

 

 

        SQL> select s.username,s.sid,p.spid from v$session s,v$process p

          2   where s.paddr = p.addr and s.sid = 133;        

 

        USERNAME                              SID SPID

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

        SYSTEM                                133 10170

 

        SQL> ho cat $ORACLE_BASE/admin/orcl/udump/orcl_ora_10170.trc

        /u01/app/oracle/admin/orcl/udump/orcl_ora_10170.trc

        Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

        With the Partitioning, OLAP and Data Mining options

        ORACLE_HOME = /u01/app/oracle/10g

        System name:    Linux

        Node name:      robinson

        Release:        2.6.18-164.el5

        Version:        #1 SMP Tue Aug 18 15:51:54 EDT 2009

        Machine:        i686

        Instance name: orcl

        Redo thread mounted by this instance: 1

        Oracle process number: 18

        Unix process pid: 10170, image: oracle@robinson (TNS V1-V3)

 

        *** 2010-09-06 19:49:33.906

        *** ACTION NAME:() 2010-09-06 19:49:33.903

        *** MODULE NAME:(SQL*Plus) 2010-09-06 19:49:33.903

        *** SERVICE NAME:(SYS$USERS) 2010-09-06 19:49:33.903

        *** SESSION ID:(133.1141) 2010-09-06 19:49:33.903

        =====================

        PARSING IN CURSOR #2 len=81 dep=0 uid=5 oct=47 lid=5 tim=1253685326077891 hv=1816613408 ad='2dbf7d40'

        BEGIN dbms_monitor.session_trace_enable(session_id=>133,serial_num=>1141); END;

        END OF STMT

        EXEC #2:c=0,e=466,p=0,cr=0,cu=0,mis=1,r=1,dep=0,og=1,tim=1253685326077881

        WAIT #2: nam='SQL*Net message to client' ela= 4 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685326080388

        WAIT #2: nam='SQL*Net message from client' ela= 1823 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685326082309

        WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685326082495

        *** 2010-09-06 19:50:20.709

        WAIT #0: nam='SQL*Net message from client' ela= 45704475 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685371787005

        =====================

        PARSING IN CURSOR #1 len=58 dep=0 uid=5 oct=6 lid=5 tim=1253685371793390 hv=3123987885 ad='2dbf7aa4'

        update scott.emp set sal = sal + 500 where ename = 'SCOTT'

        END OF STMT

        PARSE #1:c=4000,e=6173,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1253685371793377

        EXEC #1:c=999,e=1381,p=0,cr=7,cu=3,mis=0,r=1,dep=0,og=1,tim=1253685371794945

        WAIT #1: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685371795058

        WAIT #1: nam='SQL*Net message from client' ela= 4984 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685371800090

        STAT #1 id=1 cnt=0 pid=0 pos=1 obj=0 op='UPDATE  EMP (cr=7 pr=0 pw=0 time=993 us)'

        STAT #1 id=2 cnt=1 pid=1 pos=1 obj=51148 op='TABLE ACCESS FULL EMP (cr=7 pr=0 pw=0 time=272 us)'

        WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685371800388

        *** 2010-09-06 19:50:53.414

        WAIT #0: nam='SQL*Net message from client' ela= 31924456 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1253685403724882

        =====================

        PARSING IN CURSOR #2 len=82 dep=0 uid=5 oct=47 lid=5 tim=1253685403729071 hv=3536340123 ad='2dbf7744'

        BEGIN dbms_monitor.session_trace_disable(session_id=>133,serial_num=>1141); END;

        END OF STMT

        PARSE #2:c=1000,e=4016,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1253685403729061

        EXEC #2:c=0,e=150,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1253685   

 

三、启用会话跟踪查看show parameter sga 的源码

        SQL> conn system/redhat  --使用system帐户连接

        Connected.

        SQL> alter session set sql_trace = true;  --启用会话跟踪

 

        Session altered.

 

        SQL> show parameter sga                   --查看sga

 

        NAME                                 TYPE        VALUE

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

        lock_sga                             boolean     FALSE

        pre_page_sga                         boolean     FALSE

        sga_max_size                         big integer 448M

        sga_target                           big integer 448M

 

        SQL> alter session set sql_trace = false;  --关闭会话跟踪

 

        Session altered.

 

        SQL> select s.username,s.sid,p.spid from v$session s,v$process p

          2  where s.paddr = p.addr and s.username = 'SCOTT'; --获取需要跟踪的特定SPID

 

        USERNAME                              SID SPID

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

        SYSTEM                                159 3365

       

        SQL>ho cat $ORACLE_BASE/admin/orcl/udump/orcl_ora_3365.trc --查看跟踪文件

   

        --以下内容为执行show parameter sga的实际操作语句,实质上是查询v$parameter视图

            SELECT NAME NAME_COL_PLUS_SHOW_PARAM,

                DECODE(TYPE,1,'boolean',2,'string',3,'integer',4,'file',5,'number', 6,'big integer', 'unknown') TYPE,

                DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM

            FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%sga%')

            ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM

 

四、启用实例级别会话跟踪产生的问题         

    使用下面的语句启用实例级别会话跟踪后

        alter system set sql_trace = true;

    再将其关闭后,重新启动实例出现下列提示

   

        SQL> startup    --启动实例

        ORA-32004: obsolete and/or deprecated parameter(s) specified

        ORACLE instance started.

 

        Total System Global Area  469762048 bytes

        Fixed Size                  1220048 bytes

        Variable Size             180355632 bytes

        Database Buffers          285212672 bytes

        Redo Buffers                2973696 bytes

        Database mounted.

        Database opened.

 

        [oracle@robinson ~]$ oerr ora 32004  --查看具体的错误信息描述有参数设置不妥

        32004, 00000, "obsolete and/or deprecated parameter(s) specified"

        // *Cause:  One or more obsolete and/or parameters were specified in

        //          the SPFILE or the PFILE on the server side.

        // *Action: See alert log for a list of parameters that are obsolete.

        //          or deprecated. Remove them from the SPFILE or the server

        //          side PFILE.

       

        --查看告警日志

        SQL> ho cat $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log

           

            Deprecated system parameters with specified values:

                      sql_trace     --描述为sql_trace            

                    End of deprecated system parameter listing 

                   

        SQL> show parameter sql_trace;  --查看该参数已经置为false

 

        NAME                                 TYPE        VALUE

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

        sql_trace                            boolean     FALSE     

 

        --使用reset将其从参数文件中清除后启动正常

        SQL> alter system reset sql_trace scope = spfile sid = '*';

 

        System altered.

 

        SQL> startup force;

        ORACLE instance started.

 

        Total System Global Area  469762048 bytes

        Fixed Size                  1220048 bytes

        Variable Size             184549936 bytes

        Database Buffers          281018368 bytes

        Redo Buffers                2973696 bytes

        Database mounted.

        Database opened.

       

五、更多       

   

Oracle 冷备份

 

SPFILE错误导致数据库无法启动

 

Oracle 用户、对象权限、系统权限

 

Oracle 角色、配置文件

 

  Oracle 联机重做日志文件(ONLINE LOG FILE)

 

  Oracle 控制文件(CONTROLFILE)

 

  Oracle 表空间与数据文件

 

Oracle 归档日志

 

<think>好的,我现在需要帮助用户解决如何在htop中查看特定用户进程。首先,我得回忆一下用户之前的问题和之前的回答,确保这次的回答能够连贯并充分利用已有的信息。 用户之前询问的是关于定时任务中运行`/usr/bin/named`的服务,我详细解释了系统活动会计工具、分析了cron任务的问题,并给出了调试建议。现在用户的新问题是关于htop中查看特定用户进程的方法,引用了之前提到的htop命令相关信息。 首先,用户的需求很明确:他们想了解如何在htop中筛选特定用户进程。根据提供的引用,htop是一个功能强大的进程查看器,支持颜色区分、鼠标操作和多种排序方式。用户可能已经安装了htop,但需要具体的使用指导。 接下来,我需要考虑htop的基本操作和过滤功能。htop中通常可以通过过滤器来筛选进程,例如按F4键输入用户名进行过滤。但用户可能还想知道其他方法,比如在启动htop时直接指定用户,或者使用命令行参数结合其他工具如ps和pgrep来辅助。 我需要确保回答步骤清晰,包括不同的方法,比如界面操作和命令行参数。同时,用户可能需要知道如何确认自己的htop版本是否支持某些功能,比如`-u`参数,这可能在某些旧版本中不可用,所以需要提醒用户检查。 另外,用户可能对如何结合其他命令感兴趣,比如用ps或pgrep查找用户进程的PID,然后在htop中跟踪这些PID。这也是一个有效的方法,特别是当用户需要更复杂的过滤条件时。 还要注意引用之前提到的内容,比如引用[1]提到htop的用户友好性和资源监控,引用[2]提到安装方法和交互功能,引用[3]提到使用ps命令查看进程内存情况。在回答中适当引用这些内容可以增强信息的连贯性和可信度。 最后,确保回答结构清晰,分步骤说明,并包含验证和注意事项部分,帮助用户避免常见错误。例如,提醒用户权限问题,或者某些选项可能需要特定版本的htop。此外,提供相关问题可以引导用户进一步探索相关主题,如颜色标识的含义或内存监控方法。 总结下来,回答需要涵盖多种方法,详细的操作步骤,可能的注意事项,以及相关问题的扩展,确保用户能够全面理解并灵活应用不同的方法来查看特定用户进程。</think>### 在htop中查看特定用户进程的详细方法 --- #### **方法一:通过htop界面直接过滤(推荐)** 1. **启动htop** 在终端输入命令: ```bash htop ``` - 若未安装,按系统类型执行安装(参考引用[2]): ```bash # CentOS sudo yum install htop # Ubuntu sudo apt install htop ``` 2. **使用用户过滤功能** - **按`F4`键**:进入进程过滤模式 - **输入用户名**:在过滤框中输入目标用户名(如`root`或`nginx`),仅显示该用户的所有进程 - **清除过滤**:按`Esc`键或删除过滤条件即可恢复全部显示 **示例效果**: ![htop-filter](https://via.placeholder.com/600x200?text=Filtered+by+user+'nginx') *图中仅显示`nginx`用户相关的进程,包含PID、CPU、内存等详细信息[^1][^2]* --- #### **方法二:通过命令行参数指定用户** 1. **直接启动时过滤** 使用`-u`参数指定用户名(部分htop版本支持): ```bash htop -u username ``` - **验证支持性**:若提示参数错误,需升级htop版本 ```bash htop --version # 查看版本是否≥2.0 ``` 2. **结合`pgrep`动态过滤** 通过管道将特定用户进程PID传递给htop: ```bash pgrep -u username | htop --pid $(paste -s -d,) ``` - **原理**:`pgrep -u username`获取目标用户的所有进程PID,通过`--pid`参数传递给htop[^3] --- #### **方法三:通过进程树视图追踪** 1. **进入树状视图** - 按`F5`键:切换为**进程树**显示模式 - **优势**:可直观查看用户进程及其子进程的层级关系 2. **结合过滤功能** - 在树状视图下按`F4`键,输入用户名过滤 - **典型场景**:分析Web服务器(如`apache`用户)的进程树及其资源占用 --- #### **方法四:通过颜色标识辅助识别** 1. **理解颜色规则** - htop默认用不同颜色区分进程状态(参考引用[1]): - **绿色**:普通用户进程 - **红色**:系统/root进程 - **自定义配色**:通过`F2`进入设置菜单修改颜色方案 2. **快速定位用户进程** - 根据颜色筛选目标用户进程(如非特权用户多为绿色进程) --- ### **验证与调试** 1. **确认用户权限** - 普通用户仅能查看自身进程,需`sudo htop`查看所有用户进程 2. **检查进程归属** 若过滤后无结果显示,验证用户是否存在有效进程: ```bash ps -u username # 列出用户所有进程 ``` --- ### **注意事项** 1. **版本兼容性** - 旧版htop可能不支持`-u`参数,建议升级至最新版: ```bash # CentOS (需启用EPEL仓库) sudo yum update htop ``` 2. **资源占用** - htop自身会消耗少量CPU和内存,建议在低负载时使用 --- ### **相关问题** 1. 如何通过htop实时监控某个进程的内存使用变化? 2. htop中不同颜色标识的具体含义是什么? 3. 如何将htop的过滤结果导出为文本文件? --- [^1]: htop通过交互式界面提供更直观的进程管理功能,支持鼠标操作和动态过滤[^2]。 [^2]: `htop -u`参数需特定版本支持,建议通过软件仓库更新至稳定版[^2]。 [^3]: `pgrep`命令可快速获取用户进程的PID列表,常用于脚本化操作[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风智语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值