1.为什么出现这样的需求?
无论什么情况,现在我们一个用户的数据存在于多个表空间里,现在想把数据统一放在一个表空间里
2.如何统一数据表同一个表空间,并保证以后同一个用户的数据保存在一个表空间?
2.1索引迁移
命令:ALTER INDEX BMI_ACCOUNTS REBUILD TABLESPACE DEMO;
生成用户中对所有索引迁移的命令:
SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD TABLESPACE DEMO;' FROM USER_INDEXES WHERE TABLESPACE_NAME='EXAMPLE';
2.2表迁移
命令:ALTER TABLE ACCOUNTS MOVE TABLESPACE DEMO
生成用户中对所有表迁移的命令:
SELECT 'ALTER TABLE '||TABLE_NAME||' MOVE TABLESPACE DEMO;' FROM USER_TABLES WHERE TABLESPACE_NAME='EXAMPLE';
连同LOB字段一起迁移命令:
ALTER TABLE test MOVE TABLESPACE test LOB (DATAPOLLIOR) STORE AS (TABLESPACE test);
3.索引移动后可能出现索引无效的情况,这时需要重新建立索引
-- 请以 DBA 权限登录,并执行
-- 将所有 UNUSABLE 状态的 index 修复, rebuild 一下即可
declare
-- 指向所有 UNUSABLE 状态的 index 的游标
cursor c is
select index_name, owner
from dba_indexes
where status='UNUSABLE';
owner dba_indexes.owner%type;
index_name dba_indexes.index_name%type;
begin
open c;
loop
fetch c into index_name, owner;
exit when c%notfound;
execute immediate 'alter index ' || owner || '.' || index_name || ' rebuild';
end loop;
close c;
end;