程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE 解鎖、找回表和找回程序語句,oracle解鎖

ORACLE 解鎖、找回表和找回程序語句,oracle解鎖

編輯:Oracle教程

ORACLE 解鎖、找回表和找回程序語句,oracle解鎖


最近在工作中同事們經常遇到鎖表、誤刪表和程序覆蓋的情況,現總結下遇到這三種情況的解決方案:

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/

其實這兩種方法本質上是一樣的,具體就看個人喜好了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved