對于oracle數(shù)據(jù)庫之間的移植采用oracle的導(dǎo)入導(dǎo)出工具(import/export)是一個比較好的策略。雖也可以利用第三方軟件如sybase 的power designer中的reverse engineering 進行數(shù)據(jù)庫結(jié)構(gòu)重建,然后在進行較復(fù)雜的數(shù)據(jù)導(dǎo)入過程,但對于作業(yè)隊列、快照等則不得不用手工來創(chuàng)建。而export能將整個數(shù)據(jù)庫、指定用戶、指定表和相關(guān)的數(shù)據(jù)字典進行輸出,export輸出的輸出轉(zhuǎn)存二進制文件包括了完全重建所有被選對象所需的命令。
本人在為某電廠mis(oracle數(shù)據(jù)庫)數(shù)據(jù)采用oracle的導(dǎo)入導(dǎo)出工具從windows nt平臺移植到digital unix平臺時遇到的關(guān)于字符集的問題和總結(jié)出的經(jīng)驗與大家來分享。
1. 移植環(huán)境 原操作系統(tǒng)平臺: windows nt 數(shù)據(jù)庫: oracle 8.0.5 for windows nt 服務(wù)器:hp netserver lh3 目標操作系統(tǒng)平臺:digital unix alpha v4.0 數(shù)據(jù)庫:oracle 8.0.4 for digital unix 服務(wù)器:alphaserver es40 小型機
2. 數(shù)據(jù)導(dǎo)出 在nt服務(wù)器上用oracle導(dǎo)出工具進行數(shù)據(jù)導(dǎo)出,oracle導(dǎo)出工具有命令行和圖形界面兩種方式。 本人直接用命令行方式進行數(shù)據(jù)導(dǎo)出: c:> exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log 即將導(dǎo)出指定的用戶... . 正在導(dǎo)出用戶gxmisdba的外部函數(shù)程序庫名稱 . 正在導(dǎo)出用戶gxmisdba的對象類型定義 即將導(dǎo)出gxmisdba的對象 ... . 正在導(dǎo)出數(shù)據(jù)庫鏈接 . 正在導(dǎo)出序號 . 正在導(dǎo)出群集定義 . 即將導(dǎo)出gxmisdba的表通過常規(guī)路徑 ... . . 正在導(dǎo)出表 aaaaa 0 行被導(dǎo)出 . . 正在導(dǎo)出表 evt_carrier_configuration 0 行被導(dǎo)出 . . 正在導(dǎo)出表 tbl_aj_agks 331 行被導(dǎo)出 . . . . 正在導(dǎo)出同義詞 . 正在導(dǎo)出視圖 . 正在導(dǎo)出存儲的過程 . 正在導(dǎo)出參考資料一致性約束條件 . 正在導(dǎo)出觸發(fā)器 . 正在導(dǎo)出后期表活動 . 正在導(dǎo)出快照 . 正在導(dǎo)出快照日志 . 正在導(dǎo)出作業(yè)隊列 . 正在導(dǎo)出刷新組和子組 在沒有警告的情況下成功終止導(dǎo)出。
3.數(shù)據(jù)導(dǎo)入 在nt服務(wù)器上通過ftp命令將導(dǎo)出的輸出轉(zhuǎn)存二進制文件expdat.dmp(使用binary傳輸模式)傳輸至digital unix服務(wù)器上。 用oracle for digital unix 數(shù)據(jù)導(dǎo)入工具命令行方式進行數(shù)據(jù)導(dǎo)入 $imp gxmisdba/manager file=/expdat.dmp full=y log=u01import.log connected to: oracle8 enterprise edition release 8.0.4.0.0 - production pl/sql release 8.0.4.0.0 - production export file created by export:v08.00.05 via conventional path . importing gxmisdbas objects into gxmisdba . . importing table "aaaaa" 0 rows imported . . importing table "evt_carrier_configuration" 0 rows imported . . importing table "tbl_aj_stk" 331 rows imported imp-00017: following statement failed with oracle error 2437: "alter table "tbl_kj_jlry" add constraint "pk_tbl_kj_jlry" primary key ("fld_kj_jlry_bh","fld_kj_jlry_xm") using index pctfree 10 initrans 2 maxtrans 255 storage (initial 10240 next 10240 minextents 1 maxextents 2147483645 pctincrease 50 freelists 1 freelist groups 1 buffer_pool default)" " enable novalidate" imp-00003: oracle error 2437 encountered ora-02437: cannot enable (gxmisdba.pk_tbl_kj_jlry) - primary key violated . . . import terminated successfully with warnings. 數(shù)據(jù)導(dǎo)入出現(xiàn)20多個以上類似錯誤,后分析其中報錯的"tbl_aj_stk"表,發(fā)現(xiàn)"fld_kj_jlry_xm"字段值(關(guān)鍵字組成之一)為中文字符而在digital unix服務(wù)器oracle數(shù)據(jù)庫中"fld_kj_jlry_xm"字段值顯示的為"????"(在客戶端用oracle sql plus查看),從而造成關(guān)鍵字沖突。 在客戶端oracle sql plus對某行顯示"????"的字段值進行修改,如改成中文值”測試”,提交后,用sql語句查看,剛修改的行中顯示"????"的字段值變成了”測試”,這說明了digital unin服務(wù)器上的oracle數(shù)據(jù)集可以存儲中文字符,但oracle 8.0.4 for digital unin的導(dǎo)入工具imp未能將oracle 8.0.5 for windows nt imp80導(dǎo)出的中文數(shù)據(jù)進行轉(zhuǎn)換。
4.查看字符集參數(shù) 4.1查看oracle 8.0.5 for windows nt props$內(nèi)容 sql> connect sys/change_on_install sql> col value$ format a40 sql> select name,value$ from props$; name value$ --------------------------------------- dict.base 2 nls_language american nls_territory america nls_currency $ nls_iso_currency america nls_numeric_characters ., nls_calendar gregorian nls_date_format dd-mon-yy nls_date_language american nls_characterset zhs16gbk nls_sort binary nls_nchar_characterset zhs16gbk nls_rdbms_version 8.0.5.0.0 global_db_name oracle.world export_views_version 7 已選擇15行。
4.2查看oracle 8.0.4 for digital unin 的props$內(nèi)容 sql> connect sys/change_on_install sql> col value$ format a40 sql> select name,value$ from props$; name value$ --------------------------------------- dict.base 2 nls_language american nls_territory america nls_currency $ nls_iso_currency america nls_numeric_characters ., nls_calendar gregorian nls_date_format dd-mon-yy nls_date_language american nls_characterset zhs16cgb231280 nls_sort binary nls_nchar_characterset zhs16cgb231280 nls_rdbms_version 8.0.4.0.0 global_db_name orcl.world export_views_version 7 15 rows selected. 發(fā)現(xiàn)oracle 8.0.4 for digital unin 采用了oracle在digital unix環(huán)境下建議的中文字符集zhs16cgb231280,兩者的字符集不同,于是本人就在digital unin服務(wù)器上重新安裝oracle,選擇了與nt上同樣的字符集zhs16gbk(中國簡體漢字16位國標庫)。安裝完成后,通過查看props$的內(nèi)容,確認了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows nt的字符集一致。于是用oracle 8.0.4 for digital unin的導(dǎo)入工具imp重新進行數(shù)據(jù)導(dǎo)入,但還是報同樣的錯誤,問題還未得到解決。
5.問題解決辦法 后來本人發(fā)現(xiàn)在oracle 8.0.5 for windows nt的服務(wù)器(或裝有oracle 8.0.5 for windows 95/98的工作站)上直接用oracle 8.0.5 for windows nt的導(dǎo)入工具imp80遠程對oracle 8.0.4 for digital unin數(shù)據(jù)庫進行數(shù)據(jù)導(dǎo)入,問題竟得到解決。 5.1在nt的服務(wù)器上,修改tnsnames.ora(或通過oracle net8 easy config)設(shè)置數(shù)據(jù)庫連接字符串gxmis(可自行設(shè)定)指向oracle 8.0.4 for digital unin服務(wù)器。
5.2在nt的服務(wù)器上進行數(shù)據(jù)遠程導(dǎo)入 c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmpfull=y log=c:import.log
已連接到:oracle8 enterprise edition release 8.0.4.0.0 - production pl/sql release 8.0.4.0.0 - production 經(jīng)由常規(guī)路徑導(dǎo)出由export:v08.00.05創(chuàng)建的文件 . 正在將gxmisdba的對象導(dǎo)入到 gxmisdba . . 正在導(dǎo)入表 "aaaaa" 0行被導(dǎo)入 . . 正在導(dǎo)入表 "evt_carrier_configuration" 0行被導(dǎo)入 . . 正在導(dǎo)入表 "tbl_aj_agks" 331行被導(dǎo)入 . . . 準備啟用約束條件... 成功終止導(dǎo)入
5.3把oracle 8.0.4 for digital unin字符集重新又改成zhs16cgb231280,進行數(shù)據(jù)遠程導(dǎo)入測試,數(shù)據(jù)也同樣地導(dǎo)入成功。說明zhs16cgb231280字符集可以兼容zhs16gbk字符集。
6.經(jīng)驗總結(jié) 6.1在oracle 8.0.4 for digital unin服務(wù)器上(字符集zhs16gbk)用8.0.4 for digital unin的導(dǎo)出工具exp將已正常(即可存儲和顯示中文)的數(shù)據(jù)庫導(dǎo)出。 $ exp gxmisdba/manager file=/u01/expdat.dmp log=/u01/export.log 顯示成功導(dǎo)出。 在用oracle 8.0.4 for digital unin的導(dǎo)入工具imp進行導(dǎo)入 $imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log 錯誤又重現(xiàn)。
6.2在nt服務(wù)器上通過ftp命令將在oracle 8.0.4 for digital unin服務(wù)器上剛導(dǎo)出的輸出轉(zhuǎn)存二進制文件expdat.dmp下載至nt服務(wù)器上,用imp80進行遠程導(dǎo)入。 c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log 已連接到:oracle8 enterprise edition release 8.0.4.0.0 – production pl/sql release 8.0.4.0.0 – production imp-00016: 不支持要求的字符集轉(zhuǎn)換(從類型1到852) imp-00000: 未成功終止導(dǎo)入
6.3在nt服務(wù)器上對digital unin服務(wù)器上的數(shù)據(jù)進行遠程導(dǎo)出(備份) c:>exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log 顯示成功導(dǎo)出。再進行遠程導(dǎo)入 c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log 顯示成功導(dǎo)入。通過客戶端oracle sql plus查看中文顯示正常。 從而說明在oracle 8.0.4 for digital unin服務(wù)器上對含有中文的數(shù)據(jù)庫的數(shù)據(jù)移植、備份、數(shù)據(jù)恢復(fù)不要用oracle 8.0.4 for digital unin本身自帶的導(dǎo)入導(dǎo)出工具imp,exp,應(yīng)使用能進行中文導(dǎo)入導(dǎo)出的工具,如imp80,exp80。 |