有个客户的数据库,Oracle搭建好后,并没有创建独立的表空间,导致生产用户的所有表都放在了users表空间下。
随着数据表的增多和数据的增多,users表空间暴涨到476G,数据库性能越来越差,需要对数据库的表空间进行整顿。
普通表的表空间迁移 【索引要重建】
ALTER TABLE E9.MEETINGSEATCARDMOULD MOVE tablespace ecology;
select 'alter index '||OWNER||'.'||INDEX_NAME||' rebuild online;' from dba_indexes where status<>'VALID' and partitionED<>'YES';
构建的index 迁移SQL 如下
ALTER index E9.sdsds_001 rebuild tablespace ecology;
检查索引是否失效;
select OWNER,INDEX_NAME from dba_indexes where status<>'VALID' and partitionED<>'YES';
如果表中含有lob字段,这些字段并不会跟着迁移,【有lob,long存储所在的dbf文件不能收缩】
select 'alter table '||a.owner||'.'||a.table_name||' move lob('||a.COLUMN_NAME||') store as (tablespace ecology);'
from dba_lobs a,DBA_SEGMENTS b where a.owner in ('E9')
and a.OWNER=b.OWNER and a.SEGMENT_NAME=b.SEGMENT_NAME AND B.segment_type='LOBSEGMENT' and b.tablespace_name='USERS';
得到的迁移SQL如下:
alter table E9.PRJ_TEMPLATE move lob(FWBTY) store as (tablespace ecology);
PS: lob上带有的lob索引一会一起迁移.
如果表中含有long字段的,
不能直接move,采用 expdb和impdp的方式, REMAP_TABLESPACE 恢复
如下所示:
expdp e9/ecology dumpfile=tab20210205_2.dmp directory=DATA_DIR tables=OFPRIVATE,OFOFFLINE;
impdp e9/ecology dumpfile=tab20210205_2.dmp directory=DATA_DIR REMAP_TABLESPACE=USERS:ECOLOGY;
最后收缩表空间大小【这时候users表空间只用了80多M,索性所有的dbf文件都缩小到16m都搓搓有余】,
SQL如下:
.....
alter database datafile '/u01/app/oracle/oradata/ecology/users03.dbf' RESIZE 16M;
alter database datafile '/u01/app/oracle/oradata/ecology/users04.dbf' RESIZE 16M;
......