阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle跨平台数据迁移 expdp/impdp 字符集问题 导致ORA-02374 ORA-12899 ORA-02372

198次阅读
没有评论

共计 1383 个字符,预计需要花费 4 分钟才能阅读完成。

环境描述:

源数据库环境:

    操作系统: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;

更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1383字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中