oracle 11g 如何将表从一个表空间移动到另一个表空间
Posted
技术标签:
【中文标题】oracle 11g 如何将表从一个表空间移动到另一个表空间【英文标题】:How to move table from one tablespace to another in oracle 11g 【发布时间】:2013-08-22 01:38:50 【问题描述】:我运行oracle 11g
,需要将table (tbl1)
从一个tablespace (tblspc1)
移动到另一个(tblspc2)
。最简单的方法是什么?
【问题讨论】:
您至少可以发布您迄今为止尝试过的内容吗? 如果你想移动分区表,我几年前写过我如何将表从一个表空间移动到另一个表空间:move partitioned tables。 【参考方案1】:试试这个:-
ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
来自 cmets 中 IVAN 的非常好的建议,所以想在我的回答中添加
注意:这将使所有表的索引无效。所以这个命令后面通常跟
alter index <owner>."<index_name>" rebuild;
【讨论】:
From the documentation;和more here 注意:这将使所有表的索引无效。所以这个命令后面通常跟“alter indexSELECT Segment_Name, Segment_Type, Tablespace_Name, Bytes, Blocks, Extents, q'[ALTER ]' || Segment_Type || q'[ ]' || USER || q'[.]' || Segment_Name || CASE WHEN Segment_Type = 'INDEX' THEN q'[ REBUILD ]' ELSE q'[ MOVE ]' END || q'[ TABLESPACE ]' || q'[TABLESPACE_NAME_GOES_HERE]' || q'[;]' FROM Dba_Segments WHERE Owner = USER AND Tablespace_Name <> 'TABLESPACE_NAME_GOES_HERE' ORDER BY Segment_Name;
@Allen 您的评论应该是一个单独的答案。但是,如果有 LOB 列,则需要使用 ALTER TABLE TABLE_NAME MOVE LOB(COLUMN_NAME) STORE AS (TABLESPACE DEST_TABLESPACE)
将它们排除并单独移动【参考方案2】:
试试这个把你的表 (tbl1) 移动到表空间 (tblspc2)。
alter table tb11 move tablespace tblspc2;
【讨论】:
【参考方案3】:使用来自sql
的sql
:
将其输出到文件:
select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
spoolfile 会有这样的东西:
alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
【讨论】:
您必须在 index_name 周围使用“...”,否则您将收到错误“ORA-01418:指定的索引不存在”。所以命令应该是:select 'alter index '||owner||'."'||index_name||'" rebuild tablespace TO_TABLESPACE_NAME;'从 all_indexes where owner='OWNERNAME'; @Jan:仅当索引名称包含小写字母时才正确。如果遵循良好做法,即所有索引仅使用大写字母命名,则无需引用名称。【参考方案4】:移动桌子:
第一次运行:
SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';
--或者在cmets中建议(自己没有测试过)
SELECT 'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE '||' TABLESPACE_NAME>; '
FROM dba_tables
WHERE OWNER = '<SCHEMA>'
AND TABLESPACE_NAME <> '<TABLESPACE_NAME>
其中<schema_name>
是用户名。
<tablespace_name>
是目标表空间。
因此,您会得到如下行:
ALTER TABLE SCOT.PARTS 移动表空间用户;
将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。
移动索引:
第一次运行:
SELECT 'ALTER INDEX <schema_name>.'||INDEX_NAME||' REBUILD TABLESPACE <tablespace_name>;'
FROM ALL_INDEXES
WHERE OWNER = '<schema_name>'
AND TABLESPACE_NAME NOT LIKE '<tablespace_name>';
此代码中的最后一行可以为您节省大量时间,因为它过滤掉了已经在正确表空间中的索引。
因此你应该得到类似的东西:
ALTER INDEX SCOT.PARTS_NO_PK REBUILD TABLESPACE 用户;
将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。
最后但同样重要的是,移动 LOB:
第一次运行:
SELECT 'ALTER TABLE <schema_name>.'||LOWER(TABLE_NAME)||' MOVE LOB('||LOWER(COLUMN_NAME)||') STORE AS (TABLESPACE <table_space>);'
FROM DBA_TAB_COLS
WHERE OWNER = '<schema_name>' AND DATA_TYPE like '%LOB%';
这会将 LOB 对象移动到另一个表空间。
因此你应该得到类似的东西:
ALTER TABLE SCOT.bin$6t926o3phqjgqkjabaetqg==$0 MOVE LOB(calendar) STORE AS (TABLESPACE USERS);
将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。
还有一件事:
由于某种原因,我无法移动“DOMAIN”类型索引。作为一种解决方法,我删除了索引。将用户的默认表空间更改为所需的表空间。然后重新创建索引。 可能有更好的方法,但它对我有用。
【讨论】:
选择'ALTER TABLE我尝试了许多脚本,但它们并不适用于所有对象。您不能将群集对象从一个 tablespace 移动到另一个。为此,您必须使用 expdp,因此我建议 expdp 是将所有对象移动到不同表空间的最佳选择。
下面是命令:
nohup expdp \"/ as sysdba\" DIRECTORY=test_dir DUMPFILE=users.dmp LOGFILE=users.log TABLESPACES=USERS &
详情可以查看this link。
【讨论】:
如果不是 Oracle 支持人员告诉您,您不应该使用 sysdba 进行导出。 导出不够。您也必须删除和导入对象。以上是关于oracle 11g 如何将表从一个表空间移动到另一个表空间的主要内容,如果未能解决你的问题,请参考以下文章