表迁移方案

在例行巡检的时候发现,某个库的服务器的/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;

你可能感兴趣的:(表迁移方案)