Oracle數據導入導出imp/exp命令

Oracle數據導入導出imp/exp就相當於oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件,imp命令可以把dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用。
 
執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行,
 DOS中可以執行時由於 在oracle 8i 中  安裝目錄ora81BIN被設置爲全局路徑,
 該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。
 oracle用java編寫,SQLPLUS.EXE、EXP.EXE、IMP.EXE這兩個文件有可能是被包裝後的類文件。
 SQLPLUS.EXE調用EXP.EXE、IMP.EXE所包裹的類,完成導入導出功能。
 
下面介紹的是導入導出的實例。
數據導出:
 1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:daochu.dmp中
   exp system/manager@TEST file=d:daochu.dmp full=y
 2 將數據庫中system用戶與sys用戶的表導出
   exp system/manager@TEST file=d:daochu.dmp ōwner=(system,sys)
 3 將數據庫中的表inner_notify、notify_staff_relat導出
    exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)

 4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
   exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"
 
 上面是常用的導出,對於壓縮,既用winzip把dmp文件可以很好的壓縮。
 也可以在上面命令後面 加上 compress=y 來實現。

關鍵字   說明(默認)
---------------------------------------------------
USERID   用戶名/口令
FULL   導出整個文件 (N)
BUFFER   數據緩衝區的大小
OWNER   所有者用戶名列表
FILE   輸出文件 (EXPDAT.DMP)
TABLES   表名列表
COMPRESS   導入一個範圍 (Y)
RECORDLENGTH  IO 記錄的長度
GRANTS   導出權限 (Y)
INCTYPE   增量導出類型
INDEXES   導出索引 (Y)
RECORD   跟蹤增量導出 (Y)
ROWS   導出數據行 (Y)
PARFILE   參數文件名
CONSTRAINTS  導出限制 (Y)
CONSISTENT   交叉表一致性
LOG   屏幕輸出的日誌文件
STATISTICS   分析對象 (ESTIMATE)
DIRECT   直接路徑 (N)
TRIGGERS   導出觸發器 (Y)
FEEDBACK   顯示每 x 行 (0) 的進度
FILESIZE   各轉儲文件的最大尺寸
QUERY   選定導出表子集的子句

下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE  導出可傳輸的表空間元數據 (N)
TABLESPACES  將傳輸的表空間列表
數據的導入
 1 將D:daochu.dmp 中的數據導入 TEST數據庫中。
   imp system/manager@TEST  file=d:daochu.dmp
   imp aichannel/aichannel@HUST full=y  file=file= d:datanewsmgnt.dmp ignore=y
   上面可能有點問題,因爲有的表已經存在,然後它就報錯,對該表就不進行導入。
   在後面加上 ignore=y 就可以了。
 2 將d:daochu.dmp中的表table1 導入
 imp system/manager@TEST  file=d:daochu.dmp  tables=(table1)
 
 基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然後導入。
 
關鍵字   說明(默認)  
----------------------------------------------
USERID   用戶名/口令
FULL   導入整個文件 (N)
BUFFER   數據緩衝區大小
FROMUSER   所有人用戶名列表
FILE   輸入文件 (EXPDAT.DMP)
TOUSER   用戶名列表
SHOW   只列出文件內容 (N)
TABLES   表名列表
IGNORE   忽略創建錯誤 (N)
RECORDLENGTH  IO 記錄的長度
GRANTS   導入權限 (Y)
INCTYPE   增量導入類型
INDEXES   導入索引 (Y)
COMMIT   提交數組插入 (N)
ROWS   導入數據行 (Y)
PARFILE   參數文件名
LOG   屏幕輸出的日誌文件
CONSTRAINTS  導入限制 (Y)
DESTROY   覆蓋表空間數據文件 (N)
INDEXFILE   將表/索引信息寫入指定的文件
SKIP_UNUSABLE_INDEXES  跳過不可用索引的維護 (N)
ANALYZE   執行轉儲文件中的 ANALYZE 語句 (Y)
FEEDBACK   顯示每 x 行 (0) 的進度
TOID_NOVALIDATE  跳過指定類型 id 的校驗
FILESIZE   各轉儲文件的最大尺寸
RECALCULATE_STATISTICS 重新計算統計值 (N)

下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE  導入可傳輸的表空間元數據 (N)
TABLESPACES  將要傳輸到數據庫的表空間
DATAFILES   將要傳輸到數據庫的數據文件
TTS_OWNERS   擁有可傳輸表空間集中數據的用戶


注意:
 操作者要有足夠的權限,權限不夠它會提示。
 數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。
附錄一:
 給用戶增加導入數據權限的操作
 第一,啓動sql*puls
 第二,以system/manager登陸
 第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經創建過用戶,這步可以省略)
 第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
   DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
      DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用戶名字
 第五, 運行-cmd-進入dmp文件所在的目錄,
      imp userid=system/manager full=y file=*.dmp
      或者 imp userid=system/manager full=y file=filename.dmp
 執行示例:
 F:WorkOracle_Databackup>imp userid=test/test full=y file=inner_notify.dmp
屏幕顯示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation.  All rights reserved.
連接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
經由常規路徑導出由EXPORT:V08.01.07創建的文件
已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入
導出服務器使用UTF8 NCHAR 字符集 (可能的ncharset轉換)
. 正在將AICHANNEL的對象導入到 AICHANNEL
. . 正在導入表                  "INNER_NOTIFY"          4行被導入
準備啓用約束條件...
成功終止導入,但出現警告。

附錄二:
 Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達到這一目的.
  先建立import9.par,
  然後,使用時命令如下:imp parfile=/filepath/import9.par
  例 import9.par 內容如下:
        FROMUSER=TGPMS       
        TOUSER=TGPMS2     (注:把表的擁有者由FROMUSER改爲TOUSER,FROMUSER和TOUSER的用戶可以不同)          
        ROWS=Y
        INDEXES=Y
        GRANTS=Y
        CONSTRAINTS=Y
        BUFFER=409600
        file==/backup/ctgpc_20030623.dmp
        log==/backup/import_20030623.log
*************************************************************************
1. 它是操作系統下一個可執行的文件 存放目錄/ORACLE_HOME/bin

   exp導出工具將數據庫中數據備份壓縮成一個二進制系統文件.可以在不同OS間遷移
  
   它有三種模式:
       a.  用戶模式: 導出用戶所有對象以及對象中的數據;
       b.  表模式: 導出用戶所有表或者指定的表;
       c.  整個數據庫: 導出數據庫中所有對象。

2. 導出工具exp交互式命令行方式的使用的例子

$exp test/test123@appdb
Enter array fetch buffer size: 4096 > 回車
Export file: expdat.dmp > m.dmp  生成導出的文件名
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 3
Export table data (yes/no): yes > 回車
Compress extents (yes/no): yes > 回車
Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set
About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > cmamenu  要導出的表名
. . exporting table                        CMAMENU       4336 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >要導出的表名n
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > 回車
Export terminated successfully without warnings.

3. 導出工具exp非交互式命令行方式的例子

$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y

說明:把scott用戶裏兩個表emp,dept導出到文件/directory/scott.dmp

$exp scott/tiger tables=emp query=/"where job=/'salesman/' and sal/<1600/" file=/directory/scott2.dmp

說明:在exp裏面加上導出emp的查詢條件job='salesman' and sal<1600
   
    (但我個人很少這樣用,還是把滿足條件的記錄生成臨時表後,再exp會方便一些)

$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log

參數文件username.par內容
userid=username/userpassword
buffer=8192000
compress=n
grants=y

說明:username.par爲導出工具exp用的參數文件,裏面具體參數可以根據需要去修改

     filesize指定生成的二進制備份文件的最大字節數
    
     (可用來解決某些OS下2G物理文件的限制及加快壓縮速度和方便刻歷史數據光盤等)

二.導入工具 imp

1. 它是操作系統下一個可執行的文件 存放目錄/ORACLE_HOME/bin

imp導入工具將EXP形成的二進制系統文件導入到數據庫中.

   它有三種模式:
       a.  用戶模式: 導出用戶所有對象以及對象中的數據;
       b.  表模式: 導出用戶所有表或者指定的表;
       c.  整個數據庫: 導出數據庫中所有對象。
      
   只有擁有IMP_FULL_DATABASE和DBA權限的用戶才能做整個數據庫導入
  
   imp步驟:
   (1) create table  (2) insert data  (3) create index (4) create triggers,constraints

2.導入工具imp交互式命令行方式的例子
$ imp
Import: Release 8.1.6.0.0 - Production on 星期五 12月 7 17:01:08 2001
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
用戶名:  test
口令:****
連接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
導入文件: expdat.dmp> /tmp/m.dmp
輸入插入緩衝區大小(最小爲 8192 ) 30720>
經由常規路徑導出由EXPORT:V08.01.06創建的文件
警告: 此對象由 TEST 導出, 而不是當前用戶
已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入
只列出導入文件的內容(yes/no):no>
由於對象已存在, 忽略創建錯誤(yes/no):no> yes
導入權限(yes/no):yes>
導入表數據(yes/no):yes>
導入整個導出文件(yes/no):no> yes
. 正在將TEST的對象導入到 SCOTT
. . 正在導入表                       "CMAMENU"       4336行被導入
成功終止導入,但出現警告。


3.導入工具imp非交互式命令行方式的例子

$ imp system/manager fromuser=jones tables=(accts)
$ imp system/manager fromuser=scott tables=(emp,dept)
$ imp system/manager fromuser=scott touser=joe tables=emp
$ imp scott/tiger file = expdat.dmp full=y
$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log
$ imp system/manager parfile=params.dat
params.dat 內容
file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp)

4.導入工具imp可能出現的問題

(1) 數據庫對象已經存在
一般情況, 導入數據前應該徹底刪除目標數據下的表, 序列, 函數/過程,觸發器等; 
數據庫對象已經存在, 按缺省的imp參數, 則會導入失敗
如果用了參數ignore=y, 會把exp文件內的數據內容導入
如果表有唯一關鍵字的約束條件, 不合條件將不被導入
如果表沒有唯一關鍵字的約束條件, 將引起記錄重複

(2) 數據庫對象有主外鍵約束
      不符合主外鍵約束時, 數據會導入失敗
      解決辦法: 先導入主表, 再導入依存表
disable目標導入對象的主外鍵約束, 導入數據後, 再enable它們
(3)  權限不夠
如果要把A用戶的數據導入B用戶下, A用戶需要有imp_full_database權限

(4)  導入大表( 大於80M ) 時, 存儲分配失敗
      默認的EXP時, compress = Y, 也就是把所有的數據壓縮在一個數據塊上.
      導入時, 如果不存在連續一個大數據塊, 則會導入失敗.
      導出80M以上的大表時, 記得compress= N, 則不會引起這種錯誤.

(5) imp和exp使用的字符集不同
      如果字符集不同, 導入會失敗, 可以改變unix環境變量或者NT註冊表裏NLS_LANG相關信息.
      導入完成後再改回來.

(6) imp和exp版本不能往上兼容
imp可以成功導入低版本exp生成的文件, 不能導入高版本exp生成的文件
根據情況我們可以用
$ imp username/password@connect_string
說明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora
   定義的本地或者遠端數據庫的名稱
注意事項:
UNIX: /etc/hosts           要定義本地或者遠端數據庫服務器的主機名
win98:    windows/hosts             和IP地址的對應關係 

win2000:  winnt/system32/drivers/etc/hosts

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章