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

在Oracle中,可以从exp出来的dmp文件获取哪些信息?

DB宝 2020-05-12
3417


题目部分

在Oracle中,可以从exp出来的dmp文件获取哪些信息?


     

答案部分


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

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

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

 1[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | head -10
2TEXPORT:V11.02.00  ====》版本号 
3DSYS    ====》使用SYS用户导出
4RTABLES ====》基于表模式导出,RUSERS表示基于用户模式,RENTIRE表示基于全库模式
54096
6Tue Aug 2 16:8:8 2016/tmp/exp_ddl_lhr_02.dmp====》生成的时间和文件地址
7#C#G
8#C#G
9+00:00
10BYTE
11UNUSED


(二)获取dmp文件中的表信息

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

1[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | grep "CREATE TABLE"|awk '{print $3}'|sed 's/"//g'
2EMP ====》说明exp_ddl_lhr_02.dmp中只有一个emp表
3



(三)解析dmp文件生成parfile文件

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

1[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 }'
2tables=DEF$_AQCALL
3,DEF$_AQERROR
4,DEF$_CALLDEST
5,DEF$_DEFAULTDEST
6,DEF$_DESTINATION
7,DEF$_ERROR


(四)如何查看dmp文件的字符集

有两种办法可以查看dmp文件的字符集,第一种办法为imp导入命令查看,示例如下所示:

 1[ZFLHRZHDB1:oracle]:/oracle>ORACLE_SID=lhrdb
2[ZFLHRZHDB1:oracle]:/oracle>export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
3[ZFLHRZHDB1:oracle]:/oracle>exp  \'/ AS SYSDBA\'  tables=scott.emp  file=/tmp/exp_ddl_lhr_03.dmp  log=/tmp/exp_table.log  buffer=41943040 rows=n compress=n
4Export: Release 11.2.0.4.0 - Production on Tue Oct 25 17:14:49 2016
5Copyright (c) 19822011Oracle and/or its affiliates.  All rights reserved.
6Connected toOracle Database 11Enterprise Edition Release 11.2.0.4.0 - 64bit Production
7With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
8Data Mining and Real Application Tes
9Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set<<<--当前的NLS_LANG环境变量的值,即生成的dmp文件的字符集
10server uses ZHS16GBK character set (possible charset conversion)<<<<<<<--当前数据库的字符集
11Note: table data (rows) will not be exported
12About to export specified tables via Conventional Path ...
13Current user changed to SCOTT
14. . exporting table                            EMP
15EXP-00091: Exporting questionable statistics.
16EXP-00091: Exporting questionable statistics.
17Export terminated successfully with warnings.
18[ZFLHRZHDB1:oracle]:/oracle>ORACLE_SID=mydb <<---更换数据库
19[ZFLHRZHDB1:oracle]:/oracle>export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
20[ZFLHRZHDB1:oracle]:/oracle>imp  \'/ AS SYSDBA\'  tables=xxx.xx  file=/tmp/exp_ddl_lhr_03.dmp
21Import: Release 11.2.0.4.0 - Production on Tue Oct 25 16:27:15 2016
22Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
23Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
24With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
25Data Mining and Real Application Tes
26Export file created by EXPORT:V11.02.00 via conventional path<<<<<<<<<----dmp文件的导出版本号
27import done in ZHS16GBK character set and AL16UTF16 NCHAR character set<<<<<<--当前的NLS_LANG环境变量的值
28import server uses WE8ISO8859P1 character set (possible charset conversion)<<<<<<---当前数据库的字符集
29export client uses AL32UTF8 character set (possible charset conversion)<<<<<<--dmp文件的字符集
30IMP-00029: cannot qualify table name by owner (xxx.xx), use FROMUSER parameter
31IMP-00000: Import terminated unsuccessfully
32



如果NLS_LANG的值和当前数据库的字符集相同,那么将不显示“server uses”和“import server uses”行。如果没有显示“export client”行,那么说明当前dmp文件的字符集和当前的NLS_LANG环境变量的值相同。无论是使用exp还是imp工具都会显示当前的NLS_LANG环境变量的值(表现为“Export done”、“import done”)。

第二种查看dmp文件字符集的办法是,以十六进制的方式打开dmp文件,然后查看第2和第3个字节。如下所示:

1[ZFLHRZHDB1:oracle]:/oracle>cat /tmp/exp_ddl_lhr_03.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 1-2,7-8
20369
3[ZFLHRZHDB1:oracle]:/oracle>cat /tmp/exp_ddl_lhr_03.dmp |od -x|head -1
40000000 0303 4569 5058 524f 3a54 3156 2e30 3230


然后在数据库中可以查到十六进制0369代表的字符集:

1SYS@lhrdb> SELECT NLS_CHARSET_NAME(TO_NUMBER('0369','XXXX')) FROM DUAL;
2NLS_CHARSET_NAME(TO_NUMBER('0369','XXXX'
3----------------------------------------
4AL32UTF8


以上结果说明dmp文件的字符集是UTF8。常用的US7ASCIIZHS16GBKAL32UTF8对应的字符集ID如下所示:

 1SYS@lhrdb> SELECT NLS_CHARSET_NAME(TO_NUMBER('0001''XXXX')) US7ASCII,
2  2         NLS_CHARSET_NAME(TO_NUMBER('0354''XXXX')) ZHS16GBK,
3  3         NLS_CHARSET_NAME(TO_NUMBER('0369''XXXX')) AL32UTF8,
4  4         TO_CHAR(NLS_CHARSET_ID('US7ASCII'), 'XXXX') US7ASCII_ID,
5  5         TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'), 'XXXX') ZHS16GBK_ID,
6  6         TO_CHAR(NLS_CHARSET_ID('AL32UTF8'), 'XXXX') AL32UTF8_ID
7  7    FROM DUAL;
8US7ASCII      ZHS16GBK    AL32UTF8   US7ASCII_I ZHS16GBK_I AL32UTF8_I
9------------- ----------- ---------  ---------- ---------- ----------
10US7ASCII      ZHS16GBK    AL32UTF8            1        354        369


dmp文件在Windows平台下,则可以使用软件UltraEditUE)、EditPlusPilotedit等文本编辑工具以十六进制的方式打开dmp文件查看。其中,软件Pilotedit可以轻松打开上G的文件。示例如下:

需要注意的是,十六进制在LinuxWindows下顺序不同。

如果将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中,那么还需要根据文件修改第4行的第3-4个字节(即07 D0之前的2个字节)。

修改前:

修改后:

其实,也可以把第一行的第2-3字节,第4行的第1-4字节(即07 D0之前的4个字节)全部修改掉,也可以成功导入,如下所示:

& 说明:

US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2138791/



本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗



---------------优质麦课------------

详细内容可以添加麦老师微信或QQ私聊。



About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

DBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。


最后修改时间:2020-06-12 12:40:15
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论