1. 程式人生 > >ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句方法

ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句方法

1. ORACLE中檢視當前系統中鎖表情況

select * from v$locked_object 

可以通過查詢v$locked_object拿到sidobjectid,然後用sidv$session連結串列查詢是哪裡鎖的表,用v$session中的objectid欄位和dba_objectsid欄位關聯,查詢詳細的鎖表情況。

查詢SQL如下:

select sess.sid, 
       sess.serial#, 
       lo.oracle_username, 
       lo.os_user_name, 
       ao.object_name, 
       lo.locked
_mode from v$locked_object lo, dba_objects ao, v$session sess, v$process p where ao.object_id = lo.object_id and lo.session_id = sess.sid;

查詢是什麼SQL引起了鎖表的原因,SQL如下:

select l.session_id sid, 
       s.serial#, 
       l.locked_mode, 
       l.oracle_username, 
       s.user#, 
       l.os_user_name, 
       s.machine
, s.terminal, a.sql_text, a.action from v$sqlarea a, v$session s, v$locked_object l where l.session_id = s.sid and s.prev_sql_addr = a.address order by sid, s.serial#;

2. ORACLE解鎖的方法

alter system kill session146′;  –146為鎖住的程序號,即spid 

檢視oracle資料庫允許的最大連線數和當前連線數

在檢視資料的連線情況很有用,寫完程式一邊測試程式碼一邊檢視資料庫連線的釋放情況有助於分析優化出一個健壯的系統程式來。

1、檢視當前的資料庫連線數

 select count(*) from v$process ;    --當前的資料庫連線數

2、資料庫允許的最大連線數

 select value from v$parameter where name ='processes';  --資料庫允許的最大連線數

3、修改資料庫最大連線數

 alter system set processes = 300 scope = spfile;  --修改最大連線數:

4、關閉/重啟資料庫

 shutdown immediate; --關閉資料庫
 startup; --重啟資料庫

5、檢視當前有哪些使用者正在使用資料

select osuser, a.username, cpu_time/executions/1000000||'s', b.sql_text, machine
from v$session a, v$sqlarea b
where a.sql_address =b.address
order by cpu_time/executions desc;  --檢視當前有哪些使用者正在使用資料

6、當前的session連線數

 select count(*) from v$session  --當前的session連線數

7、當前併發連線數

 select count(*) from v$session where status='ACTIVE'; --併發連線數

v$process: 這個檢視提供的資訊,都是oracle服務程序的資訊,沒有客戶端程式相關的資訊服務程序分兩類,一是後臺的,一是dedicate/shared server

pid, serial#     這是oracle分配的PID
spid             這才是作業系統的pid
program          這是服務程序對應的作業系統程序名

v$session

這個檢視主要提供的是一個數據庫connect的資訊,主要是client端的資訊,比如以下欄位:

machine   在哪臺機器上
terminal  使用什麼終端
osuser    作業系統使用者是誰
program   通過什麼客戶端程式,比如TOAD
process   作業系統分配給TOAD的程序號
logon_time  在什麼時間
username    以什麼oracle的帳號登入
command     執行了什麼型別的SQL命令
sql_hash_value  SQL語句資訊

有一些是server端的資訊: paddrv$process中的server程序的addr server 伺服器是dedicate/shared