溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中

發(fā)布時(shí)間:2020-06-20 01:35:29 來(lái)源:網(wǎng)絡(luò) 閱讀:615 作者:小麥苗best 欄目:數(shù)據(jù)庫(kù)

exp/imp】US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中

 

1.1  BLOG文檔結(jié)構(gòu)圖

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

 

1.2  前言部分

1.2.1  導(dǎo)讀和注意事項(xiàng)

各位技術(shù)愛(ài)好者,看完本文后,你可以掌握如下的技能,也可以學(xué)到一些其它你所不知道的知識(shí),~O(∩_∩)O~

如何將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中(重點(diǎn),2種方法)?

從dmp文件可以獲取到哪些信息?如何從dmp文件獲取到dmp文件的字符集(重點(diǎn),N種方法)?

如何從dmp文件中獲取到其中的DDL語(yǔ)句,例如建表、建索引語(yǔ)句等(2種方法)

dmp文件導(dǎo)入的一般步驟

imp工具的indexfile選項(xiàng)的作用

軟件UE、EditPlus、Pilotedit軟件的使用

 


1.3  本文相關(guān)知識(shí)點(diǎn)

1.3.1  可以從dmp文件獲取哪些信息?

在開(kāi)發(fā)中常常碰到,需要導(dǎo)入dmp文件到現(xiàn)有數(shù)據(jù)庫(kù)。這里的dmp文件可能來(lái)自于其它系統(tǒng),所以,一般情況下是不知道導(dǎo)出程序(exp)的版本、導(dǎo)出時(shí)間或者導(dǎo)出模式等信息的。那么如何從現(xiàn)有的dmp文件中獲取到這些信息呢?下面作者將一一講解。

1.3.1.1  獲取基本信息:導(dǎo)出的版本、時(shí)間、導(dǎo)出的用戶(hù)

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

[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | head -10

TEXPORT:V11.02.00  ====版本號(hào) 

DSYS    ====使用SYS用戶(hù)導(dǎo)出

RTABLES ====基于表模式導(dǎo)出,RUSERS表示基于用戶(hù)模式,RENTIRE表示基于全庫(kù)模式

4096

Tue Aug 2 16:8:8 2016/tmp/exp_ddl_lhr_02.dmp====生成的時(shí)間和文件地址

#C#G

#C#G

+00:00

BYTE

UNUSED

 

 

1.3.1.2  獲取dmp文件中的表信息

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

[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | grep "CREATE TABLE"|awk '{print $3}'|sed 's/"http://g'

EMP ====說(shuō)明exp_ddl_lhr_02.dmp中只有一個(gè)emp

 

1.3.1.3  解析dmp文件生成parfile文件

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

[ZFZHLHRDB1:oracle]:/tmp>strings  exp_ddl_lhr_03.dmp | grep "CREATE TABLE"|awk '{print $3}'|sed 's/"http://g'|awk '{ if (FNR==1) print "tables="$1 ; else print ","$1 }'

tables=DEF$_AQCALL

,DEF$_AQERROR

,DEF$_CALLDEST

,DEF$_DEFAULTDEST

,DEF$_DESTINATION

,DEF$_ERROR

,DEF$_LOB

,DEF$_ORIGIN

,DEF$_PROPAGATOR

,DEF$_PUSHED_TRANSACTIONS

,MVIEW$_ADV_INDEX

[ZFZHLHRDB1:oracle]:/tmp>

 

  

 

1.3.2  如何獲取數(shù)據(jù)庫(kù)DDL的創(chuàng)建語(yǔ)句

數(shù)據(jù)泵工具(impdp)工具給我們提供了SQLFILE的命令行選項(xiàng),只獲取DDL語(yǔ)句,并未真正的執(zhí)行數(shù)據(jù)導(dǎo)入。另外,若單純?yōu)榱藢?dǎo)出DDL語(yǔ)句則可以在使用expdp導(dǎo)出的時(shí)候使用CONTENT=METADATA_ONLYEXCLUDE=STATISTICS選項(xiàng),這樣導(dǎo)出的DMP文件比較小。如下所示:

 

expdp \'/ AS SYSDBA\' DIRECTORY=DATA_PUMP_DIR DUMPFILE=lhrsql20161215.dmp LOGFILE=lhrsql20161215.log CONTENT=METADATA_ONLY SCHEMAS=SCOTT  EXCLUDE=STATISTICS

impdp  \'/ AS SYSDBA\'  DIRECTORY=DATA_PUMP_DIR DUMPFILE=lhrsql20161215.dmp  LOGFILE=imp_exptest.log SQLFILE=expddl_lhr.sql

 

查看expddl_lhr.sql文件即可獲取DDL語(yǔ)句。

imp工具使用SHOW=Y LOG=GET_DDL.sql的方式,可以看到清晰的DDL腳本,同時(shí)也不會(huì)真正的執(zhí)行數(shù)據(jù)導(dǎo)入。另外,若單純?yōu)榱藢?dǎo)出DDL語(yǔ)句則可以在使用exp導(dǎo)出的時(shí)候使用ROWS=N選項(xiàng),這樣導(dǎo)出的DMP文件比較小。如下所示:

exp  \'/ AS SYSDBA\'  TABLES=SCOTT.EMP  FILE=/tmp/exp_ddl_lhr_01.dmp  LOG=/tmp/exp_table.log  BUFFER=41943040 ROWS=N COMPRESS=N

imp \'/ AS SYSDBA\' FILE=/tmp/exp_ddl_lhr_01.dmp SHOW=Y LOG=/tmp/get_ddl.sql BUFFER=20480000  FULL=Y

 

 

查看get_ddl.sql文件即可獲取DDL語(yǔ)句。

 

---- 生成DDL語(yǔ)句不會(huì)導(dǎo)入數(shù)據(jù)

--expdp \'/ AS SYSDBA\' tables=lhr.exptest  directory=DATA_PUMP_DIR  dumpfile=exptest.dmp logfile=exp_exptest.dmp  EXCLUDE=STATISTICS

--expdp \'/ AS SYSDBA\' directory=DATA_PUMP_DIR dumpfile=lhrsql20161215.dmp logfile=lhrsql20161215.log content=metadata_only schemas=SCOTT  EXCLUDE=STATISTICS

impdp  \'/ AS SYSDBA\'  directory=DATA_PUMP_DIR dumpfile=lhrsql20161215.dmp  logfile=imp_exptest.log sqlfile=exptest.sql

 

exp  \'/ AS SYSDBA\'  tables=scott.emp  file=/tmp/exp_ddl_lhr_01.dmp  log=/tmp/exp_table.log  buffer=41943040 rows=n compress=n

imp \'/ AS SYSDBA\' file=/tmp/exp_ddl_lhr_01.dmp show=y log=/tmp/get_ddl.sql buffer=20480000  full=y

 


。

1.3.2.2  imp的indexfile選項(xiàng)(indexfile導(dǎo)出表和索引的ddl語(yǔ)句)

 

exp和imp工具中可能存在把table從一個(gè)庫(kù)exp然后imp到另一個(gè)數(shù)據(jù)庫(kù)出現(xiàn)沒(méi)有指定tablespace而無(wú)法impimpindexfile參數(shù)中可以解決的。

Oracle的imp工具指定indexfile參數(shù)后,可以不導(dǎo)入任何對(duì)象,而只把需要?jiǎng)?chuàng)建的indexsql語(yǔ)句的形式寫(xiě)入文本文件。創(chuàng)建庫(kù)表等sql語(yǔ)句也會(huì)寫(xiě)入,但用rem注釋屏蔽。

一、查看并修改導(dǎo)入對(duì)象的存儲(chǔ)參數(shù)

如果原始庫(kù)中有些表比較大,exp導(dǎo)出對(duì)象的初始存儲(chǔ)空間設(shè)置可能比較高,導(dǎo)入時(shí)需要先申請(qǐng)分配較大的存儲(chǔ)空間,如果只進(jìn)行邏輯結(jié)構(gòu)的遷移耗時(shí)較長(zhǎng)。這時(shí)可以用indexfile參數(shù)導(dǎo)出sql語(yǔ)句,篩選出初始空間較高的建表語(yǔ)句,手工創(chuàng)建。再次導(dǎo)入時(shí)使用ignore選項(xiàng)忽略對(duì)象創(chuàng)建錯(cuò)誤。

如何解析inexfile文件:可以考慮用sed編輯器進(jìn)行正則表達(dá)式替換,也可以寫(xiě)個(gè)程序解析出initial超出一定閾值的庫(kù)表及其sql。


 

1.3.2.3  impdp示例:

--expdp \'/ AS SYSDBA\' directory=DATA_PUMP_DIR schemas=SCOTT  dumpfile=exptest_sql.dmp logfile=exp_exptest.dmp

impdp  \'/ AS SYSDBA\'  directory=DATA_PUMP_DIR dumpfile=exptest_sql.dmp  logfile=imp_exptest.log sqlfile=exptest.sql

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

 

1.4  本文簡(jiǎn)介

一個(gè)網(wǎng)友找到我說(shuō),一個(gè)dmp文件導(dǎo)入數(shù)據(jù)庫(kù)中,中文一直是亂碼,看我能否幫忙解決一下。說(shuō)真心話(huà),一般情況下,亂碼問(wèn)題和安裝問(wèn)題,我一般不想接手,因?yàn)榭赡芎芎?jiǎn)單的問(wèn)題,有的人懶的動(dòng)腦,碰到問(wèn)題就問(wèn)。尤其對(duì)于安裝類(lèi)問(wèn)題,照著安裝文檔,一步一步來(lái),一般都沒(méi)有問(wèn)題。在這里把一張網(wǎng)友分享的圖片再分享一下:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中

可是,問(wèn)字符集的的哥們,我能感覺(jué)到他自己是下了功夫的,都是自己摸索了,實(shí)在解決不了,才找到的我。這種情況下,我果斷是要幫助的。好了,廢話(huà)不多說(shuō)了,且看整個(gè)處理過(guò)程吧。

1.4.1  本文實(shí)驗(yàn)環(huán)境介紹

項(xiàng)目

source db

target db

db 類(lèi)型

 

 

db version

10.2.0.1.0

10.2.0.1.0

db 存儲(chǔ)

 

 

OS版本及kernel版本

 

 

字符集

US7ASCII

GBK

dmp文件字符集

US7ASCII

US7ASCII

1.5  開(kāi)始導(dǎo)入

1.5.1  首先獲取dmp文件的相關(guān)信息

網(wǎng)友給的dmp文件:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

大約30M,解壓后有282M左右:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

[oracle@rhel6lhr ~]$ strings /tmp/hhris.dmp | head -10                   

EXPORT:V10.02.01

DHHRIS

RUSERS

8192

                                       Wed Oct 16 5:0:14 2013/data/dbbackup/expdata/hhris.dmp

#G#G

#G#G

+08:00

BYTE

UNUSED

[oracle@rhel6lhr ~]$ strings /tmp/hhris.dmp  | grep "CREATE TABLE"|awk '{print $3}'|sed 's/"http://g'

ADDTOHIS

APPOINT

APPOINTDETAIL

APPOINTMASTER

BACKUP_HISPPOINT

WEB_LOG

WEB_USER

WORK_FLOW

WORK_NODE

[oracle@rhel6lhr ~]$

[oracle@rhel6lhr ~]$ cat /tmp/hhris.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 1-2,7-8

0001

SYS@ora10g> SELECT NLS_CHARSET_NAME(TO_NUMBER('0001','XXXX')) FROM DUAL;

 

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

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

US7ASCII

 

 

 

可以得出以下結(jié)論:

1、dmp文件是由10.02.01的客戶(hù)端導(dǎo)出的

2、基于HHRIS用戶(hù)導(dǎo)出

3、該用戶(hù)下有很多表

4、dmp文件的字符集是US7ASCII

1.5.2  找出dmp文件的DDL語(yǔ)句

主要查看是否有其它表空間導(dǎo)致不能導(dǎo)入的問(wèn)題。

[oracle@rhel6lhr env_oracle]$ imp \'/ AS SYSDBA\' file=/tmp/hhris.dmp show=y log=/tmp/get_ddl.sql buffer=20480000  full=y

 

Import: Release 10.2.0.1.0 - Production on Tue May 9 14:06:22 2017

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

 

Export file created by EXPORT:V10.02.01 via direct path

 

Warning: the objects were exported by HHRIS, not by you

 

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set

export client uses US7ASCII character set (possible charset conversion)

. importing HHRIS's objects into SYS

"BEGIN  "

"sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"

《《《《。。。。。。。。篇幅原因,有省略。。。。。。。?!贰贰贰?/span>

 

[oracle@rhel6lhr env_oracle]$ sh gettabdd.sh /tmp/get_ddl.sql > /tmp/gen_tabddl.sql

[oracle@rhel6lhr env_oracle]$ more  /tmp/gen_tabddl.sql

BEGIN 

sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'ORACLE', inst_scn=>'59161085');

COMMIT; END;

/

CREATE SEQUENCE "MICROSOFTSEQDTPROPERTIES" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 50 NOORDER NOCYCLE

/

CREATE SEQUENCE "R_REPORTLOG_LOGID" MINVALUE 1 MAXVALUE 100000 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER CYCLE

/

。。。。。。。。。。。。。

《《《《。。。。。。。。篇幅原因,有省略。。。。。。。?!贰贰贰?/span>

 

 

 

查找關(guān)鍵字tablespace,發(fā)現(xiàn)只有1個(gè)表空間HHRIS。

1.5.3  數(shù)據(jù)庫(kù)準(zhǔn)備

dbca -silent -createDatabase -templateName General_Purpose.dbc -responseFile NO_VALUE \

-gdbname lhrdb  -sid lhrdb \

-sysPassword lhr -systemPassword lhr \

-datafileDestination '/cds/oradata' -recoveryAreaDestination '/cds/oradata' \

-storageType FS \

-characterset ZHS16GBK -nationalCharacterSet AL16UTF16 \

-sampleSchema false \

-memoryPercentage 20 \

-databaseType OLTP  \

-emConfiguration NONE

ORACLE_SID=lhrdb

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

sqlplus / as sysdba

CREATE TABLESPACE HHRIS DATAFILE '/cds/oradata/mydg/HHRIS01.dbf' size 1G;

create user hhris identified by lhr;

grant dba to hhris;

exit

imp  hhris/lhr   file=/tmp/hhris.dmp full=Y log=/tmp/log_imp_hhrisgbk.dmp

 

 

[oracle@rhel6lhr mydg]$ imp  hhris/lhr   file=/tmp/hhris.dmp full=Y log=/tmp/log_imp_hhrisgbk.dmp

 

Import: Release 10.2.0.1.0 - Production on Tue May 9 14:17:55 2017

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

 

Export file created by EXPORT:V10.02.01 via direct path

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set

export client uses US7ASCII character set (possible charset conversion)

. importing HHRIS's objects into HHRIS

. . importing table                     "ADDTOHIS"          0 rows imported

. . importing table                      "APPOINT"          0 rows imported

. . importing table                "APPOINTDETAIL"          0 rows imported

. . importing table                "APPOINTMASTER"          0 rows imported

《《《《。。。。。。。。篇幅原因,有省略。。。。。。。?!贰贰贰?/span>

 

Import terminated successfully with warnings.

[oracle@rhel6lhr mydg]$

[oracle@rhel6lhr mydg]$

 

 

可以成功導(dǎo)入,但是查詢(xún)的時(shí)候,有中文亂碼。

1.5.4  解決亂碼

使用UE或Pilotedit軟件,以16進(jìn)制的格式打開(kāi)dmp文件,修改dmp文件的第4行的第1-4個(gè)字節(jié)。

修改前:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

修改后:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

 

其實(shí),也有資料顯示需要把第一行的第2和第3字節(jié),第4行的第1-4字節(jié)全部修改掉,如下所示:

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

經(jīng)過(guò)小麥苗的測(cè)試,發(fā)現(xiàn)這3個(gè)地方全部修改掉,也可以成功導(dǎo)入。

 

修改后保存文件,上傳服務(wù)器,重新導(dǎo)入,導(dǎo)入后查詢(xún),發(fā)現(xiàn)中文已經(jīng)可以正常顯示了。

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中 

1.5.5  還有一種不顯示亂碼的方式

還有一種不顯示亂碼的方式,那就是US7ASCII字符集的dmp文件導(dǎo)入到US7ASCII字符集的數(shù)據(jù)庫(kù)中

dbca -silent -createDatabase -templateName General_Purpose.dbc -responseFile NO_VALUE \

-gdbname lhrdb  -sid lhrdb \

-sysPassword lhr -systemPassword lhr \

-datafileDestination '/cds/oradata' -recoveryAreaDestination '/cds/oradata' \

-storageType FS \

-characterset US7ASCII -nationalCharacterSet AL16UTF16 \

-sampleSchema false \

-memoryPercentage 20 \

-databaseType OLTP  \

-emConfiguration NONE

 

 

export NLS_LANG=AMERICAN_AMERICA.US7ASCII

imp  hhris/lhr   file=/tmp/hhris.dmp full=Y log=/tmp/log_imp_hhrisgbk.dmp

 

導(dǎo)入后,在Windows上設(shè)置客戶(hù)端環(huán)境變量NLS_LANGAMERICAN_AMERICA.US7ASCII,然后重啟PL/SQL DEVELOPER軟件后就可以正常顯示中文了。

本來(lái)想著,這樣再采用GBK的字符集導(dǎo)出,然后導(dǎo)入GBK的數(shù)據(jù)庫(kù)中,結(jié)果發(fā)現(xiàn)這種方法行不通,始終有亂碼。其實(shí),走到這一步,還可以將數(shù)據(jù)導(dǎo)出成文本格式的文件,然后將文本格式的文件再導(dǎo)入GBK字符集的數(shù)據(jù)庫(kù)中仍然是可行的。

1.6  本文總結(jié)

有種辦法處理將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中的中文亂碼問(wèn)題。第一,修改dmp文件中代表字符集的字符。第二,導(dǎo)入US7ASCII字符集的庫(kù)中,然后導(dǎo)出成文本格式,再導(dǎo)入到GBK的庫(kù)中。




About Me

...............................................................................................................................

● 本文作者:小麥苗,只專(zhuān)注于數(shù)據(jù)庫(kù)的技術(shù),更注重技術(shù)的運(yùn)用

● 本文在itpub(http://blog.itpub.net/26736162)、博客園(http://www.cnblogs.com/lhrbest)和個(gè)人微信公眾號(hào)(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗云盤(pán)地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 數(shù)據(jù)庫(kù)筆試面試題庫(kù)及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯(lián)系我請(qǐng)加QQ好友(646634621),注明添加緣由

● 于 2017-05-09 09:00 ~ 2017-05-30 22:00 在魔都完成

● 文章內(nèi)容來(lái)源于小麥苗的學(xué)習(xí)筆記,部分整理自網(wǎng)絡(luò),若有侵權(quán)或不當(dāng)之處還請(qǐng)諒解

● 版權(quán)所有,歡迎分享本文,轉(zhuǎn)載請(qǐng)保留出處

...............................................................................................................................

拿起手機(jī)使用微信客戶(hù)端掃描下邊的左邊圖片來(lái)關(guān)注小麥苗的微信公眾號(hào):xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學(xué)習(xí)最實(shí)用的數(shù)據(jù)庫(kù)技術(shù)。

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中

【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中cdn.qqmail.com/zh_CN/htmledition/p_w_picpaths/function/qm_open/ico_mailme_02.png">
【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中
【exp/imp】將US7ASCII字符集的dmp文件導(dǎo)入到ZHS16GBK字符集的數(shù)據(jù)庫(kù)中

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI