文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.前言
在10g之前,傳統的導出和導入分別使用EXP工具和IMP工具,從10g開始,不僅保留了原有的EXP和IMP工具,還提供了數據泵導出導入工具EXPDP和IMPDP。所以在11G的倒庫和入庫方式中,我們也有兩種方式可以選擇:傳統模式和數據泵模式。
傳統模式又分為:常規導入導出和直接導入導出。
下面以導出數據為例,分別介紹各自導出原理。
1.1簡述各導入導出方式的原理
1.1.1常規導出原理
傳統路徑模式使用SQL SELECT語句抽取表數據。數據從磁盤讀入到buffer cache緩沖區中,行被轉移到評估緩沖區。在此之后根據SQL表達式,將記錄返回給導出客戶端,然后寫入到dump文件。
常規導出的例子:exp zhejiang/zhejiang file=/data1/zj_regular.dmp buffer=20480000
1.1.2直接導出
直接導出模式,數據直接從磁盤中讀取到導出session的PGA中,行被直接轉移到導出session的私有緩沖區,從而跳過SQL命令處理層。 避免了不必要的數據轉換。最后記錄返回給導出客戶端,寫到dump文件。
直接導出的例子:exp zhejiang/zhejiang file=/data1/zj_direct.dmp buffer=20480000 recordlength=65535 direct=y。
1.1.3數據泵導出
數據泵方式是EXP方式的加強版,其原理類似,但是它的導出要借鑒服務器端的數據庫目錄。
1.2傳統模式和數據泵模式的對比
1.2.1傳統模式的優點
EXP和IMP是客戶段工具程序,它們既可以在客戶端使用,也可以在服務器段使用。
而EXPDP和IMPDP是服務端的工具程序,它們只能在ORACLE服務端使用,不能在客戶端使用。
1.2.2數據泵模式的優點
數據泵導出數據的時間更短,而且導出的數據文件大小更小。
以下表格為我將網友的一個測試進行的統計:
| 類型 |
例子(導出40G左右的數據) |
| 傳統模式(直接導出) |
18分鍾 |
| 數據泵模式 |
14分鍾,且導出的文件比傳統模式小1.5G |
1.3 注意
IMP只適用於EXP導出文件,不適用於EXPDP導出文件;IMPDP只適用於EXPDP導出文件,而不適用於EXP導出文件。
1.4 小結
由上面對比可見,在實際操作中,我們在服務器端選擇數據泵方式導入數據會更快一些。下面我主要介紹數據泵方式的導入和導出。
2.數據泵導出數據的流程
2.1創建邏輯目錄並授權
創建邏輯目錄“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;
2.2執行導出操作
建立expdp.bat文件,文件內容為:Expdp sccot/tiger@testDB directory=expdp_dir dumpfile =STDCG _201501.dmp logfile= STDCG _201501.log;執行該bat;
因為是導出所有數據,所以沒有設置tables| schemas| tablespaces。
導出成功后,導出的數據會自動放在之前設置的Expdp_Dir文件夾下。
3.數據泵導入數據的流程
3.1 創建數據庫實例等基本操作
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用戶。
3.2創建邏輯目錄並授權
如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目錄下。
3.3執行導入操作
建立impdp.bat文件,文件中的內容為: impdp dlsys/dlsys@stdcg dumpfile= STDCG _201501.dmp logfile= STDCG _201501_EXP.log。運行該bat文件。
同樣,因為是全庫導入,所以沒有使用tables| schemas| tablespaces來進行導入內容設置。
4.11g數據導入10g的庫中
4.1 降版本導出然后導入
首先要做與一般數據泵導出時相同的操作,即創建邏輯目錄: 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的庫中即可。
4.2容易出現的問題
目前在江北項目和煙台項目中均做了如下操作:shp數據首先通過SDE導入到了11g的數據庫中,由於現場數據庫突然需要降級,然后將11g的數據又重新導入導出到10g中。但是,兩個現場都不分別出現了不同的問題。
江北現場的問題是,在catalog里能夠直連到10g上Oracle,也能看到各空間數據。但是,在arcmap中添加該數據庫中的空間數據,圖層渲染時會出現SDE內部錯誤,導致圖層無法顯示。
而煙台現場,則直接出現了直連數據庫不定時失效問題:
測試可以連接:

點OK后又不能連接:

4.3解決方法及分析
4.3.1解決方法
將空間數據所在的DLGIS和SDE用戶刪除,重新通過SQL生成這兩個用戶以及先關表結構后。手動通過catalog直連到數據庫上,然后手動導入圖層,解決上述問題。
4.3.2 問題分析
猜想為11g數據轉成10g數據時可能某些空間信息表被改變或者破壞,不再符合arcgis10.0的連接規范等。造成了sde不穩定或者sde內部錯誤。
