Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          oracle數據庫移植時字符集問題的解決

           

          對于oracle數據庫之間的移植采用oracle的導入導出工具(import/export)是一個比較好的 策略。雖也可以利用第三方軟件如sybase 的power designer中的reverse engineering 進行數據庫結構重建,然后在進行較復雜的數據導入過程,但對于作業隊列、快照等則不得不用手工來創建。而export能將整個數據庫、指定用戶、指定表和 相關的數據字典進行輸出,export輸出的輸出轉存二進制文件包括了完全重建所有被選對象所需的命令。

          本人在為某電廠mis(oracle數據庫)數據采用oracle的導入導出工具從windows nt平臺移植到digital unix平臺時遇到的關于字符集的問題和總結出的經驗與大家來分享。

          1. 移植環境
          原操作系統平臺: windows nt
          數據庫: oracle 8.0.5 for windows nt
          服務器:hp netserver lh3
          目標操作系統平臺:digital unix alpha v4.0
          數據庫:oracle 8.0.4 for digital unix
          服務器:alphaserver es40 小型機

          2. 數據導出
          在nt服務器上用oracle導出工具進行數據導出,oracle導出工具有命令行和圖形界面兩種方式。
          本人直接用命令行方式進行數據導出:
          c:> exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log
          即將導出指定的用戶...
          . 正在導出用戶gxmisdba的外部函數程序庫名稱
          . 正在導出用戶gxmisdba的對象類型定義
          即將導出gxmisdba的對象 ...
          . 正在導出數據庫鏈接
          . 正在導出序號
          . 正在導出群集定義
          . 即將導出gxmisdba的表通過常規路徑 ...
          . . 正在導出表     aaaaa          0 行被導出
          . . 正在導出表  evt_carrier_configuration   0 行被導出
          . . 正在導出表    tbl_aj_agks       331 行被導出
            .
            .
            .
          . 正在導出同義詞
          . 正在導出視圖
          . 正在導出存儲的過程
          . 正在導出參考資料一致性約束條件
          . 正在導出觸發器
          . 正在導出后期表活動
          . 正在導出快照
          . 正在導出快照日志
          . 正在導出作業隊列
          . 正在導出刷新組和子組
          在沒有警告的情況下成功終止導出。

          3.數據導入
          在nt服務器上通過ftp命令將導出的輸出轉存二進制文件expdat.dmp(使用binary傳輸模式)傳輸至digital unix服務器上。
          用oracle for digital unix 數據導入工具命令行方式進行數據導入
          $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.
          數 據導入出現20多個以上類似錯誤,后分析其中報錯的"tbl_aj_stk"表,發現"fld_kj_jlry_xm"字段值(關鍵字組成之一)為中文字 符而在digital unix服務器oracle數據庫中"fld_kj_jlry_xm"字段值顯示的為"????"(在客戶端用oracle sql plus查看),從而造成關鍵字沖突。
          在客戶端oracle sql plus對某行顯示"????"的字段值進行修改,如改成中文值”測試”,提交后,用sql語句查看,剛修改的行中顯示"????"的字段值變成了”測 試”,這說明了digital unin服務器上的oracle數據集可以存儲中文字符,但oracle 8.0.4 for digital unin的導入工具imp未能將oracle 8.0.5 for windows nt imp80導出的中文數據進行轉換。

          4.查看字符集參數
          4.1查看oracle 8.0.5 for windows nt props$內容
          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$內容
          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.
          發 現oracle 8.0.4 for digital unin 采用了oracle在digital unix環境下建議的中文字符集zhs16cgb231280,兩者的字符集不同,于是本人就在digital unin服務器上重新安裝oracle,選擇了與nt上同樣的字符集zhs16gbk(中國簡體漢字16位國標庫)。安裝完成后,通過查看props$的 內容,確認了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows nt的字符集一致。于是用oracle 8.0.4 for digital unin的導入工具imp重新進行數據導入,但還是報同樣的錯誤,問題還未得到解決。

          5.問題解決辦法
          后來本人發現在oracle 8.0.5 for windows nt的服務器(或裝有oracle 8.0.5 for windows 95/98的工作站)上直接用oracle 8.0.5 for windows nt的導入工具imp80遠程對oracle 8.0.4 for digital unin數據庫進行數據導入,問題竟得到解決。
          5.1在nt的服務器上,修改tnsnames.ora(或通過oracle net8 easy config)設置數據庫連接字符串gxmis(可自行設定)指向oracle 8.0.4 for digital unin服務器。

          5.2在nt的服務器上進行數據遠程導入
          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
          經由常規路徑導出由export:v08.00.05創建的文件
          . 正在將gxmisdba的對象導入到 gxmisdba
          . . 正在導入表 "aaaaa" 0行被導入
          . . 正在導入表 "evt_carrier_configuration" 0行被導入
          . . 正在導入表 "tbl_aj_agks" 331行被導入
          .
          .
          .
          準備啟用約束條件...
          成功終止導入

          5.3把oracle 8.0.4 for digital unin字符集重新又改成zhs16cgb231280,進行數據遠程導入測試,數據也同樣地導入成功。說明zhs16cgb231280字符集可以兼容zhs16gbk字符集。

          6.經驗總結
          6.1在oracle 8.0.4 for digital unin服務器上(字符集zhs16gbk)用8.0.4 for digital unin的導出工具exp將已正常(即可存儲和顯示中文)的數據庫導出。
          $ exp gxmisdba/manager file=/u01/expdat.dmp log=/u01/export.log
          顯示成功導出。
          在用oracle 8.0.4 for digital unin的導入工具imp進行導入
          $imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log
          錯誤又重現。

          6.2在nt服務器上通過ftp命令將在oracle 8.0.4 for digital unin服務器上剛導出的輸出轉存二進制文件expdat.dmp下載至nt服務器上,用imp80進行遠程導入。
          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: 不支持要求的字符集轉換(從類型1到852)
          imp-00000: 未成功終止導入

          6.3在nt服務器上對digital unin服務器上的數據進行遠程導出(備份)
          c:>exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log
          顯示成功導出。再進行遠程導入
          c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log
          顯示成功導入。通過客戶端oracle sql plus查看中文顯示正常。
          從 而說明在oracle 8.0.4 for digital unin服務器上對含有中文的數據庫的數據移植、備份、數據恢復不要用oracle 8.0.4 for digital unin本身自帶的導入導出工具imp,exp,應使用能進行中文導入導出的工具,如imp80,exp80。

          posted on 2006-02-18 12:42 Vincent.Chen 閱讀(214) 評論(0)  編輯  收藏 所屬分類: Java 、Database

          主站蜘蛛池模板: 武川县| 襄汾县| 丹东市| 武冈市| 崇信县| 孟津县| 贵州省| 敖汉旗| 瑞金市| 山东| 福安市| 昆明市| 高台县| 大关县| 平山县| 新源县| 锡林浩特市| 汝城县| 邵阳县| 古田县| 盐城市| 元氏县| 西和县| 孟津县| 金塔县| 宜宾县| 长治县| 南丹县| 深泽县| 张家界市| 花莲县| 蓬安县| 凉山| 义乌市| 桑植县| 清新县| 青川县| 临潭县| 乌苏市| 同仁县| 班戈县|