将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

0    124    1

Tags:

👉 本文共约3965个字,系统预计阅读时间或需15分钟。

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

前言部分

导读和注意事项

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

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

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

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

④ dmp文件导入的一般步骤

⑤ imp工具的indexfile选项的作用

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

本文相关知识点

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

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

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

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

获取dmp文件中的表信息

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

解析dmp文件生成parfile文件

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

如何查看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个字节。如下所示:

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

如何获取数据库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语句。

imp示例:

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

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

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命令或者文本工具来处理,处理之后就可以直接使用了。

impdp示例:

本文简介

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

本文实验环境介绍

项目source dbtarget db
db 类型
db version10.2.0.1.010.2.0.1.0
db 存储
OS版本及kernel版本
字符集US7ASCIIGBK
dmp文件字符集US7ASCIIUS7ASCII

开始导入

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

网友给的dmp文件:

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

可以得出以下结论:

  1. dmp文件是由10.02.01的客户端导出的
  2. 基于HHRIS用户导出
  3. 该用户下有很多表
  4. dmp文件的字符集是US7ASCII

找出dmp文件的DDL语句

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

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

数据库准备

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

解决乱码

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

修改前:

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

修改后:

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

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

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

将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

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

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

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

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

本文总结

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

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

1 × 4 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部