AUL恢复Oracle索引结构?

    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

    这样也算比较方便了. 这个功能要求系统表空间必需存在.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • He's the youngest in the family.
  • 他是一家中最小的.
  • He looks much younger than he is.
  • 他看起来比他实际上年轻得多.
  • I came here when I was 20.
  • 我二十岁来这儿.
  • I started school at the age of 6.
  • 我六岁开始上学.
  • My father is over 60 years old.
  • 我父亲已年过六十了.