`
shenzhw
  • 浏览: 63949 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

ORACLE MOVE 表空间

 
阅读更多
move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效(LOB类型例外)。做表空间转移之前,被转移表的用户必须在目的表空间上有使用表空间的权限,否则会报错:ORA-01950: no privileges on tablespace...
表move分为
1.普通表move
2.分区表move
3.LONG
4.LOB大字段类型move
5.索引的move通过rebuild来实现
一、move普通表、索引
1、基本语法:
a、alter table table_name t move tablespace xxx;
b、alter index index_name rebuild tablespace xxx;
move过的普通表,在不用到失效的索引的操作语句中,语句执行正常,但如果操作的语句用到了索引(主键当做唯一索引),则此时报告用到的索引失效,语句执行失败,其他如外键,非空约束,缺省值等不会失效。
2、重新创建主键或索引基本语法为:
a、alter index index_name rebuild;
b、alter index pk_name rebuild;
3、move索引用rebuild语法:
a、alter index index_name rebuild tablespace tbs_name;
b、alter index pk_name rebuild tablespace tbs_name;
二、move分区表及索引
和普通表一样,分区表索引会失效,区别的仅仅是语法而已。
1、分区基本语法
注:如果是单级分区,则使用关键字PARTITION,如果是多级分区,则使用SUBPARTITION替代PARTITION。
如果分区或分区索引比较大,可以使用并行move或rebuild,PARALLEL (DEGREE 2);
如:
ALTER TABLE PART_ALARM move SUBPARTITION p_01 TABLESPACE usersPARALLEL (DEGREE 2);
--全局索引
ALTER INDEX GX1_ PART_ALARM REBUILD tablespace usersPARALLEL (DEGREE 2);
--分区索引
ALTER INDEX LX1_ PART_ALARM REBUILD SUBPARTITION p_01 TABLESPACE users1PARALLEL (DEGREE 2);
ALTER INDEX LX1_ PART_ALARM REBUILD SUBPARTITION p_02 TABLESPACE users2PARALLEL (DEGREE 2);
………………
ALTER INDEX LX1_ PART_ALARM REBUILD SUBPARTITION p_0n TABLESPACE usersnPARALLEL (DEGREE 2);
2、移动表的某个分区
ALTER TABLE tab_name move PARTITION partition_name TABLESPACE tbs_name;
3、重建全局索引
ALTER INDEX global_index REBUILD;

ALTER INDEX global_index REBUILD tablespace tbs_name;
4、重建局部索引
ALTER TABLE tab_name MODIFY PARTITION partition_name REBUILD UNUSABLE LOCAL INDEXES;

ALTER INDEX local_index_name REBUILD PARTITION partition_name TABLESPACE tbs_name;

提示:
USER_PART_TABLES
USER_IND_PARTITIONS
USER_IND_SUBPARTITIONS
USER_LOB_PARTITIONS
USER_LOB_SUBPARTITIONS
USER_PART_INDEXES
USER_PART_LOBS
user_segments
三、move LONG类型
可以使用DBMS_REDEFINITION包可以提供一些方便,不过没用过。
long类型不能通过MOVE来传输。特别提示,尽量不要用LONG类型,特难管理。
1、LONG不能使用insert into ... select ...等带select的模式。

create table t123 (id int,en long);

insert into t123(id,en) select * from t123;
报告错误,可以用pl/sql来帮助解决,如:
declare
cursor cur_t123 is select * from t123;
use_t123 cur_t123%rowtype;
begin

open cur_t123;
loop
fetch cur_t123 into use_t123;
exit when cur_t123%notfound;

insert into t123(id,en) values (use_t123.id,use_t123.en);

end loop;
close cur_t123;

end;
/
2、LONG类型字段的表的转移
1.)create新表的方法。
a.create一个新的表,存储在需要转移的表空间。
b.创建新的索引(使用tablespace子句指定新的表空间)。
c.把数据转移过来
2.)用COPY的方法
copy from bigboar/bigboar@bigboar_sid insert t123(id,en) using select id,en from t123;
3、直接就把LONG转换成CLOB类型
create table t321(id int,en clob) tablespace users;
insert into t321(id,en) select id,to_lob(en) from t123;
4、exp/imp
exp bigboar/bigboar file=a.dat tables=t123
imp bigboar/bigboar file=a.dat full=y IGNORE =y
a.drop掉旧表。
b.rename新表为旧表表名。
四、LOB类型
在建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(segment_type=LOBSEGMENT),另一个用来存放索引(segment_type=LOBINDEX)。默认它们会存储在和表一起的表空间。我们对表MOVE时,LOG类型字段和该字段的索引不会跟着MOVE,必须要单独来进行MOVE,语法如下如:
alter table t321 move tablespace users;
alter table t321 move lob(en) store as (tablespace users);
大家都知道在我们建立含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据,另一个用来存放索引,并且它们都会存储在对应表指定的表空间中。但是当我们用alter table tb_name move tablespace tbs_name;来对表做空间迁移时只能移动非lob字段以外的数据,而如果我们要同时移动lob相关字段的数据,我们就必需用如下的含有特殊参数据的文句来完成:
alter table tb_name move tablespace tbs_name lob (col_lob1,col_lob2) store as(tablesapce tbs_name);
五、实际工作操作示例
1、说明
把SOURCE_TABLESPACE表空间上的表移动到DEST_TABLESPACE表空间上,删除SOURCE_TABLESPACE,释放磁盘空间,重新再建一个比原先小的SOURCE_TABLESPACE表空间,再把表移回SOURCE_TABLESPACE。
2、步骤
1.)检查表空间表字段有没有分区、包含LOB字段和LONG字段等

2.) 检查表空间有什么内容(包括表、索引、分区等)
select segment_name,segment_type from dba_segments where tablespace_name=' SOURCE_TABLESPACE';

3.) 移动表和索引
alter table IBSS.TB_CM_MSPARAM_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_SPRESENT_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSSRVLTD_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSITEM_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSOBJECT_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSOBJGRP_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_SERVACCT_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_BANKACCT_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_ACCT_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSINFO_HIST move tablespace DEST_TABLESPACE;
alter table IBSS.TB_CM_MSITEMR_HIST move tablespace DEST_TABLESPACE;

alter index IBSS.IX_CM_MSINFOUST rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSINMSINF rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSIN _DISC rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSITEMNG rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSOBJE ID rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_M_MSINFO rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSOBJET rebuild tablespace DEST_TABLESPACE;
alter index IBSS.IX_CM_MSPRINFO rebuild tablespace DEST_TABLESPACE;

4.) 删除表空间SOURCE_TABLESPACE
DROP TABLESPACE HPMDBS1 INCLUDING CONTENTS and DATAFILES;

5.) 重新创建表空间
CREATE TABLESPACE HPMDBS1 DATAFILE
  '/opt/oracle/oradata1/tbs0101.dbf' SIZE 6192M AUTOEXTEND OFF;

6.) 重新移动表和索引到原空间
alter table IBSS.TB_CM_MSPARAM_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_SPRESENT_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSSRVLTD_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSITEM_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSOBJECT_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSOBJGRP_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_SERVACCT_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_BANKACCT_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_ACCT_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSINFO_HIST move tablespace SOURCE_TABLESPACE;
alter table IBSS.TB_CM_MSITEMR_HIST move tablespace SOURCE_TABLESPACE;

alter index IBSS.IX_CM_MSINFOUST rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSINMSINF rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSIN _DISC rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSITEMNG rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSOBJE ID rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_M_MSINFO rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSOBJET rebuild tablespace SOURCE_TABLESPACE;
alter index IBSS.IX_CM_MSPRINFO rebuild tablespace SOURCE_TABLESPACE;

7.) 检查原先表和索引是否正确,检查表空间索引有没有无效。
SELECT index_name,index_type, STATUS,partitioned, table_name
FROM User_Indexes
Where status=’UNUSABLE’;

六、常用SQL
      该方法可以用来释放被表空间占用的大量的磁盘空间,如果数据对象非常多就很麻烦。可以用以下的SQL来批量处理。
1、重建分区/普通表和索引的拼接sql语句
SELECT 'ALTER INDEX '||t1.owner||'.'||segment_name||' REBUILD '||''||
       CASE WHEN t1.segment_type = 'INDEX PARTITION' THEN 'PARTITION '||partition_name
            WHEN t1.segment_type = 'INDEX SUBPARTITION' THEN 'SUBPARTITION '||partition_name
       ELSE ''
       END
       ||' tablespace '||'&DEST_TABLESPACE'||';'
FROM dba_segments t1
WHERE tablespace_name='&SOURCE_TABLESPACE' AND segment_type IN ('INDEX','INDEX PARTITION','INDEX SUBPARTITION')
UNION
SELECT 'ALTER TABLE '||t1.owner||'.'||segment_name||' MOVE '||''||
       CASE WHEN t1.segment_type = 'TABLE PARTITION' THEN 'PARTITION '||partition_name
            WHEN t1.segment_type = 'TABLE SUBPARTITION' THEN 'SUBPARTITION '||partition_name
       ELSE ''
       END
       ||' tablespace '||'&DEST_TABLESPACE'||';'
FROM dba_segments t1
WHERE tablespace_name='&SOURCE_TABLESPACE' AND segment_type IN ('TABLE','TABLE PARTITION')
ORDER BY 1 DESC;

2、转移LOB字段SQL
SELECT 'ALTER TABLE '||t2.owner||'.'||t2.table_name||' move lob ('||t1.segment_name||')'||' STORE AS ('||' tablespace '||&end_tablespace||');'
FROM dba_segments t1,dba_lobs t2
WHERE t1.segment_name=t2.segment_name AND tablespace_name='&source_tablespace' AND segment_type IN ('LOBINDEX','LOBSEGMENT','LOB PARTITION');
分享到:
评论

相关推荐

    Oracle 表空间 收缩

    ### Oracle 表空间收缩详解 #### 一、背景与需求 在Oracle数据库管理过程中,合理地管理和优化存储空间是非常重要的工作之一。有时,我们会遇到这样的情况:某个表空间占用的实际物理空间远大于其实际需要的空间,...

    Oracle多个表空间合并成一个表空间,验证通过

    ### Oracle 多个表空间合并成一个表空间详解 #### 背景介绍 在进行数据库维护时,可能会遇到需要将多个表空间合并为一个的情况。这种情况通常发生在新项目的开发过程中,尤其是当新项目需要引用来自其他表空间的...

    Oracle压缩表表空间

    从 Oracle 9iR2 开始,Oracle 提供了表/表空间压缩技术,以减少磁盘开销,节省空间,并在某些情况下提高查询性能。 表压缩的工作原理是删除在数据库表中发现的重复数据值,以节省空间。压缩是在数据库的数据块级别...

    oracle查询表空间状态及迁移表.zip_oracle_oracle查询表空间状态_oracle迁移表_状态空间

    在Oracle数据库管理中,了解表空间(Tablespace)的状态至关重要,因为它们是存储数据库对象(如表、索引和视图)的主要容器。本篇将深入探讨如何查询Oracle数据库的表空间状态以及如何迁移表到其他表空间。首先,...

    oracle表空间变动注意事项

    3. **移动表和索引到新表空间**:使用`ALTER TABLE MOVE`和`ALTER INDEX REBUILD`命令。 ### 三、表空间变动后可能出现的问题及解决方案 #### 问题1:索引失效 在移动表时,如果表上存在索引,可能会导致索引失效...

    oracle-临时表空间

    ### Oracle 临时表空间详解 #### 一、Oracle表空间概览 在Oracle数据库系统中,数据被组织成多个逻辑单元,这些单元被称为表空间。每个表空间由一个或多个物理磁盘文件(称为数据文件)组成,并且是数据库中的最高...

    oracle修改表空间的全部步骤,包含bob,clob字段

    在Oracle数据库管理中,修改表空间是一项常见的维护任务,尤其当需要优化存储、解决空间不足或进行数据迁移时。本文将详细阐述如何在Oracle中修改表空间,包括处理BLOB和CLOB字段的具体步骤。 ### 修改表空间的背景...

    oracle查询表碎片

    ### Oracle查询表碎片知识点详解 在Oracle数据库管理与优化的过程中,了解并处理表碎片是非常重要的一个环节。本文将详细介绍如何通过SQL查询来检测Oracle表的碎片情况,并对给出的SQL查询语句进行深入解析。 ####...

    oracle增加表空间的防范

    在Oracle数据库管理系统中,表空间(Tablespace)是存储数据的主要单位,用于组织数据库对象,如表、索引、视图等。理解如何管理和增加表空间对于数据库管理员来说至关重要,尤其是在数据库容量接近饱和或者需要为新...

    在oracle两个表空间之间移动表

    ### 在Oracle两个表空间之间移动表 #### 一、背景介绍 在Oracle数据库管理中,有时需要将表从一个表空间移动到另一个表空间。这种操作可能是为了优化存储空间使用、提升性能或是满足特定的业务需求。Oracle提供了...

    Oracle更改表空间(table、index、lob)

    ### Oracle更改表空间(table、index、lob) 在Oracle数据库管理中,更改表空间是一项重要的维护任务,尤其是在需要重新组织数据或优化存储时。本文将详细介绍如何通过SQL命令来更改表空间中的表(table)、索引...

    从一个表空间 另一个表空间

    根据提供的标题、描述、标签及部分内容,我们可以总结出与Oracle表空间管理相关的多个知识点,具体如下: ### 一、理解Oracle表空间的概念 在Oracle数据库中,表空间是由一个或多个数据文件组成的逻辑存储单元。它...

    ORACLE删除表空间会入到的问题及解决方案.zip_oracle_oracle 解决方案

    MOVE`将表移动至其他表空间。 2. 数据文件丢失:有时,由于误操作,表空间的数据文件可能被误删。在这种情况下,你需要恢复丢失的数据文件,或者创建新的数据文件,并使用`ALTER DATABASE ADD DATAFILE`命令将其...

    oracle全表扫描的3种优化手段

    - **表空间迁移**:将表从一个表空间迁移到另一个表空间,可以利用新表空间的特性来优化表的存储结构,进而提升全表扫描的性能。 - **优化策略**: - 将表的PCTFREE设置为0,以减少空闲空间,降低全表扫描时的CPU...

    Oracle数据库表空间的监控和维护.pdf

    MOVE`或`DBMS_SPACE.ADMIN.CONTAINER_COMPACT`等工具,可以优化表空间的利用率。 4. **备份和恢复策略**:为了防止数据丢失,必须定期备份表空间,并确保在需要时能快速恢复。Oracle提供多种备份方法,如RMAN...

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    解决方法是缩小表空间,使用 alter table XXXX move 语句可以释放表空间。 2. 索引的无效:当释放表空间后,表的行号 rowid 会发生变化,而基于 rowid 的索引则会变成无效。解决方法是重建索引,使用 alter index ...

    表空间(数据文件)迁移.docx

    4. 移动表到另一个表空间,使用 SQL 语句 `alter table scuser.table01 move;`。 Oracle 表空间数据文件迁移可以在线或离线进行,需要根据实际情况选择适合的方法。同时,需要注意在迁移过程中的数据一致性和完整性...

    oracle表空间和数据文件的详细操作(纯手工)

    ### Oracle表空间与数据文件的详细操作 #### 1. 创建表空间 在Oracle数据库中,表空间是逻辑存储单元,用于组织数据文件。创建表空间的基本语法如下: ```sql CREATE TABLESPACE <表空间名> DATAFILE '<数据文件...

    Oracle数据库中实现表空间的迁移方法.pdf

    在Oracle数据库中,表空间迁移是一项重要的管理任务,特别是在数据管理、性能优化或系统扩展时。Oracle数据库提供了多种方法来实现在同平台或跨平台之间的表空间迁移。本文主要介绍了利用Oracle的数据导出工具Export...

    Oracle数据库整理表碎片

    - 不需要额外的空闲空间,而ALTER TABLE MOVE通常需要与当前表一样大小的空闲空间。 总之,合理地整理表碎片不仅可以提高数据库的整体性能,还能有效减少资源浪费。在实践中,根据具体情况选择合适的整理方法尤为...

Global site tag (gtag.js) - Google Analytics