關於oracle資料庫內部殺掉程式及session檢視的測試

xfhuangfu發表於2015-07-04
測試環境:
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
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/28373936/viewspace-1722305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章