AUL的数据恢复主要关注于数据本身, 象索引结构之类的信息AUL虽不自动整理, 但它们也不过是存放在系统表空间中的数据, 还是可以恢复的. 原理是将系统表的数据导出来, 再导入到新的库中, 然后自已 写SQL语句来进行查询, 列出表上的索引信息.
除了SYS.USER$和SYS.OBJ$外, 我们还要导出下面几个系统表的数据.
unload table sys.ind$ to sys_ind.txt;
unload table sys.icol$ to sys_icol.txt;
unload table sys.col$ to sys_col.txt;
调用建表角本, 创建表.
@IND$_syntax.sql
@ICOL$_syntax.sql
@COL$_syntax.sql
运行sqlldr将数据导入到新的库, 注意不要将这些数据导入到SYS用户下.
sqlldr test/test control=IND$_sqlldr.ctl
sqlldr test/test control=ICOL$_sqlldr.ctl
sqlldr test/test control=COL$_sqlldr.ctl
再写个SQL就可以很方便地获得某个用户下所有索引的结构了, 下面这名SQL中没有分区唯一性索引一否, 并且一定要在9i以上的版本中使用, 因为用了SYS_CONNECT_BY_PATH函数.
SELECT
'CREATE INDEX '||I.NAME||' ON '||T.NAME||'('||IDX.PATH||');' INDEX_DDL
FROM
USER$ U, OBJ$ T, OBJ$ I,
(
select I.BO#, I.OBJ#, C.POS#,
SUBSTR(sys_connect_by_path(CN.NAME,','),2) path
from IND$ I, ICOL$ C, COL$ CN
WHERE I.OBJ# = C.OBJ# AND I.BO# = C.BO#
AND I.BO# = CN.OBJ# AND C.COL# = CN.INTCOL#
start with C.POS#=1
connect by PRIOR I.OBJ# = I.OBJ#
AND prior C.POS# = C.POS# - 1 ) IDX,
(SELECT I.BO#, I.OBJ#, COUNT(*) COLCNT
FROM ICOL$ I GROUP BY I.BO#, I.OBJ#) IDXC
WHERE
U.USER# = T.OWNER# AND
IDX.BO# = T.OBJ# AND
IDX.OBJ# = I.OBJ# AND
IDX.BO# = IDXC.BO# AND
IDX.OBJ# = IDXC.OBJ# AND
IDX.POS# = IDXC.COLCNT AND
U.NAME = '用户名'
ORDER BY T.NAME, I.NAME
这样也算比较方便了. 这个功能要求系统表空间必需存在.