环境描述:
源数据库环境:
操作系统: 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://www.linuxidc.com/Linux/2018-05/152229.htm