oracle跨平台數據遷移 expdp/impdp 字符集問題 導致ORA-02374 ORA-12899 ORA-02372


環境描述:
源數據庫環境:
    操作系統:Windows SERVER 2008R2
    數據庫版本:單實例 ORACLE 11.2.0.1
目標端數據庫環境:
    操作系統:redhat linux 6.5 x86 64bit
    數據庫版本:ORACLE 11g RAC 11.2.0.4
 
故障描述:
從源數據庫expdp導出數據,然后往目標數據庫impdp導入的時候報錯:
ORA-02374: conversion error loading table "QBJMES"."PROJECT"
ORA-12899: value too large for column PROJECT_SPEC (actual: 103, maximum: 100)
ORA-02372: data for row: PROJECT_SPEC : 0X'3730B6A1BCB6302E382A302E362A323035302A39363028312E'
 
故障分析:
    源數據庫字符集: zhsgbk16
    目標端數據庫字符集:al32utf8
 
zhsgbk16 和 utf8 對數據編碼之后,存儲格式不同,對於中文來講,gbk存放一個漢字占用2個字節,utf8存放一個漢字占用3個字節,這樣就會導致,比方說:原先GBK字符編碼的數據庫中的某張表中,存放中文的字段:colum001的類型是varchar 長度為200 ,並且該字段的大多數行的現有數據長度基本上在180個字節,那么該表導入UTF8編碼的數據庫中時,該字段原先存儲的大多數180個字節的漢字,就需要180*3/2=270個字節左右的字符長度才能正常存放;而此時在執行impdp導入操作的時候,表結構是不會改變的,也就是原先的字段定義colum001的長度還是保持着200,因此在導入的時候,就會報錯,出現上述錯誤信息。
 
處理方式:
第一種:重新導出,導入
在源庫執行導出操作之前,把qbjmes.project 字段改成超過103  。
然后再往目標庫導入的時候,就不會報錯了。
 
第二種:清空報錯表的數據,修改相關字段的長度,然后重新導入只導入該表的數據。
truncate table V_PS_STAFFPOS_REPTO_PUB_MT;
alter table V_PS_STAFFPOS_REPTO_PUB_MT modify(POST_NAME VARCHAR2(60));
然后再重新導入(只導入數據)。
 

第三種:如果不想改變目標端數據庫的字符集,那么修改源數據庫字符集(更改數據庫字符集的操作不建議使用),然后執行重新導出操作,詳細的步驟如下:

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP MOUNT EXCLUSIVE;

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL>ALTER DATABASE OPEN;

SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;

SQL>SHUTDOWN immediate;

SQL>startup;

 

其他參考:

http://blog.sina.com.cn/s/blog_50225015010117yr.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM