瞭解了EXPDP的使用後,然後過了一陣子,開始對大量匯出進行運用,結果發現了一系列的問題。
首先建立好邏輯目錄和作業系統對應的物理目錄後,開始執行下面的匯出語句
expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup SCHEMAS=username;
然後遇到如下的錯誤碼,提示說找不到對應的模式:
ORA-39001: 參數值無效
ORA-39170: 方案運算式 'res8000;' 與任何方案均不對應。
圖1找不到相應的模式
為了這個我還專門去學習了一下schema的相關概念,然後發現說的最多的就是schemas當預設的時候一般與使用者名稱是相同的,我就很不理解了。
為什麼預設是一樣的但是卻提示找不到該模式呢?
於是採用了退一步的策略,由於在expdp匯出的時候,預設的是目前使用者的schema,所以就想,反正我要匯出的也是這個使用者下的所有對象集合,不寫schema也罷。
然後就把語句改為如下的方式進行執行:
expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup;
卻提示告訴我說,找不到oradpbackup這個邏輯目錄。
報如下的錯誤:
圖2找不到邏輯目錄
ORA-39002:操作無效
ORA-39070:無法開啟記錄檔。
ORA-39087:目錄名ORADPBACKUP;無效
-------------------------------------------------------------------------------------------------------------------------------------
但是我直接輸入expdp,然後按照提示一步一步的往下來,卻發現又是可以正常大量匯出的。為什麼使用語句就不可以呢?
-------------------------------------------------------------------------------------------------------------------------------------
我就鬱悶了,以前沒有遇到這種問題啊。然後直接就度娘去了,研究了一天的expdp也沒有發現問題。
後來偶然看到有人說了這麼一句話。
執行匯出語句的時候不能加入分號";"做結尾,額,當時的心情,無語加崩潰。
使用expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup執行了一下,果然可以了。
圖3 去掉分號後,匯出語句可以正常執行
圖4加入schema後依然可以正常匯出
然後仔細回過頭來看oracle給的錯誤提示,說的也是找不到“oradpbackup;”這個目錄,所以,看起來應該是oracle把分號也當做是目錄名稱中的一個字元了。
為了驗證這一點,我重新更改作業系統目錄名稱為ORADPBACKUP;
同時使用create or replace directory "ORADPBACKUP;" as 'e:\ORADPBACKUP;‘;重新建立一個帶分號的邏輯目錄
再次使用如下語句:
expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup;
不過出現了一個內部錯誤,最終沒有執行成功。
雖然沒有成功無法驗證,不過預想原因應該還是oracle把分號當做邏輯目錄的名稱了。
---------------------------------------------------------------------------------------------------------------------------
於是對於兩個問題都有了合理的解釋了。
對於問題一:
expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup SCHEMAS=username;
找不到schema的原因是oracle把“username;”整個當做了模式名稱,所以肯定無法找到。
而對於第二個問題:
expdp username/psw dumpfile=bigdata.dmp logfile=explog.log directory=oradpbackup;
找不到目錄的原因同樣為oracle把“oradpbackup;”整個當做了邏輯目錄名稱,也自然無法找到了。