问题提出:
单位最近上了一套新系统,在部署数据库时,为此项目创建了数据库用户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';