最近在工作中同事們經常遇到鎖表、誤刪表和程序覆蓋的情況,現總結下遇到這三種情況的解決方案:
1.暴力刪除鎖表
當表被某些語句占用無法停止,或者出現事物阻塞的情況下,需要手動刪除鎖(萬不得已的情況下用):
--首先查詢鎖(需要管理員權限)
SELECT OBJECT_NAME AS 對象名稱,
S.SID,
S.SERIAL#,
P.SPID AS 系統進程號,
S.MACHINE
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, V$PROCESS P
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID
AND S.PADDR = P.ADDR
AND OBJECT_NAME = 'T1';--表名要大寫
若出現結果:
則T1表是鎖定的。
強制刪除鎖的語句是(需要管理員權限):
alter system kill session 'SID,SERIAL#';
在這裡也就是:alter system kill session '133,37';
執行完後,再運行上述查詢sql,發現鎖已經不存在了。
2.找回誤刪表
假如T1表被我刪了:DROP TABLE T1;
那麼找回的語句是:FLASHBACK TABLE t1 TO BEFORE DROP;
因為“drop talbe 表名” 這句話並沒有完全刪除表,通過語句:
SELECT t.object_name,t.type ,t.original_name FROM user_recyclebin t;
可以查詢到剛剛被刪的表:
T1表是從這裡被找回的。如果是這樣刪表的話:
DROP TALBE T1 PURGE;
那就悲劇了,上述語句失效!具體可以參考這篇文章:http://www.cnblogs.com/HondaHsu/archive/2012/09/28/2707487.html
3.找回覆蓋程序
需要管理員權限
法一:
根據時間點查詢程序信息:
SELECT * FROM source$
AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS')
where source like '%CREATE_ODS_INDEXES%'
根據類型查找出程序代碼:
--包頭
SELECT *
FROM DBA_SOURCE AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS')
WHERE NAME LIKE UPPER('%CREATE_ODS_INDEXES%')
AND OWNER = 'SCOTT'
AND TYPE = 'PACKAGE'
ORDER BY LINE;
結果:
--包體
SELECT *
FROM DBA_SOURCE AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS')
WHERE NAME LIKE UPPER('%CREATE_ODS_INDEXES%')
AND OWNER = 'SCOTT'
AND TYPE = 'PACKAGE BODY'
ORDER BY LINE;
結果:
具體參考:http://blog.sina.com.cn/s/blog_6d6e54f701012mp5.html
法二:
根據時間點查詢程序信息:
SELECT OBJ#
FROM OBJ$ AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS')
WHERE NAME = UPPER('CREATE_ODS_INDEXES');
結果:
找回包頭和包體:
--查詢出來的為包頭
SELECT SOURCE FROM SOURCE$ AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS') WHERE OBJ# = 76005;
--查詢出來的為包體
SELECT SOURCE FROM SOURCE$ AS OF TIMESTAMP TO_TIMESTAMP('2015-7-22 09:25:32', 'YYYY-MM-DD HH24:MI:SS') WHERE OBJ# = 76006;
具體參考:http://blog.itpub.net/35489/viewspace-761921/
其實這兩種方法本質上是一樣的,具體就看個人喜好了。