ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [zt] 如何将数据字典管理表空间(DMT)转化为本地管理表空间(LMT)

[zt] 如何将数据字典管理表空间(DMT)转化为本地管理表空间(LMT)

原创 Linux操作系统 作者:tolywang 时间:2011-03-12 14:05:29 0 删除 编辑

方法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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 有毒的LED
请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13506748