肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > Oracle的imp命令导入备份数据

Oracle的imp命令导入备份数据

时间:2020-03-22 18:33:02

相关推荐

笔者在做项目过程中遇到以下问题,在客户提供的数据库备份文件需要导入到数据库中,以便使用,数据库为oracle 9.1.1,安装在windows server 2000 jp系统中,服务器端字符集

为japanese_japan_utf8,而客户端使用的是中文windows server 2000系统,字符集为simplified chinese_china.zhs16gbk。

在插入数据过程中出现如下问题:

c:\oracle\ora90\bin>imp scott/tiger@sdes full=y file=c:\expdat.dmp

import: release 9.0.1.1.1 - production on 星期一 1月 22 19:05:43

(c) copyright 2001 oracle corporation. all rights reserved.

连接到: oracle9i release 9.0.1.1.1 - production

jserver release 9.0.1.1.1 - production

imp-00016: 不支持要求的字符集转换(从类型830到852)

imp-00000: 未成功终止导入

使用2进制文件编辑工具,如uedit32。打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数nls_charset_name即可获得该字符集:

sql> select nls_charset_name(1) from dual;

nls_charset_name(1)

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

us7ascii

可以知道该dmp文件的字符集为us7ascii,如果需要把该dmp文件的字符集换成zhs16gbk,则需要用nls_charset_id获取该字符集的编号:

笔者遇到的问题为830到852类型转换错误,进入oracle的sqlplus,进行以下查询:

sql> select nls_charset_name(830) from dual;

nls_charset_na

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

ja16euc

sql> select nls_charset_name(852) from dual;

nls_charset_name

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

zhs16gbk

sql>

sql> select nls_charset_id("zhs16gbk") from dual;

nls_charset_id("zhs16gbk")

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

852

把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。

影响oracle数据库字符集最重要的参数是nls_lang参数。它的格式如下: nls_lang = language_territory.charset .它有三个组成部分(语言、地域和字符集),每个成分控制了nls子集的特性。

其中: language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:american _ america. zhs16gbk .

可以使用以下命令获取字符集名称:

sql> select userenv("language") from dual;

userenv("language")

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

simplified chinese_china.utf8

sql>

用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几m或几十m,可以用ultraedit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下sql查出它对应的字符集:

sql> select nls_charset_name(to_number("0354","xxxx")) from dual;

nls_charset_name(to_number("0354","xxxx"))

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

zhs16gbk

sql>

03 03 3e 45 .....其中的033e就是字符集对应的值。

上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如us7ascii,we8iso8859p1,zhs16cgb231280,zhs16gbk基本都可以改。因为改的只是dmp文件,所以影响不大。

具体的修改方法比较多,最简单的就是直接用ultraedit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为zhs16gbk,可以用以下sql查出该种字符集对应的16进制代码:

sql> select to_char(nls_charset_id("zhs16gbk"), "xxxx") from dual;

0354

然后将dmp文件的2、3字节修改为0354即可。

另外,如果dmp文件中备份的数据库表已经存在,则导入过程会失败,只能先将已经存在的表删除,在进行导入。

如果觉得《Oracle的imp命令导入备份数据》对你有帮助,请点赞、收藏,并留下你的观点哦!

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