简答题 17.  可以从dmp文件获取哪些信息?
【正确答案】在开发中常常碰到,需要导入dmp文件到现有数据库。这里的dmp文件可能来自于其他系统,所以,一般情况下是不知道导出程序(exp)的版本、导出时间或者导出模式等信息的。那么如何从现有的dmp文件中获取到这些信息呢?下面作者将一一讲解。
   (1)获取基本信息:导出的版本、时间、导出的用户    下面的示例中,exp_ddl_lhr_02.dmp是生成的dmp文件:
   
   (2)获取dmp文件中的表信息下面的示例中,exp_ddl_lhr_02.dmp是生成的dmp文件:
   
   (3)解析dmp文件生成parfile文件下面的示例中,exp_ddl_lhr_03.dmp是生成的dmp文件:
   
   (4)如何查看dmp文件的字符集有两种办法可以查看dmp文件的字符集,第一种办法为imp导入命令查看,示例如下:
   
   如果NLS_LANG的值和当前数据库的字符集相同,那么将不显示“server uses”和“import server uses”行。如果没有显示“export client”行,那么说明当前dmp文件的字符集和当前的NLS_LANG环境变量的值相同。无论是使用exp还是imp工具都会显示当前的NLS_LANG环境变量的值(表现为“Export done”、“import done”)。
   第二种查看dmp文件字符集的办法是,以十六进制的方式打开dmp文件,然后查看第2和第3个字节。如下:
   
   然后在数据库中可以查到十六进制0369代表的字符集:
   
   以上结果说明dmp文件的字符集是UTF8。常用的US7ASCII、ZHS16GBK和AL32UTF8对应的字符集ID如下:
   
   若dmp文件在Windows平台下,则可以使用软件UltraEdit (UE)、EditPlus或Pilotedit等文本编辑工具以十六进制的方式打开dmp文件查看。其中,软件Pilotedit可以轻松打开GB以上大小的文件。示例如下:
   
   需要注意的是,十六进制在Linux和Windows下顺序不同。
   如果将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中,那么还需要根据文件修改第4行的第3~4个字节(即07 D0之前的2个字节),如下:
   修改前(字符集为US7ASCII):
   
   修改后:
   
   其实,也可以把第一行的第2和第3字节,第4行的第1~4字节(即07 DO之前的4个字节)全部修改掉,也可以成功导入,如下:
   
【答案解析】