Oracle數據庫現已是應用最為廣泛的數據庫,很多的應用是在Oracle數據庫上施行開發的,但是由於Oracle數據庫的更新速度的原因與很多不同的相關應用程序提供商,可能會造成在一個單位的應用中存在Oracle的幾種版本,
如Oracle 7、Oracle 8、Oracle 8i,甚至Oracle 9i.。
而考慮到數據庫集中、維護、備份的方便性和避免設備的重復投資,在應用能兼容的情況下,將幾個版本的Oracle數據庫移植到一個主流版本上是數據庫管理員的一個較優的選擇。
這就存在從Oracle數據庫的低版本移植到高版本和從Oracle數據庫的高版本移植到低版本的問題,甚至包括系統平台的遷移如從Windows NT系統遷移到Unix系統。利用Oracle導入/導出工具(Export/Import)能比較方便實現上述移植操作。
Oracle導入/導出工具(Export/Import)主要是用來對數據庫進行邏輯備份,利用Export導出數據庫的轉儲二進制文件作為數據庫Import輸入從而達到移植的目的。
有二個規則可以參考:
規則一:
從Oracle 低版本的Export數據可以Import到Oracle高版本中,但限於Oracle的相鄰版本,如從Oracle 7 到 Oracle 8。對於兩個不相鄰版本間進行轉換,如從Oracle 6 到 Oracle 8,則應先將數據輸入到中間版本—Oracle 7,再從中間數據庫轉入更高版本。
規則二:
Oracle的Export/Import工具只能連接到擁有更高或者一樣的Export/Import版本的數據庫。如Oracle 8.0.5的Export/Import(版本8.0.5.0.0)可連接到Oracle 8.1.6數據庫(版本8.1.6.0.0);高版本的Export導出來的轉儲文件,低版本的Import讀不了;低版本的Export導出來的轉儲文件,高版本的Import可以進行讀取。
利用上面兩個規則,下面就本人在為一單位用Oracle導入/導出工具(Export/Import)進行此種移植碰到的問題,提出來與大家分享,希望能起到拋磚引玉的作用。
此單位擁有Oracle數據庫版本有Oracle 8.1.6 For NT、Oracle 8.0.5 For NT、Oracle 8.0.4 For Digital Unix、Oracle 7.3 For NT。
考慮到Oracle 8.0.4 For Digital Unix運行在小型機上、單位的備份系統也是針對此小型機,決定將Oracle 8.1.6 For NT、Oracle 8.0.5 For NT、Oracle 7.3 For NT的數據庫都移植到Oracle 8.0.4 For Digital Unix上。
1、Oracle 8.0.5 For NT移植
因版本相差甚小,開始直接用Oracle8.0.5的exp80導出數據庫的轉儲文件,然後用FTP(binary傳輸模式)直接上傳至Oracle 8.0.4 所在的小型機,再用Oracle 8.0.4的imp導入一直有字符集的問題,即存有漢字的字段顯示的都是”??????”, 移植失敗。後發現,在Oracle8.0.5服務器上直接用Oracle8.0.5的imp80對exp80導出的轉儲文件進行遠程導入,字符集的問題解決,移植成功。
對於使用Oracle 8.0.4 For Digital Unix的用戶,提醒一句,最好不要用Oracle 8.0.4 For Digital Unix的exp、imp工具做備份,而應用此版本的Windows客戶端程序exp80、imp80。
本人曾做過實驗:在Oracle 8.0.4 for Digital UNIN數據庫上新建一用戶(user)和一個表格(table)通過sql plus客戶端在表格的列中插入一些中文行,提交後,用exp 數據導出,再用imp數據導入,用sql plus客戶端查看,表中的中文值顯示為”???”)。
2、Oracle 7.3 移植
直接用Oracle7.3的export導出數據庫的轉儲文件,拷至Oracle8.0.5服務器,然後用Oracle8.0.5服務器的imp80直接導入至Oracle 8.0.5數據庫。此移植就變成了Oracle 8.0.5 For NT移植至Oracle 8.0.4 For Digital Unix的移植。
3、Oracle 8.1.6 For NT移植
初步設想也通過Oracle 8.0.5進行過度。因其版本比Oracle 8.0.5高、下面對參考的規則進行一些校驗。
3.1高版本的Export導出來的轉儲文件,低版本的Import讀不了
在Oracle 8.1.6數據庫服務器導出轉儲二進制文件:ora816.dmp。
在Oracle 8.0.5數據庫服務器上用Imp80進行導入。
- D:>Imp80 house/passWord file=d:\ ora816.dmp log=d:\ora816.log full=y
/*日志顯示*/
已連接到:
- Oracle8 Release 8.0.5.0.0 – Production
- PL/SQL Release 8.0.5.0.0 – Production
IMP-00010: 不是有效的導出文件,標題檢驗失敗
IMP-00021: 操作系統錯誤 - 錯誤代碼(十進制2,十六進制0x2)
IMP-00000: 未成功終止導入
3.2 Oracle的Export/Import工具只能連接到擁有更高或者一樣的Export/Import版本的數據庫
a)Oracle 8.1.6遠程數據導入
在Oracle 8.1.6數據庫服務器導出轉儲二進制文件:ora816.dmp。
在Oracle 8.1.6數據庫服務器向Oracle8.0.5數據庫進行數據遠程導入
D:>Imp house/passWord@orclfrom816to805 file=d:\ ora816.dmp log=d:\ora816.log full=y
(orclfrom816to805為數據庫連接字符串由Oracle8.1.6數據庫指向 Oracle8.0.5數據庫)
/*日志顯示*/
連接到:
- Oracle8 Release 8.0.5.0.0 – Production
- PL/SQL Release 8.0.5.0.0 – Production
- ……
經由常規路徑導出由EXPORT:V08.01.06創建的文件
已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入
IMP-00003: Oracle 錯誤2248出現
ORA-02248: 無效的 ALTER SESSION 選項
IMP-00000: 未成功終止導入
b)在Oracle 8.0.5數據庫服務器上用exp80對Oracle 8.1.6數據庫進行遠程導出。
D:>exp80 house/passWord@orclfrom805to816 file=d:\ora816.dmp log=d:\ora816.log
(orclfromfrom805to816為數據庫連接字符串由Oracle8.0.5數據庫指向Oracle8.1.6數據庫)
/*日志顯示*/
連接到:
- Oracle8i Enterprise Edition Release 8.1.6.0.0 – Production
- With the Partitioning option
- JServer Release 8.1.6.0.0 – Production
已導出ZHS16GBK字符集和ZHS16GBK NCHAR 字符集
即將導出指定的用戶...
……
在沒有警告的情況下成功終止導出。
再對遠程導出的轉儲文件在Oracle 8.0.5數據庫服務器上用imp80導入。
- D:>imp80 house/passWord file=d:\ora816.dmp full=y log=d:\ora816 _i.log
顯示成功導入
此刻此移植就變成了Oracle 8.0.5 For NT移植至Oracle 8.0.4 For Digital Unix的移植。
利用Oracle的Oracle導入/導出工具(Export/Import)除了可進行數據庫邏輯備份、數據庫移植還可以用來提高數據庫的性能,對數據庫進行一次導入/導出操作能重新組織數據,消除數據庫的碎片,從而使數據庫的性能有較大的提高。