天天看點

imp導入資料oracle,Oracle資料導入導出imp exp

Oracle資料導入導出imp/exp

功能:Oracle資料導入導出imp/exp就相當與oracle資料還原與備份。

大多情況都可以用Oracle資料導入導出完成資料的備份和還原(不會造成資料的丢失)。

Oracle有個好處,雖然你的電腦不是伺服器,但是你裝了oracle用戶端,并建立了連接配接

(通過net8 assistant中本地-->服務命名 添加正确的服務命名

其實你可以想成是用戶端與伺服器端修了條路,然後資料就可以被拉過來了)

這樣你可以把資料導出到本地,雖然可能伺服器離你很遠。

你同樣可以把dmp檔案從本地導入到遠處的資料庫伺服器中。

利用這個功能你可以建構倆個相同的資料庫,一個用來測試,一個用來正式使用。

執行環境:可以在SQLPLUS.EXE或者DOS(指令行)中執行,

DOS中可以執行時由于 在oracle 8i 中 安裝目錄\ora81\BIN被設定為全局路徑,

該目錄下有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中

expsystem/[email protected]=d:\daochu.dmp full=y

2 将資料庫中system使用者與sys使用者的表導出

expsystem/[email protected]=d:\daochu.dmp owner=(system,sys)

3 将資料庫中的表table1 、table2導出

expsystem/[email protected]=d:\daochu.dmp tables=(table1,table2)

4 将資料庫中的表table1中的字段filed1以"00"打頭的資料導出

expsystem/[email protected]=d:\daochu.dmp tables=(table1)query=\" where filed1 like '00%'\"

上面是常用的導出,對于壓縮我不太在意,用winzip把dmp檔案可以很好的壓縮。

不過在上面指令後面 加上 compress=y 就可以了

資料的導入

1 将D:\daochu.dmp 中的資料導入 TEST資料庫中。

impsystem/[email protected]=d:\daochu.dmp

上面可能有點問題,因為有的表已經存在,然後它就報錯,對該表就不進行導入。

在後面加上 ignore=y 就可以了。

2 将d:\daochu.dmp中的表table1 導入

impsystem/[email protected]=d:\daochu.dmp tables=(table1)

基本上上面的導入導出夠用了。不少情況我是将表徹底删除,然後導入。

注意:

你要有足夠的權限,權限不夠它會提示你。

資料庫時可以連上的。可以用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:\Work\Oracle_Data\backup>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

一.工具參數說明

exp指令

格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

執行個體: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)

或 TABLES=(T1: P1,T1: P2),如果 T1 是分區表USERID 必須是指令行中的第一個參數。

關鍵字 說明(預設)

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

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 将傳輸的表空間清單

imp指令

或者, 可以通過輸入 IMP 指令和各種自變量來控制“導入”按照不同參數。

要指定參數,您可以使用關鍵字:

格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)

執行個體: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N

或 TABLES=(T1: P1,T1: P2),如果 T1 是分區表

USERID 必須是指令行中的第一個參數。

關鍵字 說明(預設)

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

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 擁有可傳輸表空間集中資料的使用者

測試腳本

執行個體

ORACLE資料庫有兩類備份方法。第一類為實體備份,該方法實作資料庫的完整恢複,但資料庫必須運作在歸擋模式下(業務資料庫在非歸擋模式下運作),且需要極大的外部儲存設備,例如錄音帶庫;第二類備份方式為邏輯備份,業務資料庫采用此種方式,此方法不需要資料庫運作在歸擋模式下,不但備份簡單,而且可以不需要外部儲存設備。資料庫邏輯備份方法ORACLE資料庫的邏輯備份分為三種模式:表備份、使用者備份和完全備份。表模式備份某個使用者模式下指定的對象(表)。業務資料庫通常采用這種備份方式。若備份到本地檔案,使用如下指令:exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=exp_icdmain_csd_yyyymmdd.dmp

log=exp_icdmain_csd_yyyymmdd.log

tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo

若直接備份到錄音帶裝置,使用如下指令:exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=/dev/rmt0

log=exp_icdmain_csd_yyyymmdd.log

tables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo

注:在磁盤空間允許的情況下,應先備份到本地伺服器,然後再拷貝到錄音帶。出于速度方面的考慮,盡量不要直接備份到錄音帶裝置。使用者模式備份某個使用者模式下的所有對象。業務資料庫通常采用這種備份方式。若備份到本地檔案,使用如下指令:exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=exp_icdmain_yyyymmdd.dmp

log=exp_icdmain_yyyymmdd.log

若直接備份到錄音帶裝置,使用如下指令:exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0

file=/dev/rmt0

log=exp_icdmain_yyyymmdd.log

注:如果磁盤有空間,建議備份到磁盤,然後再拷貝到錄音帶。如果資料庫資料量較小,可采用這種辦法備份。完全模式備份完整的資料庫。業務資料庫不采用這種備份方式。備份指令為:exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0 full=y

file=exp_fulldb_yyyymmdd.dmp(錄音帶裝置則為/dev/rmt0)

log=exp_fulldb_yyyymmdd.log

對于資料庫備份,建議采用增量備份,即隻備份上一次備份以來更改的資料。增量備份指令:exp icdmain/icd rows=y indexes=n compress=n buffer=65536

feedback=100000 volsize=0 full=y inctype=incremental

file=exp_fulldb_yyyymmdd.dmp(錄音帶裝置則為/dev/rmt0)

log=exp_fulldb_yyyymmdd.log

注:關于增量備份必須滿足下列條件:1.

隻對完整資料庫備份有效,且第一次需要full=y參數,以後需要inctype=increment

al參數。2. 使用者必須有EXP_FULL_DATABASE的系統角色。3. 話務量較小時方可采用資料庫備份。4. 如果磁盤有空間,建議備份到磁盤,然後再備份到錄音帶。業務資料庫備份方法及周期用EXP進行備份前,先在SYS使用者下運作CATEXP.SQL檔案(如果以前已運作該檔案,則不要執行這個腳本)。沒有特殊說明,不允許在用戶端執行備份指令。

備份指令參照表模式下的備份指令。從磁盤檔案備份到錄音帶如果首先備份到本地磁盤檔案,則需要轉儲到錄音帶裝置上。1. 若需檢視主機上配置的錄音帶裝置,使用如下指令:lsdev -Cc tape

顯示的結果如下例所示:rmt0 Available 30-58-00-2,0 SCSI 4mm Tape Drive

rmt1 Defined30-58-00-0,0 SCSI 4mm Tape Drive

标明Available的裝置是可用的錄音帶裝置。2. 若需檢視錄音帶存儲的内容,使用如下指令:tar -tvf /dev/rmt0

顯示的結果如下例所示:-rw-r--r-- 300 400 8089600 Jan 11 14:33:57 2001 exp_icdmain_20010111.dmp

如果顯示類似如下内容,則表示該錄音帶存儲的備份資料是從資料庫直接備份到錄音帶上,而非從本地磁盤轉儲到錄音帶的備份檔案,是以作業系統無法識别。tar: 0511-193 An error occurred while reading from the media.

There is an input or output error.

或tar: 0511-169 A directory checksum error on media; -267331077 not equal to

2

5626.

3. 對于新錄音帶或無需保留現存資料的錄音帶,使用如下指令:tar -cvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

注:A. 該指令将無條件覆寫錄音帶上的現存資料。B. 檔案名不允許包含路徑資訊,如:/backup/exp_icdmain_yyyymmdd.dmp。4. 對于需要保留現存資料的錄音帶,使用如下指令:tar -rvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

注:該指令将檔案exp_icdmain_yyyymmdd.dmp追加到錄音帶的末端,不會覆寫現存的資料。特别強調:如果備份時是從資料庫直接備份到錄音帶上,則不可再向該錄音帶上追加複制任何其他檔案,否則該備份資料失效。5. 若需将轉儲到錄音帶上的備份檔案複制到本地硬碟,使用如下指令:A. 将錄音帶上的全部檔案複制到本地硬碟的目前目錄tar -xvf /dev/rmt0

B. 将錄音帶上的指定檔案複制到本地硬碟的目前目錄tar -xvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp

備份時間安排由于備份時對系統I/O有較大影響,是以,建議在晚上11點以後進行備份工作。業務資料庫Oracle版本的恢複恢複方案需根據備份方案确定。由于業務資料庫采用表備份和使用者備份相結合的方案,是以業務資料庫的恢複需根據實際情況采用表恢複和使用者恢複相結合的方案。恢複方案資料庫的邏輯恢複分為表恢複、使用者恢複、完全恢複三種模式。表模式此方式将根據按照表模式備份的資料進行恢複。A. 恢複備份資料的全部内容若從本地檔案恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_cs

d_yyyymmdd.dmp

log=imp_icdmain_csd_yyyymmdd.log

若從錄音帶裝置恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_csd_yyyymmdd.log

B. 恢複備份資料中的指定表若從本地檔案恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_cs

d_yyyymmdd.dmp

log=imp_icdmain_csd_yyyymmdd.log

tables=commoninformation,serviceinfo

若從錄音帶裝置恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=/dev/rmt0

log=imp_icdmain_csd_yyyymmdd.log

tables=commoninformation,serviceinfo

使用者模式此方式将根據按照使用者模式備份的資料進行恢複。A. 恢複備份資料的全部内容若從本地檔案恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_yy

yymmdd.dmp

log=imp_icdmain_yyyymmdd.log

若從錄音帶裝置恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

B. 恢複備份資料中的指定表若從本地檔案恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0

file=exp_icdmain_yy

yymmdd.dmp

log=imp_icdmain_yyyymmdd.log

tables=commoninformation,serviceinfo

若從錄音帶裝置恢複,使用如下指令:imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n

commit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

tables=commoninformation,serviceinfo

完全模式如果備份方式為完全模式,采用下列恢複方法:若從本地檔案恢複,使用如下指令:imp system/manager rows=y indexes=n commit=y buffer=65536

feedback=100000 ignore=y volsize=0 full=y

file=exp_icdmain_yyyymmdd.dmp

log=imp_icdmain_yyyymmdd.log

若從錄音帶裝置恢複,使用如下指令:imp system/manager rows=y indexes=n commit=y buffer=65536

feedback=100000 ignore=y volsize=0 full=y

file=/dev/rmt0

log=imp_icdmain_yyyymmdd.log

參數說明1. ignore參數Oracle在恢複資料的過程中,當恢複某個表時,該表已經存在,就要根據ignore參數的設定來決定如何操作。若ignore=y,Oracle不執行CREATE TABLE語句,直接将資料插入到表中,如果插入的記錄違背了限制條件,比如主鍵限制,則出錯的記錄不會插入,但合法的記錄會添加到表中。若ignore=n,Oracle不執行CREATE TABLE語句,同時也不會将資料插入到表中,而是忽略該表的錯誤,繼續恢複下一個表。2. indexes參數在恢複資料的過程中,若indexes=n,則表上的索引不會被恢複,但是主鍵對應的唯一索引将無條件恢複,這是為了保證資料的完整性。字元集轉換對于單位元組字元集(例如US7ASCII),恢複時,資料庫自動轉換為該會話的字元集(NLS_LANG參數);對于多位元組字元集(例如ZHS16CGB231280),恢複時,應盡量使字元集相同(避免轉換),如果要轉換,目标資料庫的字元集應是輸出資料庫字元集的超集。恢複方法業務資料庫采用表恢複方案。在用IMP進行恢複前,先在SYS

使用者下運作CATEXP.SQL檔案(如果以前已運作該檔案,則不要執行這個腳本),然後執行下列指令:IMP ICDMAIN/ICD FILE=檔案名 LOG=LOG檔案名ROWS=Y

COMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名注:要恢複的表名參照備份的表名。恢複是在原表基礎上累加資料。沒有特殊說明,不允許在用戶端執行恢複指令

将一個資料庫的某使用者的所有表導到另外資料庫的一個使用者下面的例子exp userid=system/manager owner=username1 file=expfile.dmp

imp userid=system/manager fromuser=username1 touser=username2 ignore=y file=expfile.dmp

不同版本資料庫的exp/imp問題

一般來說,從低版本導入到高版本問題不大,麻煩的是将高版本的資料導入到低版本中,在Oracle9i之前,不同版本Oracle之間的EXP/IMP可以通過下面的方法來解決:

1、在高版本資料庫上運作底版本的catexp.sql;2、使用低版本的EXP來導出高版本的資料;3、使用低版本的IMP将資料庫導入到底版本資料庫中;4、在高版本資料庫上重新運作高版本的catexp.sql腳本。但在9i中,上面的方法并不能解決問題。如果直接使用底版本EXP/IMP會出現如下錯誤:EXP-00008: ORACLE error %lu encountered

ORA-00904: invalid column name

這已經是一個公布的BUG,需要等到Oracle10.0才能解決,BUG号為2261722,你可以到METALINK上去檢視有關此BUG的詳細資訊。BUG歸BUG,我們的工作還是要做,在沒有Oracle的支援之前,我們就自己解決。在Oracle9i中執行下面的SQL重建exu81rls視圖即可。SQL>CREATE OR REPLACE view exu81rls

(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)

AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,

decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')

|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')

|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')

|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),

r.check_opt, r.enable_flag,

DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)

from user$ u, obj$ o, rls$ r

where u.user# = o.owner#

and r.obj# = o.obj#

and (uid = 0 or

uid = o.owner# or

exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')

) ;

SQL>grant select on sys.exu81rls to public;

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=458698