场景
在给定的dmp下,使用impdp导入时,报了一个错,大致就是说schema在dmp中不存在(使用impdp导入时指定了schemas=XXX,XXX,XXX)。当时懒得去生产数据库查看是不是有该schema,于是想直接在dmp中查看包含的schema。
exp还是expdp
首先需要确定dmp文件exp导出的还是expdp导出的。一般情况下该问题是不会出现的。但是遇到过一次给了个19年的dmp文件,我是新接手这块工作,对于当初的数据库版本和使用的导出方式没人能够确定,因此找个方法去确认dmp的导出方式。
exp导出的dmp
# head -n 5 uprrfxq_20190614.dmp
TEXPORT:V10.02.01
DSYSTEM
RENTIRE
4096
0
#
如果是exp导出的文件,第一行会有“EXPORT”等字样。
expdp导出的dmp
[oracle@qsrac4-test1 ~]$ head -n 5 bta60_2022-06-02-090811_01.dmp
Rק¼"⟭£¼d«%!¬¨T䄂 &"SYS"."SYS_EXPORT_FULL_01"x86_64/Linux 2.4
expdp导出的显示会有“SYS_EXPORT_FULL”等字样。
获取expdp导出的dmp的schema、表空间等信息
impdp '/ as sysdba' dumpfile=<your .dmp file> logfile=import_log.txt sqlfile=ddl_dump.txt
执行完成后会把DDL信息写入到指定文件中,通过该文件可以直接查找所需要的信息。
获取exp导出的dmp的schema、表空间等信息
对于该情况,并未找到专业的解决方法。使用的是直接导入,然后根据imp导入后的报错内容(提示XX表空间不存在)新建表空间或者新建用户。
如果有更好的解决方案,欢迎留言
知识拓展
解决该问题时发现的几个好用的命令
strings dumpfile.dmp | grep SCHEMA_LIST
直接在文件中搜索想要的关键字
sed -n '行号 p' filename # 打印指定行号的内容