我运行oracle 11g
并需要将table (tbl1)
从一个tablespace (tblspc1)
移到另一个(tblspc2)
。最简单的方法是什么?
答案 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了解详情。