生產環境常遇三大緊急狀況:表被鎖死、誤 DROP TABLE、程序被錯誤覆蓋。本文提供標準化處理腳本與查詢語句,建議收藏備查。
-- 1. 查詢鎖定會話(需 DBA 權限) SELECT o.object_name, s.sid, s.serial#, p.spid, s.machine FROM v$locked_object l JOIN dba_objects o ON l.object_id = o.object_id JOIN v$session s ON l.session_id = s.sid JOIN v$process p ON s.paddr = p.addr WHERE o.object_name = 'T1'; -- 表名大寫 -- 2. 強制殺掉會話 ALTER SYSTEM KILL SESSION 'sid,serial#'; -- 例:'133,37' -- 3. 再次查詢確認鎖已釋放
-- 1. 一般 DROP TABLE 只進入回收桶 FLASHBACK TABLE t1 TO BEFORE DROP; -- 2. 確認回收桶內容 SELECT object_name, type, original_name FROM user_recyclebin; -- 3. 若使用 PURGE 選項則無法閃回 -- DROP TABLE t1 PURGE; -- 慎用!
方法一:查詢 DBA_SOURCE 歷史版本
-- 包頭
SELECT * FROM dba_source
AS OF TIMESTAMP TO_TIMESTAMP('2015-07-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-07-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;
方法二:查詢 OBJ$ / SOURCE$ 基礎表(同樣需 AS OF TIMESTAMP)
-- 1. 取得 OBJ#
SELECT obj# FROM obj$
AS OF TIMESTAMP TO_TIMESTAMP('2015-07-22 09:25:32','YYYY-MM-DD HH24:MI:SS')
WHERE name = UPPER('CREATE_ODS_INDEXES');
-- 2. 依 OBJ# 取回原始碼(包頭/包體 OBJ# 不同)
SELECT source FROM source$
AS OF TIMESTAMP TO_TIMESTAMP('2015-07-22 09:25:32','YYYY-MM-DD HH24:MI:SS')
WHERE obj# = 76005; -- 包頭
SELECT source FROM source$
AS OF TIMESTAMP TO_TIMESTAMP('2015-07-22 09:25:32','YYYY-MM-DD HH24:MI:SS')
WHERE obj# = 76006; -- 包體
UNDO_MANAGEMENT=AUTO 且 UNDO_RETENTION 足夠覆蓋目標時間點。SYS、SYSDBA 或 SELECT ANY DICTIONARY 權限。