移动桌子:
第一次运行:
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”类型索引。作为一种解决方法,我删除了索引。将用户的默认表空间更改为所需的表空间。然后重新创建索引。
可能有更好的方法,但它对我有用。