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/

  其实这两种方法本质上是一样的,具体就看个人喜好了。

责任编辑:honglu 来源: 博客园
相关推荐

2010-04-19 17:10:53

Oracle用户密码

2013-08-05 16:10:20

2023-07-04 14:55:21

区块链资本

2009-01-18 09:18:00

2010-04-30 18:25:25

Unix删除

2010-03-30 10:26:37

云安全

2013-06-13 13:37:29

2010-03-10 09:44:51

Linux找回根密码

2010-04-06 18:47:26

CentOS系统

2010-04-19 16:56:19

Oracle数据库初始

2010-03-25 21:26:12

2024-01-30 00:48:46

2010-04-30 18:32:52

Unix删除

2019-07-17 09:20:00

Scalpel系统管理员Linux

2013-01-29 16:34:50

和力记易

2018-06-04 10:53:25

2010-05-28 19:39:28

MySQL 编码转换

2010-07-26 10:04:43

SQL Server

2010-07-14 14:16:30

SQL Server

2010-05-28 13:04:04

MySQL root
点赞
收藏

51CTO技术栈公众号