OracleMove命令总结(二)

2014-11-24 15:15:55 · 作者: · 浏览: 1
tial 30k next 50k);

c.另外,move操作也可以用来解决table中的行迁移的问题。
使用move的一些注意事项:

a. table上的index需要rebuild:

在前面我们讨论过,move操作后,数据的rowid发生了改变,我们知道,index是通过rowid来fetch数据行的,所以,table上的index是必须要rebuild的。
SQL> create index i_my_objects on my_objects (object_id);

Index created

SQL> alter table my_objects move;

Table altered

SQL> select index_name,status from user_indexeswhere index_name='I_MY_OBJECTS';

从这里可以看到,当tableMY_OBJECTS进行move操作后,该table上的inedx的状态为UNUSABLE,这时,我们可以使用alterindex I_MY_OBJECTS rebuild online的命令,对index I_MY_OBJECTS进行在线rebuild。

b. move时对table的锁定

当我们对tableMY_OBJECTS进行move操作时,查询v$locked_objects视图可以发现,tableMY_OBJECTS上加了exclusivelock:
SQL>select OBJECT_ID, SESSION_ID,ORACLE_USERNAME,LOCKED_MODE from v$locked_objects;

SQL> select object_id from user_objects whereobject_name = 'MY_OBJECTS';

OBJECT_ID

----------

这就意味着,table在进行move操作时,我们只能对它进行select的操作。反过来说,当我们的一个session对table进行DML操作且没有commit时,在另一个session中是不能对这个table进行move操作的,否则oracle会返回这样的错误信息:ORA-00054: 资源正忙,要求指定 NOWAIT。

c. 关于move时空间使用的问题:

当我们使用altertable move来降低table的HWM时,有一点是需要注意的,这时,当前的tablespace中需要有1倍于table的空闲空间以供使用:

SQL> CREATE TABLESPACE TEST1 DATAFILE 'D:\ORACLE\ORADATA\ORACLE9I\TEST1.dbf' SIZE 5M UNIFORMSIZE 128K ;

SQL> create table my_objects tablespace test1 asselect * from all_objects;

表已创建。

SQL> select bytes/1024/1024 from user_segmentswhere segment_name='MY_OBJECTS';

BYTES/1024/1024

---------------

SQL> alter table MY_OBJECTS move;

alter table MY_OBJECTS move

ERROR 位于第 1 行:

ORA-01652: 无法通过16(在表空间TEST1中)扩展 temp 段

SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ORACLE9I\TEST1.DBF' RESIZE7M;

数据库已更改。

SQL> alter table MY_OBJECTS move;

表已更改。