您的位置:首页 > 其它

恢复Set unused的字段数据

2017-05-02 10:48 363 查看
如何修复被设置为UNUSED的字段,以下的方法可以恢复(以下步骤执行前要做好备份

 

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了

 

关于col$数据字典中col#,intcol#的意义参考下面的链接

http://blog.sina.com.cn/s/blog_48e13c9e0100xfhw.html

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

恢复完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: