Oracle非常规恢复,通过ODU工具恢复包,过程,函数,视图,触发器等数据
当数据库不能拉起来时候,我们可以通过odu找回丢失的数据,今天客户出要求,需要我帮忙找回不能起来库中的包,过程,函数,视图,触发器等之类东西。这些东西都是存在system空间中,存在一些系统的基表中,我们如果能够拿到这些基表的数据然后进行处理,原则上就可以得到客户需要的东西
一、恢复PROCEDURE/FUNCTION/PACKAGE/PACKAGE BODY/TRIGGER/TYPE/TYPE BODY中的数据
1. 查看这些数据存储在什么基表中
select u.name, o.name, decode(o.type#, 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE', 11, 'PACKAGE BODY', 12, 'TRIGGER', 13, 'TYPE', 14, 'TYPE BODY', 'UNDEFINED'), s.line, s.source from sys.obj$ o, sys.source$ s, sys.user$ u where o.obj# = s.obj# and o.owner# = u.user# and ( o.type# in (7, 8, 9, 11, 12, 14) OR ( o.type# = 13 AND o.subname is null)) union all select u.name, o.name, 'JAVA SOURCE', s.joxftlno, s.joxftsrc from sys.obj$ o, x$joxfs s, sys.user$ u where o.obj# = s.joxftobn and o.owner# = u.user# and o.type# = 28;
通过这个sql知道主要存储在sys.obj$ o, sys.source$ s, sys.user$中(至于x$joxfs表,我暂时在数据库中未找到,不能使用odu提取数据,也就是说我这里不能恢复出来JAVA SOURCE)
2. 使用odu导出数据(注意output_format设置为dmp,防止出现意外)
使用类此unload table sys.obj$ 下面语句导出数据
3. 加载这些数据到新库中(切记不要使用sys schema)
使用类此imp chf/oracleplus file=d:/SYS_OBJ$.dmp fromuser=sys touser=chf导入数据
4. 在查询出需要对象
SELECT u.name USER_NAME, o.name OBJECT_nAME, DECODE (o.type#, 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE', 11, 'PACKAGE BODY', 12, 'TRIGGER', 13, 'TYPE', 14, 'TYPE BODY', 'UNDEFINED') OBJECT_tYPE, s.line, s.source FROM chf.obj$ o, chf.source$ s, chf.user$ u WHERE o.obj# = s.obj# AND o.owner# = u.user# AND (o.type# IN (7, 8, 9, 11, 12, 14) OR (o.type# = 13 AND o.subname IS NULL)) --过来条件选择出需要对象 -- AND U.name='BSSADMIN' ORDER BY U.NAME, O.NAME, O.TYPE#, S.LINE;
5. 使用说明
在line=1的source前面加上create or replace ,使用合适的用户创建需要对象
二、恢复Oracle 视图VIEW中的数据
1. 找出视图存储基表
sys.obj$,sys.view$,sys.user$
2. 使用odu导出需要表
3. 使用imp导入数据库
4. 查询语句
SELECT u.name username, o.name viewname, v.text FROM chf.obj$ o, chf.view$ v, chf.user$ u WHERE o.obj# = v.obj# AND o.owner# = u.user# --过滤条件,挑选需要视图 AND u.name = 'MAS_ADMIN';
5. 使用说明
create VIEW OR REPLACE username.viewname AS+TEXT中内容
三、恢复Oracle dblink内的数据
1. 找出关联基表
Sys.link$和sys.user$
2. odu导出相关表
3. imp导入数据
4. 查询语句
SELECT U.NAME USERNAME, L.NAME DBLINK_NAME, L.USERID LOGIN_USER, L.HOST TNS, L.CTIME FROM CHF.LINK$ L, CHF.USER$ U WHERE L.OWNER# = U.USER# --过滤条件 AND U.NAME = 'PUBLIC'
5. 使用说明
根据查询出来信息,自己创建DBLINK
--------------------------------------ORACLE-DBA----------------------------------------
最权威、专业的Oracle案例资源汇总之案例:Oracle非常规恢复ODU恢复PACKAGE/VIEW/DBLINK等数据脚本操作
原文唯一网址:http://www.oracleplus.net/arch/oracle-20160606-292.html