表空间迁移

问题提出:

单位最近上了一套新系统,在部署数据库时,为此项目创建了数据库用户USER1,默认表空间TS_USER1,由于他们的数据库没有部署的脚本,而是通过导入的方式进行的。

imp user1/password file=expfile.dmp

结果部署完之后,所有的对象(表、索引、存储过程、大对象)被导入了三个表空间TS_USER1、USERS、AAA,其中TS_USER1是我为此用户创建的表空间,USERS是数据库默认创建的表空间,AAA在导入的时候自动创建的表空间。这与我的预期不符合,而且数据分散不便于管理。为了能够将所有的对象都存放到我指定的表空间下,我进行了如下实验。

解决方案:

1、用expdp导出USER1用户下的所有对象到文件expdata.dmp.

SQL>CONN  / AS SYSDBA

SQL>CREATE DIRECTORY EXPDIR AS '/HOME/ORACLE/EXPDATA';

SQL>GRANT EXPORT FULL DATABASE TO USER1;

$EXPDP  USER1/PASSWORD DIRECTORY=EXPDIR  DUMPFILE='EXP090701.DMP' LOGFILE='EXP090701.LOG' PARALLEL=3;

2、创建一个新的用户USER2及新的表空间TS_USER2。

SQL>CONN / AS SYSDBA

SQL>CREATE TABLESPACE TS_USER2 DATAFILE '/ORADATA/USER2.DBF' SIZE 800M;

SQL>CREATE USER USER2 IDENTIFIED BY PASSWORD DEFAULT TABLESPACE TS_USER2;

SQL> ALTER USER USER2 QUOTA UNLIMITED  ON TS_USER2;

SQL>GRANT CONNECT,RESOURCE,IMPORT  FULL DATABASE TO USER2;

3、使用impdp导入到指定的用户USER2和表空间TS_USER2下。

$IMPDP USER2/PASSWORD DIRECTORY=EXPDIR DUMPFILE='EXP090701.DMP'  LOGFILE='IMP090701.LOG' REMAP_SCHEMA=USER1:USER2 REMAP_TABLESPACE=TS_USER1:TS_USER2 REMAP_TABLESPACE=USERS:TS_USER2 REMAP_TABLESPACE=AAA:TS_USER2 PARALLEL=3;

4、检查是否USER2下的所有对象都存放到了表空间TS_USER2下。

SQL>SELECT OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME FROM DBA_SEGMENTS WHERE WNER='USER2';

请使用浏览器的分享功能分享到微信等