對(duì)于oracle數(shù)據(jù)庫(kù)之間的移植采用oracle的導(dǎo)入導(dǎo)出工具(import/export)是一個(gè)比較好的策略。雖也可以利用第三方軟件如sybase 的power designer中的reverse engineering 進(jìn)行數(shù)據(jù)庫(kù)結(jié)構(gòu)重建,然后在進(jìn)行較復(fù)雜的數(shù)據(jù)導(dǎo)入過(guò)程,但對(duì)于作業(yè)隊(duì)列、快照等則不得不用手工來(lái)創(chuàng)建。而export能將整個(gè)數(shù)據(jù)庫(kù)、指定用戶、指定表和相關(guān)的數(shù)據(jù)字典進(jìn)行輸出,export輸出的輸出轉(zhuǎn)存二進(jìn)制文件包括了完全重建所有被選對(duì)象所需的命令。
本人在為某電廠mis(oracle數(shù)據(jù)庫(kù))數(shù)據(jù)采用oracle的導(dǎo)入導(dǎo)出工具從windows nt平臺(tái)移植到digital unix平臺(tái)時(shí)遇到的關(guān)于字符集的問(wèn)題和總結(jié)出的經(jīng)驗(yàn)與大家來(lái)分享。
1. 移植環(huán)境 原操作系統(tǒng)平臺(tái): windows nt 數(shù)據(jù)庫(kù): oracle 8.0.5 for windows nt 服務(wù)器:hp netserver lh3 目標(biāo)操作系統(tǒng)平臺(tái):digital unix alpha v4.0 數(shù)據(jù)庫(kù):oracle 8.0.4 for digital unix 服務(wù)器:alphaserver es40 小型機(jī)
2. 數(shù)據(jù)導(dǎo)出 在nt服務(wù)器上用oracle導(dǎo)出工具進(jìn)行數(shù)據(jù)導(dǎo)出,oracle導(dǎo)出工具有命令行和圖形界面兩種方式。 本人直接用命令行方式進(jìn)行數(shù)據(jù)導(dǎo)出: c:> exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log 即將導(dǎo)出指定的用戶... . 正在導(dǎo)出用戶gxmisdba的外部函數(shù)程序庫(kù)名稱 . 正在導(dǎo)出用戶gxmisdba的對(duì)象類型定義 即將導(dǎo)出gxmisdba的對(duì)象 ... . 正在導(dǎo)出數(shù)據(jù)庫(kù)鏈接 . 正在導(dǎo)出序號(hào) . 正在導(dǎo)出群集定義 . 即將導(dǎo)出gxmisdba的表通過(guò)常規(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)出存儲(chǔ)的過(guò)程 . 正在導(dǎo)出參考資料一致性約束條件 . 正在導(dǎo)出觸發(fā)器 . 正在導(dǎo)出后期表活動(dòng) . 正在導(dǎo)出快照 . 正在導(dǎo)出快照日志 . 正在導(dǎo)出作業(yè)隊(duì)列 . 正在導(dǎo)出刷新組和子組 在沒(méi)有警告的情況下成功終止導(dǎo)出。
3.數(shù)據(jù)導(dǎo)入 在nt服務(wù)器上通過(guò)ftp命令將導(dǎo)出的輸出轉(zhuǎn)存二進(jìn)制文件expdat.dmp(使用binary傳輸模式)傳輸至digital unix服務(wù)器上。 用oracle for digital unix 數(shù)據(jù)導(dǎo)入工具命令行方式進(jìn)行數(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多個(gè)以上類似錯(cuò)誤,后分析其中報(bào)錯(cuò)的"tbl_aj_stk"表,發(fā)現(xiàn)"fld_kj_jlry_xm"字段值(關(guān)鍵字組成之一)為中文字符而在digital unix服務(wù)器oracle數(shù)據(jù)庫(kù)中"fld_kj_jlry_xm"字段值顯示的為"????"(在客戶端用oracle sql plus查看),從而造成關(guān)鍵字沖突。 在客戶端oracle sql plus對(duì)某行顯示"????"的字段值進(jìn)行修改,如改成中文值”測(cè)試”,提交后,用sql語(yǔ)句查看,剛修改的行中顯示"????"的字段值變成了”測(cè)試”,這說(shuō)明了digital unin服務(wù)器上的oracle數(shù)據(jù)集可以存儲(chǔ)中文字符,但oracle 8.0.4 for digital unin的導(dǎo)入工具imp未能將oracle 8.0.5 for windows nt imp80導(dǎo)出的中文數(shù)據(jù)進(jìn)行轉(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(中國(guó)簡(jiǎn)體漢字16位國(guó)標(biāo)庫(kù))。安裝完成后,通過(guò)查看props$的內(nèi)容,確認(rèn)了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows nt的字符集一致。于是用oracle 8.0.4 for digital unin的導(dǎo)入工具imp重新進(jìn)行數(shù)據(jù)導(dǎo)入,但還是報(bào)同樣的錯(cuò)誤,問(wèn)題還未得到解決。
5.問(wèn)題解決辦法 后來(lái)本人發(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遠(yuǎn)程對(duì)oracle 8.0.4 for digital unin數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)導(dǎo)入,問(wèn)題竟得到解決。 5.1在nt的服務(wù)器上,修改tnsnames.ora(或通過(guò)oracle net8 easy config)設(shè)置數(shù)據(jù)庫(kù)連接字符串gxmis(可自行設(shè)定)指向oracle 8.0.4 for digital unin服務(wù)器。
5.2在nt的服務(wù)器上進(jìn)行數(shù)據(jù)遠(yuǎn)程導(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的對(duì)象導(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)入 . . . 準(zhǔn)備啟用約束條件... 成功終止導(dǎo)入
5.3把oracle 8.0.4 for digital unin字符集重新又改成zhs16cgb231280,進(jìn)行數(shù)據(jù)遠(yuǎn)程導(dǎo)入測(cè)試,數(shù)據(jù)也同樣地導(dǎo)入成功。說(shuō)明zhs16cgb231280字符集可以兼容zhs16gbk字符集。
6.經(jīng)驗(yàn)總結(jié) 6.1在oracle 8.0.4 for digital unin服務(wù)器上(字符集zhs16gbk)用8.0.4 for digital unin的導(dǎo)出工具exp將已正常(即可存儲(chǔ)和顯示中文)的數(shù)據(jù)庫(kù)導(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進(jìn)行導(dǎo)入 $imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log 錯(cuò)誤又重現(xiàn)。
6.2在nt服務(wù)器上通過(guò)ftp命令將在oracle 8.0.4 for digital unin服務(wù)器上剛導(dǎo)出的輸出轉(zhuǎn)存二進(jìn)制文件expdat.dmp下載至nt服務(wù)器上,用imp80進(jìn)行遠(yuǎn)程導(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ù)器上對(duì)digital unin服務(wù)器上的數(shù)據(jù)進(jìn)行遠(yuǎn)程導(dǎo)出(備份) c:>exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log 顯示成功導(dǎo)出。再進(jìn)行遠(yuǎn)程導(dǎo)入 c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log 顯示成功導(dǎo)入。通過(guò)客戶端oracle sql plus查看中文顯示正常。 從而說(shuō)明在oracle 8.0.4 for digital unin服務(wù)器上對(duì)含有中文的數(shù)據(jù)庫(kù)的數(shù)據(jù)移植、備份、數(shù)據(jù)恢復(fù)不要用oracle 8.0.4 for digital unin本身自帶的導(dǎo)入導(dǎo)出工具imp,exp,應(yīng)使用能進(jìn)行中文導(dǎo)入導(dǎo)出的工具,如imp80,exp80。 |