程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle的imp命令導入備份數據

Oracle的imp命令導入備份數據

編輯:Oracle數據庫基礎

筆者在做項目過程中遇到以下問題,在客戶提供的數據庫備份文件需要導入到數據庫中,以便使用,數據庫為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 2007

(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文件中備份的數據庫表已經存在,則導入過程會失敗,只能先將已經存在的表刪除,在進行導入。

http://tb.blog.csdn.Net/TrackBack.ASPx?PostId=1490297

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved