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