100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 转-【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

时间:2024-06-13 06:24:52

相关推荐

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

原帖地址:/lihuarongaini/article/details/71512116

1.2前言部分

1.2.1导读和注意事项

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

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

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

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

④ dmp文件导入的一般步骤

⑤ imp工具的indexfile选项的作用

⑥ 软件UE、EditPlus、Pilotedit软件的使用

Tips:

① 本文在itpub(/26736162)、博客园(/lhrbest)和微信公众号(xiaomaimiaolhr)上有同步更新。

② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:/26736162/viewspace-1624453/。

③ 若网页文章代码格式有错乱,请下载pdf格式的文档来阅读。

④ 在本篇BLOG中,代码输出部分一般放在一行一列的表格中。

⑤ 本文适合于Oracle初中级人员阅读,Oracle大师请略过本文。

本文有错误或不完善的地方请大家多多指正,您的批评指正是我写作的最大动力。

1.3本文相关知识点

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

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

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

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

1.3.1.2获取dmp文件中的表信息

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

1.3.1.3 解析dmp文件生成parfile文件

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

1.3.1.4如何查看dmp文件的字符集

一、imp导入命令查看

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

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

二、十六进制的第2和第3个字节

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

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

以上结果说明dmp文件的字符集是UTF8。若dmp文件在Windows平台下,则可以使用软件UltraEdit(UE)、EditPlus或Pilotedit等文本编辑工具以十六进制的方式打开dmp文件查看。其中,软件Pilotedit可以轻松打开上G的文件。示例如下:

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

SELECT NLS_CHARSET_NAME(TO_NUMBER('0001','XXXX'))US7ASCII,

NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'))ZHS16GBK,

NLS_CHARSET_NAME(TO_NUMBER('0369','XXXX'))AL32UTF8,

TO_CHAR(NLS_CHARSET_ID('US7ASCII'),'XXXX')US7ASCII_ID,

TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'),'XXXX')ZHS16GBK_ID,

TO_CHAR(NLS_CHARSET_ID('AL32UTF8'),'XXXX')AL32UTF8_ID

FROM DUAL;

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

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

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

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

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

1.3.2.1imp示例:

由于格式比较混乱,直接运行会报错,建荣的书中给了一段代码来格式化:

这样运行起来就方便多了。

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

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

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

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

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

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

示例如下所示:

可以看到其中的创建表的SQL语句被注释掉了,这个可以用vi命令或者文本工具来处理,处理之后就可以直接使用了。

1.3.2.3impdp示例:

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

1.4本文简介

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

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

1.4.1本文实验环境介绍

1.5开始导入

1.5.1首先获取dmp文件的相关信息

网友给的dmp文件:

大约30M,解压后有282M左右:

可以得出以下结论:

1、dmp文件是由10.02.01的客户端导出的

2、基于HHRIS用户导出

3、该用户下有很多表

4、dmp文件的字符集是US7ASCII

1.5.2 找出dmp文件的DDL语句

主要查看是否有其它表空间导致不能导入的问题。

查找关键字tablespace,发现只有1个表空间HHRIS。

1.5.3数据库准备

可以成功导入,但是查询的时候,有中文乱码。

1.5.4解决乱码

使用UE或Pilotedit软件,以16进制的格式打开dmp文件,修改dmp文件的第4行的第1-4个字节。

修改前:

修改后:

其实,也有资料显示需要把第一行的第2和第3字节,第4行的第1-4字节全部修改掉,如下所示:

经过小麦苗的测试,发现这3个地方全部修改掉,也可以成功导入。

修改后保存文件,上传服务器,重新导入,导入后查询,发现中文已经可以正常显示了。

1.5.5还有一种不显示乱码的方式

还有一种不显示乱码的方式,那就是将US7ASCII字符集的dmp文件导入到US7ASCII字符集的数据库中。

导入后,在Windows上设置客户端环境变量NLS_LANG为AMERICAN_AMERICA.US7ASCII,然后重启PL/SQL DEVELOPER软件后就可以正常显示中文了。

本来想着,这样再采用GBK的字符集导出,然后导入GBK的数据库中,结果发现这种方法行不通,始终有乱码。其实,走到这一步,还可以将数据导出成文本格式的文件,然后将文本格式的文件再导入GBK字符集的数据库中仍然是可行的。

1.6本文总结

有种办法处理将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中的中文乱码问题。第一,修改dmp文件中代表字符集的字符。第二,导入US7ASCII字符集的库中,然后导出成文本格式,再导入到GBK的库中。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。