背景 使用Exp命令在oracle 11g 以後不導出空表(rowcount=0),是最近在工作中遇到一個很坑的問題,甚至已經被坑了不止一次,所以這次痛定思痛,準備把這個問題徹底解決。之所以叫新方法,那一定有老方法了,這個方法是一位博友很早就提出了,以下是原文,其實也說明瞭問題的原因 Oracle1 ...
背景
使用Exp命令在oracle 11g 以後不導出空表(rowcount=0),是最近在工作中遇到一個很坑的問題,甚至已經被坑了不止一次,所以這次痛定思痛,準備把這個問題徹底解決。之所以叫新方法,那一定有老方法了,這個方法是一位博友很早就提出了,以下是原文,其實也說明瞭問題的原因
問題根本原因:“Oracle11g預設對空表不分配segment,故使用exp導出Oracle11g資料庫時,空表不會導出”
問題次要原因: 在開發維護期往往需要頻繁的做資料庫的導入導出操作,使用老方法確實可以解決問題,但是某一次忘記就徹底悲劇
問題擴展:本人發現有時候一些Type,管道類型也無法導出,造成過程,函數編譯不通過
解決方案
解決方案其實很簡單,就是用expdp,impdp命令代替exp,imp命令徹底解決這個問題,實驗如下:
1、建立空表
-- Create table
create table TestEmpty
(
id number,
name number
)
tablespace XXXTEMP
storage
(
initial 1M
next 1M
minextents 1
pctincrease 0
);
2、exp導出語句
exp system/a@orcl225 File=x.dmp owner=someuser
3、被坑截圖
4、解決方法,使用expdp進行導出
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;
(關於expdp,impdp的用法請自行baidu或者參考文章下部提供的外鏈)
happy 過程如下圖
至此問題已經徹底解決
意外收穫
1、提升導出導入速度,在使用expdp和impdp進行Oracle資料庫的導入導出,還會給你帶來一些意外收穫,如導出速度有明顯的提升,而且輸出的日誌也更加準確美觀,其實用普通的exp做50w行記錄導出表是簡直就是個弱暴了工具(從速度上和Sql server差了不知道幾條街)
2、可以進行表空間導出(exp其實也可以)
復出的代價
看起來很美好,但是expdp,impdp其實也是有限制的,就是必須在伺服器上進行IO操作(具體就是DIRECTORY這參數有關,這裡不在詳細解釋了,自己看教程去)
有價值的鏈接
【傳輸表空間】使用 EXPDP/IMPDP工具的傳輸表空間完成數據遷移
寫在最後
寫的不好,不喜歡的可以打賞繼續鼓勵,喜歡的可以點推薦給予支持且隨便打賞,開個玩笑,分享出來只是希望我的一點經驗是有用的,避免諸位入坑。