oracle跨平台数据迁移 expdp/impdp 字符集问题 导致ORA-02374 ORA-12899 ORA-02372
2017-06-19 10:27
621 查看
环境描述:
源数据库环境:
操作系统: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 。
然后再往目标库导入的时候,就不会报错了。
第二种:清空报错表的数据,修改相关字段的长度,然后重新导入只导入该表的数据。
第三种:如果不想改变目标端数据库的字符集,那么修改源数据库字符集(更改数据库字符集的操作不建议使用),然后执行重新导出操作,详细的步骤如下:
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://blog.sina.com.cn/s/blog_50225015010117yr.html
源数据库环境:
操作系统: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://blog.sina.com.cn/s/blog_50225015010117yr.html
相关文章推荐
- Windows7蓝屏导致Oracle回滚段损坏(ORA-01115和ORA-27070)数据库无法启动的问题处理
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- oracle改变字符编码(ORA-12899问题)
- Oracle的Expdp和Impdp之ORA-39151
- ORACLE expdp与impdp用法整理及高导低版本问题的解决
- Ora-12899 字符集问题
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
- 使用Oracle的IMP/IMPDP迁移ArcSDE数据库常见问题-ORA-20091和ORA-39083
- ORACLE expdp与impdp用法整理及高导低版本问题的解决
- Oracle EXPDP/IMPDP导入时版本问题验证
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- expdp/impdp做oracle 10g 到 11g的数据迁移
- Oracle IMp/Exp Expdp/Impdp 高版本 导入 低版本的问题
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- Oracle Expdp/Impdp 进行数据迁移的 几点注意事项
- oracle 修改服务端字符集导致ORA-12712错误
- Oracle 11g expdp与impdp导入遇到的问题