您好,登錄后才能下訂單哦!
【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文件可能來自于其它系統,所以,一般情況下是不知道導出程序(exp)的版本、導出時間或者導出模式等信息的。那么如何從現有的dmp文件中獲取到這些信息呢?下面作者將一一講解。
下面的示例中exp_ddl_lhr_02.dmp是生成的dmp文件:
[ZFZHLHRDB1:oracle]:/tmp>strings exp_ddl_lhr_02.dmp | head -10 TEXPORT:V11.02.00 ====》版本號 DSYS ====》使用SYS用戶導出 RTABLES ====》基于表模式導出,RUSERS表示基于用戶模式,RENTIRE表示基于全庫模式 4096 Tue Aug 2 16:8:8 2016/tmp/exp_ddl_lhr_02.dmp====》生成的時間和文件地址 #C#G #C#G +00:00 BYTE UNUSED
|
下面的示例中,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 ====》說明exp_ddl_lhr_02.dmp中只有一個emp表 |
下面的示例中,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>
|
數據泵工具(impdp)工具給我們提供了SQLFILE的命令行選項,只獲取DDL語句,并未真正的執行數據導入。另外,若單純為了導出DDL語句則可以在使用expdp導出的時候使用CONTENT=METADATA_ONLY和EXCLUDE=STATISTICS選項,這樣導出的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語句。
imp工具使用SHOW=Y LOG=GET_DDL.sql的方式,可以看到清晰的DDL腳本,同時也不會真正的執行數據導入。另外,若單純為了導出DDL語句則可以在使用exp導出的時候使用ROWS=N選項,這樣導出的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語句。
---- 生成DDL語句不會導入數據 --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
|
。
exp和imp工具中可能存在把table從一個庫exp然后imp到另一個數據庫出現沒有指定tablespace而無法imp,imp的indexfile參數中可以解決的。
Oracle的imp工具指定indexfile參數后,可以不導入任何對象,而只把需要創建的index以sql語句的形式寫入文本文件。創建庫表等sql語句也會寫入,但用rem注釋屏蔽。
一、查看并修改導入對象的存儲參數
如果原始庫中有些表比較大,exp導出對象的初始存儲空間設置可能比較高,導入時需要先申請分配較大的存儲空間,如果只進行邏輯結構的遷移耗時較長。這時可以用indexfile參數導出sql語句,篩選出初始空間較高的建表語句,手工創建。再次導入時使用ignore選項忽略對象創建錯誤。
如何解析inexfile文件:可以考慮用sed編輯器進行正則表達式替換,也可以寫個程序解析出initial超出一定閾值的庫表及其sql。
--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 ------------------------------------------------------------------------- |
一個網友找到我說,一個dmp文件導入數據庫中,中文一直是亂碼,看我能否幫忙解決一下。說真心話,一般情況下,亂碼問題和安裝問題,我一般不想接手,因為可能很簡單的問題,有的人懶的動腦,碰到問題就問。尤其對于安裝類問題,照著安裝文檔,一步一步來,一般都沒有問題。在這里把一張網友分享的圖片再分享一下:
可是,問字符集的的哥們,我能感覺到他自己是下了功夫的,都是自己摸索了,實在解決不了,才找到的我。這種情況下,我果斷是要幫助的。好了,廢話不多說了,且看整個處理過程吧。
項目 | source db | target db |
db 類型 |
|
|
db version | 10.2.0.1.0 | 10.2.0.1.0 |
db 存儲 |
|
|
OS版本及kernel版本 |
|
|
字符集 | US7ASCII | GBK |
dmp文件字符集 | US7ASCII | US7ASCII |
網友給的dmp文件:
大約30M,解壓后有282M左右:
[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
|
可以得出以下結論:
1、dmp文件是由10.02.01的客戶端導出的
2、基于HHRIS用戶導出
3、該用戶下有很多表
4、dmp文件的字符集是US7ASCII
主要查看是否有其它表空間導致不能導入的問題。
[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','" 《《《《。。。。。。。。篇幅原因,有省略。。。。。。。。》》》》
[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 / 。。。。。。。。。。。。。 《《《《。。。。。。。。篇幅原因,有省略。。。。。。。。》》》》
|
查找關鍵字tablespace,發現只有1個表空間HHRIS。
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 《《《《。。。。。。。。篇幅原因,有省略。。。。。。。。》》》》
Import terminated successfully with warnings. [oracle@rhel6lhr mydg]$ [oracle@rhel6lhr mydg]$
|
可以成功導入,但是查詢的時候,有中文亂碼。
使用UE或Pilotedit軟件,以16進制的格式打開dmp文件,修改dmp文件的第4行的第1-4個字節。
修改前:
修改后:
其實,也有資料顯示需要把第一行的第2和第3字節,第4行的第1-4字節全部修改掉,如下所示:
經過小麥苗的測試,發現這3個地方全部修改掉,也可以成功導入。
修改后保存文件,上傳服務器,重新導入,導入后查詢,發現中文已經可以正常顯示了。
還有一種不顯示亂碼的方式,那就是將US7ASCII字符集的dmp文件導入到US7ASCII字符集的數據庫中。
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 |
導入后,在Windows上設置客戶端環境變量NLS_LANG為AMERICAN_AMERICA.US7ASCII,然后重啟PL/SQL DEVELOPER軟件后就可以正常顯示中文了。
本來想著,這樣再采用GBK的字符集導出,然后導入GBK的數據庫中,結果發現這種方法行不通,始終有亂碼。其實,走到這一步,還可以將數據導出成文本格式的文件,然后將文本格式的文件再導入GBK字符集的數據庫中仍然是可行的。
有種辦法處理將US7ASCII字符集的dmp文件導入到ZHS16GBK字符集的數據庫中的中文亂碼問題。第一,修改dmp文件中代表字符集的字符。第二,導入US7ASCII字符集的庫中,然后導出成文本格式,再導入到GBK的庫中。
About Me
...............................................................................................................................
● 本文作者:小麥苗,只專注于數據庫的技術,更注重技術的運用
● 本文在itpub(http://blog.itpub.net/26736162)、博客園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客園地址:http://www.cnblogs.com/lhrbest
● 本文pdf版及小麥苗云盤地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 數據庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● QQ群:230161599 微信群:私聊
● 聯系我請加QQ好友(646634621),注明添加緣由
● 于 2017-05-09 09:00 ~ 2017-05-30 22:00 在魔都完成
● 文章內容來源于小麥苗的學習筆記,部分整理自網絡,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
...............................................................................................................................
拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的數據庫技術。
cdn.qqmail.com/zh_CN/htmledition/p_w_picpaths/function/qm_open/ico_mailme_02.png">
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。