如果你的表空間里有多個大字段的表,那么建議你最好使用Oracle最新的數據泵技術expep/impep,這個技術能很好的支持大數據字段(clob/blob)。
那么如果你習慣使用imp/exp這種比較古老但是你順手的技術呢。這時依如下步驟即可解決。
之后我們就要對單獨的頑固分子進行操作了。
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
528

被折叠的 条评论
为什么被折叠?



