如何在oracle 11g中将表从一个表空间移动到另一个表空间

时间:2013-08-20 05:38:09

标签: oracle oracle11g move

我运行oracle 11g并需要将table (tbl1)从一个tablespace (tblspc1)移到另一个(tblspc2)。最简单的方法是什么?

5 个答案:

答案 0 :(得分:50)

试试这个: -

ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>

IVAN在评论中提出的非常好的建议,以便在我的回答中添加

注意:这将使所有表的索引无效。所以这个命令通常后跟

alter index <owner>."<index_name>" rebuild;

答案 1 :(得分:10)

使用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;

答案 2 :(得分:7)

移动表格:

首先运行:

SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';

- 或在评论中建议(我自己没有测试)

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移动TABLESPACE用户;

将结果粘贴到脚本或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开发人员(如应用程序)中并运行它。

O还有一件事:

出于某种原因,我无法移动“DOMAIN”类型索引。作为一种解决方法,我放弃了索引。将用户的默认表空间更改为de desired tablespace。然后再次重新创建索引。 有一个更好的方法,但它对我有用。

答案 3 :(得分:2)

尝试将表(tbl1)移动到表空间(tblspc2)。

alter table tb11 move tablespace tblspc2;

答案 4 :(得分:-1)

我尝试了许多脚本,但是它们不适用于所有对象。您无法将群集对象从一个tablespace移动到另一个。为此,您将不得不使用expdp,所以我建议expdp是将所有对象移动到不同表空间的最佳选择。

下面是命令:

nohup expdp \"/ as sysdba\" DIRECTORY=test_dir DUMPFILE=users.dmp LOGFILE=users.log TABLESPACES=USERS &

您可以查看this link了解详情。