Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6683491
  • 博文数量: 1005
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13071
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1005)

文章存档

2020年(2)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Oracle

2011-11-09 17:09:58

如何修复被设置为UNUSED的字段,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。
1、创建实验表TTTA
SQL> CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
表已创建。
SQL> INSERT INTO TTTA VALUES (1,2,'3',4);
已创建 1 行。
SQL> INSERT INTO TTTA VALUES (2,3,'4',5);
已创建 1 行。
SQL> COMMIT;
提交完成。
ALTER TABLE TTTA SET UNUSED COLUMN C;        将ttta表中的C字段设置成不可用的
2、以下进行恢复
        以管理员的身份登陆,其中的oracle是当时安装oracle10g时设置的密码
SQL> conn sys/oracle as sysdba
查找ttta在数据库中分配的编号
SQL> SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';
      OBJ#
----------
     32067
SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=32067;
      COL#    INTCOL# NAME
---------- ---------- ------------------------------
         1          1 A
         2          2 B
         0          3 SYS_C00003_08031720:09:55$   被UNUSED的字段
         3          4 D
SQL> SELECT COLS FROM TAB$ WHERE OBJ#=32067;
      COLS
----------
         3      ------字段数变为3了
SQL> UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=32067;
已更新4行。
SQL> UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=32067;
已更新 1 行。
UPDATE COL$ SET NAME='C' WHERE OBJ#=32067 AND COL#=3;
UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=32067;
SQL> COMMIT;        --提交事务,使之前所做的操作生效
3、重启数据库
SQL> SELECT * FROM SCOTT.TTTA;
         A          B C                   D
---------- ---------- ---------- ----------
         1          2 3                   4
         2          3 4                   5
恢复完成
-- 可以查询unused的字段
  1. Select *
  2. From EXU8COL_TTS_UNUSED_COL
  3. Where tname='TTTA'
阅读(1446) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~