38

我跑步oracle 11g,需要table (tbl1)从一个移动tablespace (tblspc1)到另一个(tblspc2)。最简单的方法是什么?

4

5 回答 5

67

尝试这个:-

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

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

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

alter index <owner>."<index_name>" rebuild;
于 2013-08-20T05:39:49.087 回答
11

使用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;
于 2013-11-23T14:22:58.317 回答
8

搬桌:

第一次运行:

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 移动表空间用户;

将结果粘贴到脚本或类似应用程序的 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 移动 LOB(日历)存储为(表空间用户);

将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。

O 还有一件事:

由于某种原因,我无法移动“DOMAIN”类型的索引。作为一种解决方法,我删除了索引。将用户的默认表空间更改为所需的表空间。然后重新创建索引。可能有更好的方法,但它对我有用。

于 2015-12-22T13:08:05.737 回答
2

试试这个把你的表(tbl1)移动到表空间(tblspc2)。

alter table tb11 move tablespace tblspc2;
于 2013-08-20T06:47:49.847 回答
-1

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

下面是命令:

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

您可以查看此链接了解详细信息。

于 2018-07-07T14:56:43.340 回答