IMP数据到指定的表空间

一直以来,我都认为只要指定用户的默认表空间,向该用户导入数据时,会自动进入到默认表空间。后来发现从System导出的dmp文件在导入时,即使指定新用户的默认表空间,还是要往System表空间中导数据。

上网搜了一下,还是有解决方法的,常见的方法如下:

SQL> create user myhuang identified by myhuang default tablespace myhuang;

SQL> grant resource,connect to myhuang;

SQL> grant dba to myhuang;//赋DBA权限

SQL> revoke unlimited tablespace from myhuang;//撤销此权限

SQL> alter user myhuang quota 0 on system;//将用户在System表空间的配额置为0

SQL> alter user myhuang quota unlimited on myhuang;//设置在用户在myhuang表空间配额不受限。

 

经过上述设置后,就可以用imp导入数据,数据将会进入指定的myhuang表空间:

C:/Documents and Settings/myhuang>imp system/123456@vdb fromuser=lnxh tous

er=myhuang file=G:/myhuang/lnxh.dmp ignore=y grants=n

 

顺便说两个小问题:

(1)IMP-00003: 遇到 ORACLE 错误 1658

ORA-01658: 无法为表空间 MYHUANG 中的段创建 INITIAL 区

通常这个问题可以通过Resize增加表空间数据文件大小来解决。

 

(2)删除表空间

SQL> drop tablespace myhuang including contents and datafiles;

在10g中实验,drop表空间之后,仍然需要手动去删除数据文件。

 
//2008-08-24补充————————————————————————
另一种比较好的方法:

Create tablespace {tbs_name} datafile ‘{file_path}’ size 500M autoextend on next 10M;

Create user {u_name} identified by {u_pwd} default tablespace {tbs_name} quota unlimited on {tbs_name};

Grant connect,imp_full_database to {u_name};

Imp {u_name}/{u_pwd}@{local_svrname} fromuser={from_user} touser={u_name} file={dmp_file_path} ignore=y tablespaces={tbs_name};

此方法不需要授予新用户DBA权限。
此方法的存在的问题是:可能导致包含BLOB、CLOB字段的表导入失败,这种情况下可以先用sql脚本将表结构建立起来,再导入相应的数据

试验了一下把一个用户rman(默认表空间为tbs_rman)的表导出来,再导入到另外一个用户seagull(默认表空间为 tbs_seagull)下,但是导完之后,发现表所在的表空间不是seagull的默认表空间,而是原来的tbs_rman表空间,后来发现是因为 seagull具有unlimited tablespace的系统权限,经过收回seagull的这个权限,试验才成功,步骤如下:
 
1.创建用户
SQL> drop user seagull cascade;
User dropped.
SQL> create user seagull identified by tbs_seagull default tablspace tbs_seagull;
SQL> grant resource,connect to seagull;
Grant succeeded.
SQL> grant dba to seagull;
Grant succeeded.
SQL> revoke unlimited tablespace from seagull;
Revoke succeeded.
SQL> alter user seagull quota 0 on tbs_rman;
User altered.
SQL> alter user seagull quota unlimited on tbs_seagull;
User altered.
 
2.导入数据
[oracle10@seagull dmp]$ imp system/oracle fromuser=rman touser=seagull file=exp_rman.dmp
 
3.经过查证,此时从rman导出的数据(原表空间是tbs_rman),导入到了seagull用户中,并且导入的表属于tbs_rman了

exp/imp命令没有data pump的remap_tablespace参数,因此在进行exp/imp作objects迁移时,就会碰到表空间转换的问题了。下面就关于段存储表空间的不同情况分别说明:

一,目标库存在源库迁移段所在的表空间,且有空闲空间。
      这种情况是最理想的情况了,无须作任何处理。

二,目标库存在源库迁移段所在的表空间,且有空闲空间,但由于某种原因,需变更表空间。
      1,revoke导入用户unlimit tablespace权限
       2,设置导入用户在原有表空间上的配额为0(alter user imp_user quota 0 on tablespace_name);
      3,设置导入用户的默认表空间为需变更到的表空间名称
   注:在进行导入时,如果不存在段上所属表空间名称,则会自动变更存储在默认表空间,(分区表段除外)

三,目标库不存在源库迁移段所在表空间
       这种情况又分两种情况:
       1,段为非分区段,此时,会自动变更存储在导入用户默认表空间,不会报错。
       2,段为分区段,此时,导入时报不存在表空间的错误,需新建此表空间后,再重新导入。 


  http://blog.csdn.net/shashawang/article/details/4059807

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值