暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

恢复表设置为unused的字段

原创 Anbob 2011-04-08
343
Unused column in the table is set to reuse


先说说unused的用处,当生产库中有一张特大的表,如果像删除一个字段drop column命令因是ddl,会给表级增加排它锁,所有用到该表的应用都无法查询,同样表很大,就会等待很长的时间,所以ORACLE推出了unuse,先把表的该字段设为unuse,等到一个闲的时间再去真正物理的删除,但如果你标为unused了,后悔了咋办?没用,找不回来了,呵呵,有个方法可以找回但操作基表,不到迫不得已不要这么做会有一定风险!



整个操作如下
SQL> conn system/oracle
Connected.
SQL> create user test identified by test;
User created.
SQL> grant connect to test;
Grant succeeded.
SQL> grant resource to test;
Grant succeeded.
SQL> create table test.test_unuse as
2  select * from dba_objects;
Table created.
SQL> conn test/test
Connected.
SQL> select count(*) from test_unuse;
COUNT(*)
----------
50706
SQL> desc test_unuse;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                          NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
SQL> alter table test_unuse set unused column object_id;
Table altered.
SQL> desc test_unuse;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
--开始恢复   基表的owner 为sys
SQL> conn sys/oracle as sysdba;
Connected.
SQL> select obj# from obj$ where name='test_unuse';
no rows selected
SQL> select obj# from obj$ where name='TEST_UNUSE';
OBJ#
----------
66274
SQL> col name for a30
SQL>  select col#,intcol#,name from col$ where obj#=66274
COL#    INTCOL# NAME
---------- ---------- ------------------------------
1          1 OWNER
2          2 OBJECT_NAME
3          3 SUBOBJECT_NAME
0          4 SYS_C00004_11040814:07:01$
4          5 DATA_OBJECT_ID
5          6 OBJECT_TYPE
6          7 CREATED
7          8 LAST_DDL_TIME
8          9 TIMESTAMP
9         10 STATUS
10         11 TEMPORARY
11         12 GENERATED
12         13 SECONDARY
13 rows selected.
SQL> select cols from tab$ where obj#=66274;
COLS
----------
12
SQL> update col$ set col#=intcol# where obj#=66274;
13 rows updated.
SQL> update tab$ set cols=13 where obj#=66274;
1 row updated.
SQL> update col$ set name='OBJECT_ID' WHERE obj#=66274 and col#=4;
1 row updated.
SQL> select obj#,col#,name,property
2  from col$
3  where obj#=66274;
OBJ#       COL# NAME                             PROPERTY
---------- ---------- ------------------------------ ----------
66274          1 OWNER                               14336
66274          2 OBJECT_NAME                         14336
66274          3 SUBOBJECT_NAME                      14336
66274          4 OBJECT_ID                           47136
66274          5 DATA_OBJECT_ID                      14336
66274          6 OBJECT_TYPE                         14336
66274          7 CREATED                             14336
66274          8 LAST_DDL_TIME                       14336
66274          9 TIMESTAMP                           14336
66274         10 STATUS                              14336
66274         11 TEMPORARY                           14336
66274         12 GENERATED                           14336
66274         13 SECONDARY                           14336
13 rows selected.
SQL> update col$ set property=0 where obj#=66274;
13 rows updated.
SQL> commit;
Commit complete.
SQL> CONN TEST/TEST
SQL> desc test_unuse;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
SQL>CONN SYSTEM/ORACLE
SQL>ALTER SYSTEM flush shared_pool;
SQL>CONN TEST/TEST
SQL> desc test_unuse;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                              VARCHAR2(30)
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                          NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
SQL> COL OBJECT_NAME FOR A10
SQL> select object_name,object_id from test_unuse WHERE ROWNUM<3;
OBJECT_NAM  OBJECT_ID
---------- ----------
ICOL$              20
I_USER1            44

SQL> show user
USER is "TEST"
SQL> alter table test_unuse set unused column object_name;
Table altered.
SQL> alter table test_unuse drop unused column;
Table altered.
SQL> conn sys/oracle as sysdba
Connected.
SQL> select col#,intcol#,name from col$ where obj#=66274;
COL#    INTCOL# NAME
---------- ---------- ------------------------------
1          1 OWNER
2          2 SUBOBJECT_NAME
3          3 OBJECT_ID
4          4 DATA_OBJECT_ID
5          5 OBJECT_TYPE
6          6 CREATED
7          7 LAST_DDL_TIME
8          8 TIMESTAMP
9          9 STATUS
10         10 TEMPORARY
11         11 GENERATED
12         12 SECONDARY
12 rows selected.
SQL>



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论