文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。sql
在10g以前,傳統的導出和導入分別使用EXP工具和IMP工具,從10g開始,不只保留了原有的EXP和IMP工具,還提供了數據泵導出導入工具EXPDP和IMPDP。因此在11G的倒庫和入庫方式中,咱們也有兩種方式能夠選擇:傳統模式和數據泵模式。數據庫
傳統模式又分爲:常規導入導出和直接導入導出。服務器
下面以導出數據爲例,分別介紹各自導出原理。session
傳統路徑模式使用SQL SELECT語句抽取表數據。數據從磁盤讀入到buffer cache緩衝區中,行被轉移到評估緩衝區。在此以後根據SQL表達式,將記錄返回給導出客戶端,而後寫入到dump文件。app
常規導出的例子:exp zhejiang/zhejiang file=/data1/zj_regular.dmp buffer=20480000工具
直接導出模式,數據直接從磁盤中讀取到導出session的PGA中,行被直接轉移到導出session的私有緩衝區,從而跳過SQL命令處理層。 避免了沒必要要的數據轉換。最後記錄返回給導出客戶端,寫到dump文件。測試
直接導出的例子:exp zhejiang/zhejiang file=/data1/zj_direct.dmp buffer=20480000 recordlength=65535 direct=y。spa
數據泵方式是EXP方式的增強版,其原理相似,可是它的導出要借鑑服務器端的數據庫目錄。server
EXP和IMP是客戶段工具程序,它們既能夠在客戶端使用,也能夠在服務器段使用。blog
而EXPDP和IMPDP是服務端的工具程序,它們只能在ORACLE服務端使用,不能在客戶端使用。
數據泵導出數據的時間更短,並且導出的數據文件大小更小。
如下表格爲我將網友的一個測試進行的統計:
類型 |
例子(導出40G左右的數據) |
傳統模式(直接導出) |
18分鐘 |
數據泵模式 |
14分鐘,且導出的文件比傳統模式小1.5G |
IMP只適用於EXP導出文件,不適用於EXPDP導出文件;IMPDP只適用於EXPDP導出文件,而不適用於EXP導出文件。
由上面對比可見,在實際操做中,咱們在服務器端選擇數據泵方式導入數據會更快一些。下面我主要介紹數據泵方式的導入和導出。
建立邏輯目錄「EXPDP_DIR」並將其映射到物理路徑「D:\DBbak」下,在PL/SQL下面執行語句:Create or replace directory expdp_dir as 'D:\DBbak';
執行完後,要在對應的硬盤目錄下建立該文件夾。
能夠經過SQL查詢是否成功建立邏輯目錄,Select * from dba_directories,能夠看到以下結果:
最後,再給建立的目錄賦予權限:
Grant read,write on directory EXPDP_DIR to Public;
創建expdp.bat文件,文件內容爲:Expdp sccot/tiger@testDB directory=expdp_dir dumpfile =STDCG _201501.dmp logfile= STDCG _201501.log;執行該bat;
由於是導出全部數據,因此沒有設置tables| schemas| tablespaces。
導出成功後,導出的數據會自動放在以前設置的Expdp_Dir文件夾下。
a.建立數據庫stdcg,包含SYS和SYSTEM兩個用戶
b.用SYS登錄PL/SQL->File->Open->SQL script執行建立表空間sql腳本。須要注意的就是修改腳本中的路徑:
DATAFILE 'F:\app\DELL\oradata\stdcg\DLGIS.DBF'(紅色部分是本地數據庫的路徑)
c.執行建立用戶腳本:包含dlsys、dlmis、dlinit、dlgis、sde、mms、umstat、ulog用戶。
如2.2中所描述的,這裏直接給出語句:
Create or replace directory expdp_dir as 'd:\DBbak';
Grant read,write on directory expdp_dir to public;
不過多出了這樣一個步驟:在D盤創建文件夾DBbak 後,須要將數據庫的導出文件:STDCG _201501.DMP和STDCG _201501.log 一塊兒拷貝到D:\DBbak目錄下。
創建impdp.bat文件,文件中的內容爲: impdp dlsys/dlsys@stdcg dumpfile= STDCG _201501.dmp logfile= STDCG _201501_EXP.log。運行該bat文件。
一樣,由於是全庫導入,因此沒有使用tables| schemas| tablespaces來進行導入內容設置。
首先要作與通常數據泵導出時相同的操做,即建立邏輯目錄: Create or replace directory expdp_dir as 'D:\DBbak';
而後再導出數據時,sql命令上要加上一個version控制便可:
expdp sccot/tiger@testDB dumpfile=stdcg10g.dmp directory= expdp_dir version=10.0.2。
導出後,再將導出的dmp文件導入到10g的庫中便可。
目前在江北項目和煙臺項目中均作了以下操做:shp數據首先經過SDE導入到了11g的數據庫中,因爲現場數據庫忽然須要降級,而後將11g的數據又從新導入導出到10g中。可是,兩個現場都不分別出現了不一樣的問題。
江北現場的問題是,在catalog裏可以直連到10g上Oracle,也能看到各空間數據。可是,在arcmap中添加該數據庫中的空間數據,圖層渲染時會出現SDE內部錯誤,致使圖層沒法顯示。
而煙臺現場,則直接出現了直連數據庫不定時失效問題:
測試能夠鏈接:
點OK後又不能鏈接:
將空間數據所在的DLGIS和SDE用戶刪除,從新經過SQL生成這兩個用戶以及先關表結構後。手動經過catalog直連到數據庫上,而後手動導入圖層,解決上述問題。
猜測爲11g數據轉成10g數據時可能某些空間信息表被改變或者破壞,再也不符合arcgis10.0的鏈接規範等。形成了sde不穩定或者sde內部錯誤。