我跑步oracle 11g
,需要table (tbl1)
从一个移动tablespace (tblspc1)
到另一个(tblspc2)
。最简单的方法是什么?
5 回答
尝试这个:-
ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
IVAN在评论中提出了非常好的建议,所以想在我的回答中添加
注意:这将使所有表的索引无效。所以这个命令通常跟在
alter index <owner>."<index_name>" rebuild;
使用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;
搬桌:
第一次运行:
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”类型的索引。作为一种解决方法,我删除了索引。将用户的默认表空间更改为所需的表空间。然后重新创建索引。可能有更好的方法,但它对我有用。
试试这个把你的表(tbl1)移动到表空间(tblspc2)。
alter table tb11 move tablespace tblspc2;