当前位置:Gxlcms > 数据库问题 > 【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

时间:2021-07-01 10:21:17 帮助过:48人阅读

exp/imp】US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

 

1.1  BLOG文档结构图

技术分享 

 

1.2  前言部分

1.2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~

如何将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中(重点,2种方法)?

从dmp文件可以获取到哪些信息?如何从dmp文件获取到dmp文件的字符集(重点,N种方法)?

如何从dmp文件中获取到其中的DDL语句,例如建表、建索引语句等(2种方法)

dmp文件导入的一般步骤

imp工具的indexfile选项的作用

软件UE、EditPlusPilotedit软件的使用

 


1.3  本文相关知识点

1.3.1  可以从dmp文件获取哪些信息?

在开发中常常碰到,需要导入dmp文件到现有数据库。这里的dmp文件可能来自于其它系统,所以,一般情况下是不知道导出程序(exp)的版本、导出时间或者导出模式等信息的。那么如何从现有的dmp文件中获取到这些信息呢?下面作者将一一讲解。

1.3.1.1  获取基本信息:导出的版本、时间、导出的用户

下面的示例中exp_ddl_lhr_02.dmp是生成的dmp文件:

[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | head -10

TEXPORT:V11.02.00  ====版本号 

DSYS    ====使用SYS用户导出

RTABLES ====基于表模式导出,RUSERS表示基于用户模式,RENTIRE表示基于全库模式

4096

Tue Aug 2 16:8:8 2016/tmp/exp_ddl_lhr_02.dmp====生成的时间和文件地址

#C#G

#C#G

+00:00

BYTE

UNUSED

 

 

1.3.1.2  获取dmp文件中的表信息

下面的示例中,exp_ddl_lhr_02.dmp是生成的dmp文件:

[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | grep "CREATE TABLE"|awk ‘{print $3}‘|sed ‘s/"//g‘

EMP ====说明exp_ddl_lhr_02.dmp中只有一个emp

 

1.3.1.3  解析dmp文件生成parfile文件

下面的示例中,exp_ddl_lhr_03.dmp是生成的dmp文件:

[ZFZHLHRDB1:oracle]:/tmp>strings  exp_ddl_lhr_03.dmp | grep "CREATE TABLE"|awk ‘{print $3}‘|sed ‘s/"//g‘|awk ‘{ if (FNR==1) print "tables="$1 ; else print ","$1 }‘

tables=DEF$_AQCALL

,DEF$_AQERROR

,DEF$_CALLDEST

,DEF$_DEFAULTDEST

,DEF$_DESTINATION

,DEF$_ERROR

,DEF$_LOB

,DEF$_ORIGIN

,DEF$_PROPAGATOR

,DEF$_PUSHED_TRANSACTIONS

,MVIEW$_ADV_INDEX

[ZFZHLHRDB1:oracle]:/tmp>

 

  

 

1.3.2  如何获取数据库DDL的创建语句

数据泵工具(impdp)工具给我们提供了SQLFILE的命令行选项,只获取DDL语句,并未真正的执行数据导入。另外,若单纯为了导出DDL语句则可以在使用expdp导出的时候使用CONTENT=METADATA_ONLYEXCLUDE=STATISTICS选项,这样导出的DMP文件比较小。如下所示:

 

expdp \‘/ AS SYSDBA\‘ DIRECTORY=DATA_PUMP_DIR DUMPFILE=lhrsql20161215.dmp LOGFILE=lhrsql20161215.log CONTENT=METADATA_ONLY SCHEMAS=SCOTT  EXCLUDE=STATISTICS

impdp  \‘/ AS SYSDBA\‘  DIRECTORY=DATA_PUMP_DIR DUMPFILE=lhrsql20161215.dmp  LOGFILE=imp_exptest.log SQLFILE=expddl_lhr.sql

 

查看expddl_lhr.sql文件即可获取DDL语句。

imp工具使用SHOW=Y LOG=GET_DDL.sql的方式,可以看到清晰的DDL脚本,同时也不会真正的执行数据导入。另外,若单纯为了导出DDL语句则可以在使用exp导出的时候使用ROWS=N选项,这样导出的DMP文件比较小。如下所示:

exp  \‘/ AS SYSDBA\‘  TABLES=SCOTT.EMP  FILE=/tmp/exp_ddl_lhr_01.dmp  LOG=/tmp/exp_table.log  BUFFER=41943040 ROWS=N COMPRESS=N

imp \‘/ AS SYSDBA\‘ FILE=/tmp/exp_ddl_lhr_01.dmp SHOW=Y LOG=/tmp/get_ddl.sql BUFFER=20480000  FULL=Y

 

 

查看get_ddl.sql文件即可获取DDL语句。

 

---- 生成DDL语句不会导入数据

--expdp \‘/ AS SYSDBA\‘ tables=lhr.exptest  directory=DATA_PUMP_DIR  dumpfile=exptest.dmp logfile=exp_exptest.dmp  EXCLUDE=STATISTICS

--expdp \‘/ AS SYSDBA\‘ directory=DATA_PUMP_DIR dumpfile=lhrsql20161215.dmp logfile=lhrsql20161215.log content=metadata_only schemas=SCOTT  EXCLUDE=STATISTICS

impdp  \‘/ AS SYSDBA\‘  directory=DATA_PUMP_DIR dumpfile=lhrsql20161215.dmp  logfile=imp_exptest.log sqlfile=exptest.sql

 

exp  \‘/ AS SYSDBA\‘  tables=scott.emp  file=/tmp/exp_ddl_lhr_01.dmp  log=/tmp/exp_table.log  buffer=41943040 rows=n compress=n

imp \‘/ AS SYSDBA\‘ file=/tmp/exp_ddl_lhr_01.dmp show=y log=/tmp/get_ddl.sql buffer=20480000  full=y

 


1.3.2.2  imp的indexfile选项(indexfile导出表和索引的ddl语句)

 

exp和imp工具中可能存在把table从一个库exp然后imp到另一个数据库出现没有指定tablespace而无法impimpindexfile参数中可以解决的。

Oracle的imp工具指定indexfile参数后,可以不导入任何对象,而只把需要创建的indexsql语句的形式写入文本文件。创建库表等sql语句也会写入,但用rem注释屏蔽。

一、查看并修改导入对象的存储参数

如果原始库中有些表比较大,exp导出对象的初始存储空间设置可能比较高,导入时需要先申请分配较大的存储空间,如果只进行逻辑结构的迁移耗时较长。这时可以用indexfile参数导出sql语句,筛选出初始空间较高的建表语句,手工创建。再次导入时使用ignore选项忽略对象创建错误。

如何解析inexfile文件:可以考虑用sed编辑器进行正则表达式替换,也可以写个程序解析出initial超出一定阈值的库表及其sql


 

1.3.2.3  impdp示例:

--expdp \‘/ AS SYSDBA\‘ directory=DATA_PUMP_DIR schemas=SCOTT  dumpfile=exptest_sql.dmp logfile=exp_exptest.dmp

impdp  \‘/ AS SYSDBA\‘  directory=DATA_PUMP_DIR dumpfile=exptest_sql.dmp  logfile=imp_exptest.log sqlfile=exptest.sql

 -------------------------------------------------------------------------

 

1.4  本文简介

一个网友找到我说,一个dmp文件导入数据库中,中文一直是乱码,看我能否帮忙解决一下。说真心话,一般情况下,乱码问题和安装问题,我一般不想接手,因为可能很简单的问题,有的人懒的动脑,碰到问题就问。尤其对于安装类问题,照着安装文档,一步一步来,一般都没有问题。在这里把一张网友分享的图片再分享一下:

技术分享

可是,问字符集的的哥们,我能感觉到他自己是下了功夫的,都是自己摸索了,实在解决不了,才找到的我。这种情况下,我果断是要帮助的。好了,废话不多说了,且看整个处理过程吧。

1.4.1  本文实验环境介绍

项目

source db

target db

db 类型

 

 

db version

10.2.0.1.0

10.2.0.1.0

db 存储

 

 

OS版本及kernel版本

 

 

字符集

US7ASCII

GBK

dmp文件字符集

人气教程排行