環境描述:
源數據庫環境:
操做系統: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