【轉】oracle跨平臺數據遷移 expdp/impdp 字符集問題 致使ORA-02374 ORA-12899 ORA-02372

oracle遷移 expdp/impdp 字符集問題 致使ORA-02374 ORA-12899 ORA-02372

轉自:https://www.cnblogs.com/hellojesson/p/7047552.htmlhtml

環境描述:
源數據庫環境:
    操做系統: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));
而後再從新導入(只導入數據)。
 

第三種:若是不想改變目標端數據庫的字符集,那麼修改源數據庫字符集(更改數據庫字符集的操做不建議使用),而後執行從新導出操做,詳細的步驟以下:linux

SQL>SHUTDOWN IMMEDIATE;數據庫

SQL>STARTUP MOUNT EXCLUSIVE;oracle

SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;post

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;編碼

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;spa

SQL>ALTER DATABASE OPEN;操作系統

SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;code

SQL>SHUTDOWN immediate;htm

SQL>startup;

 

其餘參考:

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

相關文章
相關標籤/搜索