方法1, alter table XXX move to tablespace XXXX; 然后重建索引, 重建表空间为LMT , 是用的最多且能彻底消除碎片的方式 。
方法2, exp/imp方法,可能是非常耗费时间的。
方法3, 使用 DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL可以直接将数据字典管理表空间转换为本地管理表空间。 对system表空间要慎重,最好不要在产品库上进行这种操作 (
对于system表空间转化,需要将数据库设置成restrict模式 )。
在很多情况下,如果你想在字典表空间与本地表空间之间转换是很难的,你可能需要转出该表空间所有的数据,从新创建表空间,再加载该数据。但是在816以后,有一个叫dbms_space_admin
的包使两类表空间的互相转换变成可能,体现在如下两个过程:
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL
但是在你想利用这个过程进行转换的时候,你必须注意两件事:
1、 数据库版本必须是816以上,兼容版本(compatible)必须是8.1以上
2、 如果是转换成为本地管理,必须有足够的空闲空间做本地位图空间(8个块)
当从字典管理到本地管理的过程中,全部转换其实基本上是不可能发生的,实际情况是,对于已经存在的数据和空间,该过程是没有任何办法的,仅仅是简单把空间取整并标记。所以说,这
种转换后的表空间可以减缓UET$和FET$的压力,但并不能解决碎片问题。从查询DBA_TABLESPACES你还可以看到,转换之后的表空间管理方式是LOCAL,但实际段分配是USER(不是uniform或
automatic)。
很显然,在字典管理的表空间中,存在许多大小不同的区间(extent)尺寸,所以转换为本地管理的时候,ORACLE怎么样把这些已经存在的空间转换为通用大小了?为了做到这一点,ORACLE必
须扫描该表空间的每个数据文件,主要是检查以下三个问题:
1、 所有的已经存在的区间
2、 所有的以前用过,但是现在空闲的空间
3、 由表空间MINIMUM EXTENT语句标记的大小
在转换的时候,ORACLE试图发现一个适合于以上三个标准的最大的区间的尺寸作为本地管理的区间尺寸,也就是说,在最坏的情况下,这个最大的区间可能就是单个块(如果说一个表的区间
尺寸是7个块,另外一个表的区间尺寸是8个块)
我们看一个从字典管理表空间到本地管理表空间的例子
1、首先,我们创建一个字典管理表空间SQL> create tablespace blah
datafile 'G:ORA9IORADATADB9BLAH.DBF' size 10m reuse
extent management dictionary;
Tablespace altered.
SQL> col bytes format 999,999,999
SQL> select * from dba_free_space where tablespace_name = 'BLAH';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCK RELATIVE_FNO
--------------- -------- ----------- ------------ ------- ----------------
BLAH 8 2 10,477,568 1279 8
2、我们在上面创建三个表,最小公用尺寸是400KSQL> create table t1 ( x number ) storage ( initial 400k) tablespace blah;
Table created.
SQL> create table t2 ( x number ) storage ( initial 800k) tablespace blah;
Table created.
SQL> create table t3 ( x number ) storage ( initial 1200k) tablespace blah;
Table created.
SQL> select * from dba_free_space where tablespace_name = 'BLAH';
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCK RELATIVE_FNO
--------------- -------- ----------- ----------- ------- ----------------
BLAH 8 302 8,019,968 979 8
SQL> select bytes from dba_extents where tablespace_name = 'BLAH';
BYTES
----------
409,600
819,200
1,228,800
3、现在我们开始转换该表空间为本地管理的表空间,假定每个位图大小400K,也就是50个块。SQL> exec dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50);
BEGIN dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50); END;
*
ERROR at line 1:
ORA-03241: Invalid unit size
ORA-06512: at "SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: at line 1
如果我们设置表空间的minimum extent语句为400K: SQL> alter tablespace blah minimum extent 400k;
Tablespace altered.
SQL> exec dbms_space_admin.TABLESPACE_MIGRATE_TO_LOCAL('BLAH',50);
PL/SQL procedure successfully completed.
Conversion goes through with no problems.
从以上可以看到,转换成功,但实际情况远远比这么复杂,或许你根本就不知道表空间里面的公用尺寸是多大。而且通过这种转换后的表空间,并没有消除碎片,也不一定有优化的作用。所
以建议不要用该方法进行转换,而是使用alter table move的办法进行表空间的转换将可能是最好的办法。
---------------------------------------------------------------------------------------
修改系统表空间(SYSTEM)从DMT到LMT
测试环境测试过程:
SQL> Exec dbms_space_admin.tablespace_migrate_to_local('SYSTEM');
BEGIN dbms_space_admin.tablespace_migrate_to_local('SYSTEM'); END;
*
ERROR at line 1:
ORA-10643: Database should be mounted in restricted mode and Exclusive mode
ORA-06512: at "SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: at line 1
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup restrict;
ORACLE instance started.
Total System Global Area 1269796704 bytes
Fixed Size 733024 bytes
Variable Size 1090519040 bytes
Database Buffers 167772160 bytes
Redo Buffers 10772480 bytes
Database mounted.
Database opened.
SQL> Exec dbms_space_admin.tablespace_migrate_to_local('SYSTEM');
BEGIN dbms_space_admin.tablespace_migrate_to_local('SYSTEM'); END;
*
ERROR at line 1:
ORA-10647: Tablespace other than SYSTEM,APPS_UNDOTS1, TEMP not found in read
only mode
ORA-06512: at "SYS.DBMS_SPACE_ADMIN", line 0
ORA-06512: at line 1
ORA-30021: Operation not allowed on undo tablespace
select 'alter tablespace '||tablespace_name|| ' read only ;',status from dba_tablespaces;
SQL> alter tablespace PERFSTAT read only;
Tablespace altered.
SQL> alter tablespace OEM_REPOSITORY read only;
Tablespace altered.
SQL> alter tablespace PORTAL read only;
Tablespace altered.
SQL> alter tablespace OWAPUB read only;
Tablespace altered.
SQL> alter tablespace OLAP read only;
Tablespace altered.
SQL> alter tablespace ODM read only;
Tablespace altered.
SQL> alter tablespace CTXD read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_TX_IDX read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_TX_DATA read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_SUMMARY read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_SEED read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_QUEUES read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_NOLOGGING read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_MEDIA read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_INTERFACE read only ;
Tablespace altered.
SQL> alter tablespace APPS_TS_ARCHIVE read only ;
Tablespace altered.
SQL> Exec dbms_space_admin.tablespace_migrate_to_local('SYSTEM');
PL/SQL procedure successfully completed.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1269796704 bytes
Fixed Size 733024 bytes
Variable Size 1090519040 bytes
Database Buffers 167772160 bytes
Redo Buffers 10772480 bytes
Database mounted.
Database opened.
select 'alter tablespace '||tablespace_name|| ' read write ;',status from dba_tablespaces;
SQL> alter tablespace PERFSTAT read write ;
SQL> alter tablespace APPS_TS_ARCHIVE read write ;
SQL>alter tablespace APPS_TS_INTERFACE read write ;
SQL>alter tablespace APPS_TS_MEDIA read write ;
SQL>alter tablespace APPS_TS_NOLOGGING read write ;
SQL>alter tablespace APPS_TS_QUEUES read write ;
SQL>alter tablespace APPS_TS_SEED read write ;
SQL> alter tablespace APPS_TS_SUMMARY read write ;
SQL>alter tablespace APPS_TS_TX_DATA read write ;
SQL>alter tablespace APPS_TS_TX_IDX read write ;
SQL> alter tablespace CTXD read write ;
SQL>alter tablespace ODM read write ;
SQL>alter tablespace OLAP read write ;
SQL>alter tablespace OWAPUB read write ;
SQL>alter tablespace PORTAL read write ;
SQL> alter tablespace OEM_REPOSITORY read write ;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-689271/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-689271/