如果你的表空间里有多个大字段的表,那么建议你最好使用Oracle最新的数据泵技术expep/impep,这个技术能很好的支持大数据字段(clob/blob)。
那么如果你习惯使用imp/exp这种比较古老但是你顺手的技术呢。这时依如下步骤即可解决。
首先,使用我之前的文章导入除大数据外的其他所有表。参考:http://blog.csdn.net/kai27ks/article/details/7356269 中A异名同数据的方法。
之后我们就要对单独的顽固分子进行操作了。
imp "'/ as sysdba'" indexes=y file=/exp_swserp.dmp fromuser=swserp touser=swserpreal log=/oracle_recovers/mylog.log tables=Trpreportdatasource
其中tables指向的就是你的大字段的表。如果有多个用,分割即可。 这个时候你如果之前是按我那种方式做很有可能报这个错误:
IMP-00003: oracle error 1536 encountered
ORA-01536: space quota exceeded for tablespace 'SWSERP'
take it easy! 把新用户在原表空间的quota设大。懒人做法: alter user new quota unlimited on old.
再重来一次: imp "'/ as sysdba'" indexes=y file=/exp_swserp.dmp fromuser=swserp touser=swserpreal log=/oracle_recovers/mylog.log tables=Trpreportdatasource
Import terminated successfully without warnings.
解决!
PS:
看了这篇文章的读友们,原谅我当初的无知吧~ 如果有大字段的表,默认是在原表空间内存储的。这个时候你导过去,如果没有和源表空间同名的表空间如上文的swserp,是会报错:找不到swserp表空间的。如果有的话,它会把这些数据放在源表空间--swserp里。而不是你新的表空间。这是由于大字段数据的特性决定的--表空间依赖。怎么办呢?你可以用重组去弥补这一步的错误:参加另一篇文章:重组表空间http://blog.csdn.net/kai27ks/article/details/7527943 即可解决问题。
有人会问:有木有根本解决的方法啊亲?有的,下面就来告诉你。其实下面的方式是很多年前就有人用了,我只不过多告诉了你为什么而已。
情况A:你有当初创建这个大字段表和主键索引等的语句,那问题就简单多了。
1.首先在新的表空间创建好表和主键索引等。
2.使用imp 加上imp userName/password@localhost:1521/orcl log=E:\impLog.2log(日志输出文件) file=e:\XXX.dump(之前那份数据库导出文件即可) touser=newUserName fromuser=oldUserName indexes=n ignore=y
备注:indexes=n 表示不导入索引 ignore=y 表示忽略报错(表已存在)
3.检查--数据应该已经过去了
情况B: 没有建表语句或者已经丢了---这其实很正常
1. imp 使用indexfile参数 imp userName/password@localhost:1521/orcl file=e:\XXX.dump(之前那份数据库导出文件即可) indexfile=e:\XX.sql tables=tableName(包含clob/blob大字段的表表名)
备注: 这一步实际上没有导入数据,而是将那个表的建表和索引语句导出到xxx.sql中
2. 使用那些语句建表和索引,注意先后顺序 先表,再索引。
3. 其余部分同情况A.2
4. 当然 你也可以使用其他工具导出建表和索引语句,原理一样的。
来源:http://blog.csdn.net/kai27ks/article/details/7410699