在例行巡检的时候发现,某个库的服务器的/HOME目录已经99%了,虽然是在虚拟机上,但是由于刚开始规划的时候,数据文件都放在/home/oracle下,导致现在无法扩展home目录了,必须得做数据的迁移。
由于/data目录还是可以扩展的,那么迁移的思路就是:
1、在/data目录下新建表空间
2、表从旧表空间迁移至新表空间
3、索引在新表空间上重建
4、LOB索引重建
5、旧表空间缩小
6、旧表空间offline
7、观察一段时间后,删除旧表空间
思路清晰后,开始写脚本
-----------
--创建新表空间
create tablespace x_NEW datafile '/data/oradata/x_NEW01.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW02.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW03.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW04.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW05.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW06.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW07.dbf' size 30g;
alter tablespace x_NEW add datafile '/data/oradata/x_NEW08.dbf' size 30g;
--给用户使用该表空间权限
grant unlimited tablespace to xuser;
ALTER USER xuser DEFAULT TABLESPACE x_NEW;
--找出该表空间上的表有哪些,并同时生成脚本
select 'alter table xuser.'||table_name || ' move tablespace x_NEW;' from dba_all_tables where tablespace_name='x';
--重建索引到新表空间
SELECT 'alter index xuser.'|| index_name || ' rebuild tablespace x_NEW;' FROM dba_indexes WHERE table_owner = 'xuser' AND dropped = 'NO';
--LOB字段无法重建索引,必须用以下脚本
ALTER TABLE x.Y MOVE LOB(字段名) STORE AS (TABLESPACE x_NEW);
ALTER TABLE x.z MOVE LOB(字段名) STORE AS (TABLESPACE x_NEW);
--执行上述创建的脚本
--查看旧表空间上还有哪些对象
SELECT TABLESPACE_NAME AS TABLESPACE_NAME
, SEGMENT_NAME AS SEGMENT_NAME
, SUM(BYTES)/1024/1024 AS SEGMENT_SIZE
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME='x'
GROUP BY TABLESPACE_NAME,SEGMENT_NAME
ORDER BY 3
--命令行下执行清空回收站。
purge DBA_RECYCLEBIN;
--缩小表空间大小
alter database datafile 'xxxxxx.dbf' resize 500M;
--旧表空间下线
alter tablespace x ONline;
--删除旧表空间
drop tablespace x including contents and datafiles;