ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于oracle数据库内部杀掉进程及session视图的测试

关于oracle数据库内部杀掉进程及session视图的测试

原创 Linux操作系统 作者:sxitsxit 时间:2012-03-02 10:33:54 0 删除 编辑
测试环境:
OS: rhelas4
DB : oracle10r2

测试目录:

1:通过session 找到spid,通过操作系统或者oracle层面杀掉进程。
2:通过session和process视图,找到执行的语句。


测试项目
1:通过session 找到spid,通过操作系统或者oracle层面杀掉进程。


测试步骤:

1:确保oracle已经启动到open状态,监听正常打开
2:退出所有的crt连接,通过windows的cmd窗口进行登录。

如下:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\sxit>cd \
C:\>sqlplus scott/tiger@ora10
SQL*Plus: Release 10.1.0.2.0 - Production on 星期四 4月 14 16:14:31 2011
Copyright (c) 1982, 2004, Oracle. All rights reserved.

连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>

注:
a:在oracle10g中,默认都会有scott用户,通过一个脚本可以激活该用户,linux下的脚本保存位置为:

$ORACLE_HOME/rdbms/admin/utlsampl.sql 。但是要让该用户能够登录数据库,必须赋予该用户

create session 等一些基本的系统权限。关于系统权限和对象权限,可以在网上搜搜。

当然也可以用其他已经创建好的用户登录。

b:通过客户端登录数据库,都会启用口令文件认证。如果你登录到db server本机上,执行的 sqlplus '/as sysdba' 就是操作系统认证,其实在db server本机随便输入任意用户名和密码,就可以登录到oracle数据库中,类似于sqlplus sss/ttt as sysdba 都可以登录到oracle数据库中,因为在数据库本机登录启用的是操作系统认真,口令文件认证失效。当然,你也可以屏蔽操作系统认证,改用口令文件认证。

3:oracle数据库分为共享模式和专有模式,具体的原理在这里就不做介绍了。
一般通过客户端连接数据库,都会用到v$session 和 v$process 这两个视图。
session----会话
process---进程

客户端用户连接数据库会启动一个用户session, 这个session生命周期直到该用户退出。
seesion建立以后,oracle server会分配一个process为该session服务。(具体要视db是共享还是专有模式而定)

4:当通过windows的cmd窗口,成功登录db以后,执行如下
执行如下语句,需要scott用户具有create session、select v$session 权限,关于赋予权限,请查相关资料。

SQL> select distinct sid from v$mystat;
SID
----------
148
SQL> desc v$session;
名称 是否为空? 类型
----------------------------------------- -------- -----------------------
SADDR RAW(4)
SID NUMBER
SERIAL# NUMBER
AUDSID NUMBER
PADDR RAW(4)
USER# NUMBER
USERNAME VARCHAR2(30)
COMMAND NUMBER
OWNERID NUMBER
TADDR VARCHAR2(8)
LOCKWAIT VARCHAR2(8)
STATUS VARCHAR2(8)
SERVER VARCHAR2(9)
SCHEMA# NUMBER
SCHEMANAME VARCHAR2(30)
OSUSER VARCHAR2(30)
PROCESS VARCHAR2(12)
MACHINE VARCHAR2(64)
TERMINAL VARCHAR2(30)
PROGRAM VARCHAR2(48)
TYPE VARCHAR2(10)
SQL_ADDRESS RAW(4)
SQL_HASH_VALUE NUMBER
SQL_ID VARCHAR2(13)
SQL_CHILD_NUMBER NUMBER
PREV_SQL_ADDR RAW(4)
PREV_HASH_VALUE NUMBER
PREV_SQL_ID VARCHAR2(13)
PREV_CHILD_NUMBER NUMBER
MODULE VARCHAR2(48)
MODULE_HASH NUMBER
ACTION VARCHAR2(32)
ACTION_HASH NUMBER
CLIENT_INFO VARCHAR2(64)
FIXED_TABLE_SEQUENCE NUMBER
ROW_WAIT_OBJ# NUMBER
ROW_WAIT_FILE# NUMBER
ROW_WAIT_BLOCK# NUMBER
ROW_WAIT_ROW# NUMBER
LOGON_TIME DATE
LAST_CALL_ET NUMBER
PDML_ENABLED VARCHAR2(3)
FAILOVER_TYPE VARCHAR2(13)
FAILOVER_METHOD VARCHAR2(10)
FAILED_OVER VARCHAR2(3)
RESOURCE_CONSUMER_GROUP VARCHAR2(32)
PDML_STATUS VARCHAR2(8)
PDDL_STATUS VARCHAR2(8)
PQ_STATUS VARCHAR2(8)
CURRENT_QUEUE_DURATION NUMBER
CLIENT_IDENTIFIER VARCHAR2(64)
BLOCKING_SESSION_STATUS VARCHAR2(11)
BLOCKING_INSTANCE NUMBER
BLOCKING_SESSION NUMBER
SEQ# NUMBER
EVENT# NUMBER
EVENT VARCHAR2(64)
P1TEXT VARCHAR2(64)
P1 NUMBER
P1RAW RAW(4)
P2TEXT VARCHAR2(64)
P2 NUMBER
P2RAW RAW(4)
P3TEXT VARCHAR2(64)
P3 NUMBER
P3RAW RAW(4)
WAIT_CLASS_ID NUMBER
WAIT_CLASS# NUMBER
WAIT_CLASS VARCHAR2(64)
WAIT_TIME NUMBER
SECONDS_IN_WAIT NUMBER
STATE VARCHAR2(19)
SERVICE_NAME VARCHAR2(64)
SQL_TRACE VARCHAR2(8)
SQL_TRACE_WAITS VARCHAR2(5)
SQL_TRACE_BINDS VARCHAR2(5)
SQL> select sid,server from v$session where sid=148;
SID SERVER
---------- ------------------
148 DEDICATED
SQL> select sid,paddr from v$session where sid=148;
SID PADDR
---------- --------
148 29E1B254
SQL> select sid,spid from v$process where addr='29E1B254';
select sid,spid from v$process where addr='29E1B254'
*
第 1 行出现错误:
ORA-00904: "SID": ?????

SQL> alter session set nls_language=american;
Session altered.
SQL> select pid,spid from v$process where addr='29E1B254';
PID SPID
---------- ------------------------
15 3226
SQL>

从中可以看到spid,这个spid就是操作系统层次的进程id。

[oracle@sphost ~]$ ps -ef |grep 3226
oracle 3226 1 0 18:19 ? 00:00:00 oracleora10 (LOCAL=NO)

5:通过oracle内部杀掉该客户端进程。

通过oracle 的联机文档,找到相关语法
When a session is terminated, any active transactions of the session are rolled back, and resources held by the session (such as locks and memory areas) are immediately released and available to other sessions.
You terminate a current session using the SQL statement ALTER SYSTEM KILL SESSION. The following statement terminates the session whose system identifier is 7 and serial number is 15:
ALTER SYSTEM KILL SESSION '7,15'; SQL> select sid,serial# from v$session where sid=148; SID SERIAL#
---------- ----------
148 4 SQL> alter system kill session '148,4';System altered.SQL> 通过oracle内部杀掉该进程以后,即可看到status字段由原来的inactive变为了killedoracle的后台进程pmon会回收该进程的资源和锁。 6:通过操作系统层面杀掉进程 刚才已经找到了spid,及就是操作系统级别的id,可以通过kill -9 spid 杀掉,但是一般不到万不得已,不要通过kill的方式杀掉进程。另外,如果直接杀掉oracle的后台进程的话,会导致oracle重启。 测试项目:2:通过session和process视图,找到执行的语句。

测试步骤:

1:oracle监听正常、数据库启动到open状态
2:scott用户登录数据库
3:往scott用户下插入一条数据
SQL> insert into dept values (50,'ceshi','rossll');
1 row created.




但是一直不提交,简单的模拟锁。
4:select * from v$session where username='SCOTT' 注意这里scott一定要大写。找到prev_hash_value的值,
经过查询该值为 2009047607,然后执行如下语句:
select * from v$sql where hash_value='2009047607'
查看该字段中的SQL_TEXT ,即就是你执行的语句。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24862808/viewspace-717492/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-14

  • 博文量
    98
  • 访问量
    293475