ITPub博客

首页 > 数据库 > Oracle > 一次紧急DMP导入:12c导出到11g生产库,踩过的版本与字符集大坑

一次紧急DMP导入:12c导出到11g生产库,踩过的版本与字符集大坑

原创 Oracle 作者:marui 时间:2026-06-10 10:39:59 0 删除 编辑

大家好,我是睿。

 

作为乙方 DBA ,经常会接到客户的紧急需求。这不,今天刚处理完一个“看似简单、实则暗坑”的 DMP 导入任务,分享出来供大家参考,避免走弯路。

 

故障背景

 

上午客户电话打来: “有个 DMP 文件要紧急导入生产库,文件已经传到服务器上了,很急!”

 

我远程连上去一看: TMP.dmp ,只有 200MB 。心想应该不难,结果问了客户导出信息后,客户表示这是“转了好几手”的文件,无法提供原始导出语句。

 

 

  第一步:判断 DMP 文件类型

 

使用 `strings` 命令查看文件头部:

 

strings TMP.dmp | head -30

 

关键信息提取:

"SYSTEM"."SYS_EXPORT_TABLE_01" → Data Pump (expdp) 导出

版本: 12.01.00.02.00 → 来自 Oracle 12c

字符集: ZHS16GBK

<OWNER_NAME>SYSTEM</OWNER_NAME><NAME>TMP2024   →  表名: TMP2024 ,所属用户 SYSTEM

 

结论:这是 12c 的 expdp 导出文件。

 

 

  第一次导入尝试(直接失败)

 

生产库是 11.2.0.4 ,尝试导入:

$ impdp '/ as sysdba' directory=soft dumpfile=TMP.dmp logfile=import.log remap_schema=STSTEM:MARY

Import: Release 11.2.0.4.0 - Production on Mon Jun 8 16:36:57 2026

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing options

ORA-39001: invalid argument value

ORA-39000: bad dump file specification

ORA-39142: incompatible version number 4.1 in dump file "/soft/TMP.dmp"

 

 

原因:高版本( 12c )导出的 DMP 文件,直接导入低版本( 11g )时,必须在导出时指定 VERSION=11.2 参数,对方没有加。

 

 

 

  第二次尝试:中转到 19c (字符集坑)

 

由于无法拿到原始环境,我先把文件导入到一台 19c 测试库(低版本 DMP 导入高版本通常不需要指定 VERSION )。

 

结果又报错:

impdp '/ as sysdba' directory=soft dumpfile=TMP.dmp logfile=import.log

ORA-02374: conversion error loading table "SYSTEM"."TMP2024"

ORA-12899: value too large for column ???? (actual: 6, maximum: 4)

ORA-02372: data for row: ???? : 0X'C3B7B6AB'

ORA-02374: conversion error loading table "SYSTEM"."TMP2024"

ORA-12899: value too large for column ???? (actual: 6, maximum: 4)

ORA-02372: data for row: ???? : 0X'C3B7B6AB'

 

根本原因:  

源 DMP 字符集是 ZHS16GBK ,而目标 19c 库是 AL32UTF8 。表中某些 VARCHAR2(4 BYTE) 列存入中文时,在 UTF8 下占 6 个字节,超出列长度限制。

 

 

  最终解决方案

 

找到一台字符集同样为 ZHS16GBK 的 19c 数据库,成功导入。

 

然后在该 19c 库中重新导出(高版本 → 低版本必须指定 VERSION ):

 

expdp system/xxxx@19c_db directory=soft dumpfile=TMP_11g.dmp \

       logfile=export_11g.log tables=SYSTEM.TMP2024 version=11.2

 

最后导入生产 11.2.0.4 库:

 

impdp '/ as sysdba' directory=soft dumpfile=TMP_11g.dmp logfile=import_11g.log

 

导入成功!

 

  经验总结(血泪教训)

 

1. 版本兼容性  

    高版本 expdp 导出的文件导入低版本,必须在导出时加 VERSION= 目标版本。

    低版本导出文件导入高版本,一般不需要指定 VERSION 。

 

2. 字符集一致性非常重要  

    不同字符集之间导入,尤其是包含中文时,极易出现 ORA-12899 。

    优先选择字符集匹配的环境进行中转。

 

3. DMP 文件信息探测技巧  

    strings dumpfile.dmp | head -30 可快速判断 exp/expdp 、版本、字符集等关键信息。

    生产环境建议养成导出时固定添加 VERSION 和 FLASHBACK_SCN 等参数的好习惯。

 

4. 紧急情况下的处理思路  

    无法直接导入 → 找中间环境做转换(版本 / 字符集 / 表空间等)。

    尽量避免直接在生产库做冒险操作。

 

写在最后

 

这次看似简单的 DMP 导入,前后折腾了三次才搞定,再次提醒大家: DMP  跨版本、跨字符集时一定要谨慎。

 

你最近遇到过哪些 DMP 导入的坑?欢迎在评论区分享,我会挑典型问题回复。

 

点赞 + 转发 + 关注,下期继续分享 Oracle 运维实战干货!

 

—— 睿 | Oracle DBA  

专注数据库故障与性能优化,欢迎交流


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047128/viewspace-3173434/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
要得到你想要的某样东西,最可靠的办法是让你自己配得上它。

注册时间:2025-07-21

  • 博文量
    30
  • 访问量
    31693