暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DATAPUMP跨字符集(16gbk-utf8)导入字段长度问题处理(ORA-02374,12899,02372)

原创 张海 云和恩墨 2022-08-21
1550

·适用范围
跨字符集数据库,CHAR类型字段表,DATAPUMP,IMPDP
·问题概述
客户有一套OGG环境需要同步表数据,源端AIX+ora11204,目标端LINUX6+ora11203,在使用数据泵初始化表的时候,导入dump文件时报ORA-02374ORA-12899ORA-02372错误

ORA-02374: conversion error loading table "OWNER1"."TABLE1"
ORA-12899: value too large for column AREA (actual: 246, maximum: 240)
ORA-02372: data for row: AREA : 0X'000000004E00002030300000B3F00000000000000000000000'

ORA-02374: conversion error loading table "OWNER1"."TABLE1"
ORA-12899: value too large for column MASK (actual: 5, maximum: 4)
ORA-02372: data for row: MASK : 0X'C0000000'


·问题原因
报错为表字段长度过小,且均为CHAR类型字段,因16GBK与UTF8字符集数据库存储数据所占字节数不同(一个中文在gbk字符集中占2字节,utf8中则占3字节),故导致CHAR类型字段数据在跨字符集数据库中导入时报ORA-02374ORA-12899ORA-02372错误
·解决方案
方案一
1、在源库中通过dbms_metadata.get_ddl获取该表建表语句,在目标库手动建一张同样的表

set long 999999999
select dbms_metadata.get_ddl('TABLE','OWNER1','TABLE1') from dual;


2、通过SQL语句扩展目标库报错字段的长度值为原值的2倍

alter table OWNER1.TABLE1 modify (AREA CHAR(480));
alter table OWNER1.TABLE1 modify (MASK CHAR(8));

如字段较多,可用如下脚本(仅需修改表名)生成修改SQL命令,在目标库批量执行

set lines 300 pages 800
col ddl for a150
SELECT
'alter table ' ||OWNER || '.'|| TABLE_NAME || ' modify ' || COLUMN_NAME ||' ' ||data_type || '(' || data_length*2 || ');' ddl
FROM DBA_TAB_COLS tb
WHERE TABLE_NAME in ('TABLE1','TABLE2')
AND data_type like '%CHAR%'
ORDER BY owner,table_name,COLUMN_ID ;


3、在源库中EXPDP导出表时,通过CONTENT=DATA_ONLY参数只导出表数据,不导出表结构,再将表数据导入目标库

方案二
1、在源库导出同步表

2、在目标库通过CONTENT=METADATA_ONLY参数导入表结构

3、通过SQL语句扩展目标库报错字段的长度值为原值的2倍

alter table OWNER1.TABLE1 modify (AREA CHAR(480));
alter table OWNER1.TABLE1 modify (MASK CHAR(8));

如字段较多,可用如下脚本(仅需修改表名)生成修改SQL命令,在目标库批量执行

set lines 300 pages 800
col ddl for a150
SELECT
'alter table ' ||OWNER || '.'|| TABLE_NAME || ' modify ' || COLUMN_NAME ||' ' ||data_type || '(' || data_length*2 || ');' ddl
FROM DBA_TAB_COLS tb
WHERE TABLE_NAME in ('TABLE1','TABLE2')
AND data_type like '%CHAR%'
ORDER BY owner,table_name,COLUMN_ID ;


4、在目标库通过CONTENT=DATA_ONLY参数导入数据

最后修改时间:2022-09-08 17:27:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论