A. Oracle數據導入導出imp/exp命令 10g以上expdp/impdp命令 詳細的 詳細的 謝謝
這個網路上一搜一大把,都說的很詳細,樓主沒搜過,
數據導出:
1 將資料庫TEST完全導出,用戶名system 密碼manager 導出到D:chu.dmp中
exp system/manager@TEST file=d:chu.dmp full=y
2 將資料庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:chu.dmp owner=(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:chu.dmp tables=(table1) query=" where filed1 like '00%'"
上面是常用的導出,對於壓縮,既用winzip把dmp文件可以很好的壓縮。
也可以在上面命令後面 加上 compress=y 來實現。
數據的導入
1 將D:chu.dmp 中的數據導入 TEST資料庫中。
imp system/manager@TEST file=d:chu.dmp
imp aichannel/aichannel@HUST full=y file=d:datanewsmgnt.dmp ignore=y
上面可能有點問題,因為有的表已經存在,然後它就報錯,對該表就不進行導入。
在後面加上 ignore=y 就可以了。
2 將d:chu.dmp中的表table1 導入
imp system/manager@TEST file=d:chu.dmp tables=(table1)
基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然後導入。
注意:
操作者要有足夠的許可權,許可權不夠它會提示。
資料庫時可以連上的。可以用tnsping TEST 來獲得資料庫TEST能否連上。
當然,上面的方法在導出數據時可能會導出很大的包,那是因為你的用戶可能在授權的時候授予了DBA的許可權,所以可以採用下面方法來進行資料庫備份:
資料庫備份
建議系統過渡後,每周進行一次備份。或者在數據表發生重大改變前,對要改變的數據表進行備份。
執行以下步驟,進行備份。
在命令行里,敲入「cmd」,回車,進入命令行窗口。
在窗口中,輸入:
exp mas/123456@mas
系統提示:輸入數組提取緩沖區大小: 4096 >
可以直接回車;
系統提示:導出文件: EXPDAT.DMP>
此處輸入導出文件的位置,其路徑必須存在,Oracle在這里不會自動建立路徑,但可以建立文件名。備份文件以dmp作為後綴。
輸入內容如:e:\work\mas_db_090925v1.dmp 回車
系統提示: (1)E(完整的資料庫),(2)U(用戶) 或 (3)T(表): (2)U > u
此處可以輸入u,也可以直接回車,因為系統此時默認的是U
系統提示:導出許可權(yes/no):yes>回車
系統提示:導出表數據(yes/no):yes>回車
系統提示:壓縮區(yes/no):yes>回車
系統提示:要導出的用戶: (RETURN 以退出) > mas
系統提示:要導出的用戶: (RETURN 以退出) > 回車
此時系統會自動進行備份
本文對Oracle數據的導入導出 imp ,exp 兩個命令進行了介紹, 並對其相應的參數進行了說明,然後通過一些示例進行演練,加深理解.
文章最後對運用這兩個命令可能出現的問題(如許可權不夠,不同oracle版本)進行了探討,並提出了相應的解決方案;
本文部分內容摘錄自網路,感謝網友的經驗總結;
一.說明
oracle 的exp/imp命令用於實現對資料庫的導出/導入操作;
exp命令用於把數據從遠程資料庫伺服器導出至本地,生成dmp文件;
imp命令用於把本地的資料庫dmp文件從本地導入到遠程的Oracle資料庫中。
二.語法
可以通過在命令行輸入 imp help=y 獲取imp的語法信息:
=============================================================================
C:\Documents and Settings\auser>imp help=y
Import: Release 9.0.1.1.1 - Proction on 星期二 5月 20 18:21:57 2008
(c) Copyright 2001 Oracle Corporation. All rights reserved.
可以通過輸入 IMP 命令和您的用戶名/口令
後接用戶名/口令的命令:
常式: IMP SCOTT/TIGER
或者, 可以通過輸入 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)
FEEDBACK 每 x 行顯示進度 (0)
TOID_NOVALIDATE 跳過指定類型 ID 的驗證
FILESIZE 每個轉儲文件的最大大小
STATISTICS 始終導入預計算的統計信息
RESUMABLE 遇到與空格有關的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文本字元串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
COMPILE 編譯過程, 程序包和函數 (Y)
下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據 (N)
TABLESPACES 將要傳輸到資料庫的表空間
DATAFILES 將要傳輸到資料庫的數據文件
TTS_OWNERS 擁有可傳輸表空間集中數據的用戶
==============================================
同樣可以通過輸入 exp help=y 獲取exp的語法信息
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\auser>exp help=y
Export: Release 9.0.1.1.1 - Proction on 星期二 5月 20 18:26:34 2008
(c) Copyright 2001 Oracle Corporation. All rights reserved.
通過輸入 EXP 命令和用戶名/口令,您可以
後接用戶名/口令的命令:
常式: EXP SCOTT/TIGER
或者,您也可以通過輸入跟有各種參數的 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)
DIRECT 直接路徑 (N) TRIGGERS 導出觸發器 (Y)
LOG 屏幕輸出的日誌文件 STATISTICS 分析對象 (ESTIMATE)
ROWS 導出數據行 (Y) PARFILE 參數文件名
CONSISTENT 交叉表一致性 CONSTRAINTS 導出約束條件 (Y)
FEEDBACK 每 x 行顯示進度 (0)
FILESIZE 每個轉儲文件的最大大小
FLASHBACK_SCN 用於回調會話快照的 SCN
FLASHBACK_TIME 用來獲得最接近於指定時間的 SCN 的時間
QUERY 用來導出表的子集的選擇子句
RESUMABLE 遇到與空格有關的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文本字元串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
TTS_FULL_CHECK 對 TTS 執行完全或部分相關性檢查
TABLESPACES 要導出的表空間列表
TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)
TEMPLATE 調用 iAS 模式導出的模板名稱
三.使用示例
3.1 數據導出:
1 將資料庫SampleDB完全導出,用戶名system 密碼manager 導出到E:\SampleDB.dmp中
exp system/manager@TestDB file=E:\sampleDB.dmp full=y
2 將資料庫中system用戶與sys用戶的表導出
exp system/manager@TestDB file=E:\sampleDB.dmp owner=(system,sys)
3 將資料庫中的表 TableA,TableB 導出
exp system/manager@TestDB file=E:\sampleDB.dmp tables=(TableA,TableB)
4 將資料庫中的表tableA中的欄位filed1 值為 "王五" 的數據導出
exp system/manager@TestDB file=E:\sampleDB.dmp tables=(tableA) query=' where filed1='王五'
如果想對dmp文件進行壓縮,可以在上面命令後面 加上 compress=y 來實現。
3.2 數據的導入
1 將備份資料庫文件中的數據導入指定的資料庫SampleDB 中,如果 SampleDB 已存在該表,則不再導入;
imp system/manager@TEST file=E:\sampleDB.dmp full=y ignore=y
2 將d:\chu.dmp中的表table1 導入
imp system/manager@TEST file=E:\sampleDB.dmp tables=(table1)
3. 導入一個完整資料庫
imp system/manager file=bible_db log=dible_db full=y ignore=y
4. 導入一個或一組指定用戶所屬的全部表、索引和其他對象
imp system/manager file=seapark log=seapark fromuser=seapark imp
system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)
5. 將一個用戶所屬的數據導入另一個用戶
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_
imp system/manager file=tank log=tank fromuser=(seapark,amy)
touser=(seapark1, amy1)
6. 導入一個表
imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)
7. 從多個文件導入
imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y
8. 使用參數文件
imp system/manager parfile=bible_tables.par
bible_tables.par參數文件:
#Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_ file=seapark log=seapark_import
參數文件示例見附錄
9. 增量導入
imp system./manager inctype= RECTORE FULL=Y FILE=A
不少情況下要先將表徹底刪除,然後導入。
四.參數說明
4.1、8i EXP常用選項
1、FULL,這個用於導出整個資料庫,在ROWS=N一起使用時,可以導出整個資料庫的結構。例如:
exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
2、BUFFER和FEEDBACK,在導出比較多的數據時,我會考慮設置這兩個參數。例如:
exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
3、FILL和LOG,這兩個參數分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄,例子見上面。
需要說明的是,EXP可以直接備份到磁帶中,即使用FILE=/dev/rmt0(磁帶設備名),但是一般我們都不這么做,原因有二:一、這樣做的速度會慢很多,二、現在一般都是使用磁帶庫的,不建議直接對磁帶進行操作。至於沒有使用磁帶庫的朋友可以考慮和UNIX的TAR結合使用。
如果你真想使用EXP直接到磁帶,你可以參考Metalink文章「EXPORTING TO TAPE ON UNIX SYSTEMS」(文檔號:30428.1),該文中有詳細解釋。
4、COMPRESS參數將在導出的同時合並碎塊,盡量把數據壓縮到initial的EXTENT里,默認是N,一般建議使用。DIRECT參數將告訴EXP直接讀取數據,而不像傳統的EXP那樣,使用SELECT來讀取表中的數據,這樣就減少了SQL語句處理過程。一般也建議使用。不過有些情況下DIRECT參數是無法使用的。
5、如何使用SYSDBA執行EXP/IMP?
這是一個很現實的問題,有時候我們需要使用SYSDBA來執行EXP/IMP,如進行傳輸表空間的EXP/IMP,以及在9i下用SYS用戶來執行EXP/IMP時,都需要使用SYSDBA才可。我們可以使用下面方式連入EXP/IMP:
exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n
6、QUERY參數後面跟的是where條件,值得注意的是,整個where子句需要使用""括起來,where子句的寫法和SELECT中相同,如果是UNIX平台所有"和'都需要使用\u26469屏蔽它們的特殊含義:
exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"
如果是windows平台,則使用下面的格式:
exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""
4.2、8i IMP常用選項
1、FROMUSER和TOUSER,使用它們實現將數據從一個SCHEMA中導入到另外一個SCHEMA中。
2、IGNORE、GRANTS和INDEXES,其中IGNORE參數將忽略表的存在,繼續導入,這個對於需要調整表的存儲參數時很有用,我們可以先根據實際情況用合理的存儲參數建好表,然後直接導入數據。而GRANTS和INDEXES則表示是否導入授權和索引,如果想使用新的存儲參數重建索引,或者為了加快到入速度,我們可以考慮將INDEXES設為N,而GRANTS一般都是Y。
另外一個EXP/IMP都有的參數是PARFILE,它是用來定義EXP/IMP的參數文件,也就是說,上面的參數都可以寫在一個參數文件中,但我們一般很少使用。
4.4、Oracle9i EXP功能描述
Oracle9i EXP在原有的基礎上新增了部分新的參數,按功能主要分為以下幾個部分:
1、OBJECT_CONSISTENT - 用於設置EXP對象為只讀以保持對象的一致性。默認是N。
2、FLASHBACK_SCN和FLASHBACK_TIME - 用於支持FLASHBACK功能而新增。
3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用於支持RESUMABLE空間分配而新增。
4、TTS_FULL_CHECK - 用於在傳輸表空間時使用依賴性檢查。
5、TEMPLATE - 用於支持iAS。
6、TABLESPACES - 設置表空間導出模式。個人覺得對於一般用戶而言,這個才是新增參數中最實用的一個,可以讓用戶在原來的FULL、OWNER、TABLES的基礎上多了一種選擇,使得EXP更加靈活。
五、不同版本的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號為2261,你可以到METALINK上去查看有關此BUG的詳細信息。
BUG歸BUG,我們的工作還是要做,在沒有Oracle的支持之前,我們就自己解決。在Oracle9i中執行下面的SQL重建exu81rls視圖即可。
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')
)
/
grant select on sys.exu81rls to public;
/
六、其他問題
本文只討論了Oracle8i和9i中的EXP/IMP的一些情況,對於之前的版本,在8.0.X中,除了QUERY參數不能用外,其它差別不大。針對沒有QUERY的情況,我們可以先在資料庫中使用查詢條件建立臨時中間表,然後使用EXP導出這個中間表即可。至於Oracle7因為目前使用的人較少,gototop不打算在此做詳細解釋了,如果讀者朋友有需求,你可以參考Metalink文檔:「Overview of Export and Import in Oracle7」(文檔號:61949.1)。關於EXP/IMP的詳細參數信息你可以通過EXP/IMP HELP=Y來獲得。
另外關於傳輸表空間的更多信息可以參考下面的Metelink文檔,本文不再詳述。
[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.
[NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.
在進行並行EXP/IMP的時候,如果IMP過程建索引的話不建議同時運行5個以上的IMP,如果你想加快速度,可以在IMP的時候不建索引,這樣只要內存允許,可以多跑幾個,然後是SQL腳本創建需要的索引。
注意:
操作者要有足夠的許可權,許可權不夠它會提示。
資料庫是否可以連上, 可以用tnsping TestDB 來獲得資料庫 TestDB 能否連上。
附錄一:
給用戶增加導入數據許可權的操作
第一, 啟動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
附錄二:
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
B. 遠程oracle資料庫導出本地
遠程Oracle資料庫導出到本地用exp命令。
導出一個完整資料庫:
1、win鍵+R鍵,輸入cmd,打開命令提示符。
C. exp導出來的數據,跟rman備份出來的有什麼不同
都可以用作備份,但是exp類似冷備份, 你只能夠恢復到某一點
而rman的話,需要開啟歸檔,那樣就可以進行無數據丟失的恢復。
詳細點說就是:
在不開歸檔日誌的情況下,Oracle資料庫的備份只能依賴exp命令(邏輯備份)導出數據文件(注意:不包括日誌文件以及控制文件等),導出的所有數據僅僅以一個大文件的方式來存放,但是這種備份容易導致丟失數據。舉個例子:如果5號晚上進行了exp數據導出,但是在6號的運行過程中發生宕機,數據丟失,這個時候從5號備份後一直到6號宕機前的數據將全部丟失(即使將日誌文件和控制文件拷出來都無法恢復,因為exp導出的數據無法與這些日誌文件一一對應起來恢復)。所以採用exp方式備份數據還是存在很大風險的。
另一種方式就是使用Oracle自帶的備份工具rman。一次rman備份(物理備份)的全過程如下:
因為使用rman備份不會產生數據丟失的情況,所以必須有一個全備份的文件,使用rman需要先進行一次全備份,相當於將當前資料庫裡面的所有文件以及日誌都全盤拷貝一份到備份介質中,然後通過歸檔日誌(實時更新的)的記錄看每個進程都對資料庫做了哪些修改,只要保留了一份物理備份以及物理備份之後的所有歸檔日誌,就能夠將資料庫恢復到宕機前一刻的狀態,將數據丟失降到最低。(每個redo log寫滿之後就開始寫到achive log裡面進行歸檔,這個裡面還是有個時間段的,不能做到完全的實時)
D. 如何寫exp和imp腳本命令
EXP/IMP備份(導出/導入備份)
exp hely=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 將傳輸的表空間列表
imp hely=y 說明:
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 擁有可傳輸表空間集中數據的用戶
導入注意事項:
(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生成的文件
使用方法:
例題格式及說明:
1.普通資料庫全部導出和導入
exp 用戶/密碼@dbName file=路徑.dmp full=y --還有其他的參數,看需要進行填寫
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y commit=y ignore=y --全部導出
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 --全部導入
2.指定用戶全部導出
/home/oracle/proct/9.2.0.4/bin/exp userid=用戶/密碼 --說明:本地的資料庫登入(可以指定其他資料庫,則需添加@dbName)
owner=導出的用戶名 file=導出路徑存放目錄.dmp log=導出的日誌信息.log --主要:這是不能使用full=y或則會出錯(默認該用戶全導出)
3.文件參數導出
$ exp parfile=username.par // 在參數文件中輸入所需的參數
參數文件username.par 內容
userid=username/userpassword
buffer=8192000
compress=n
grants=y
file=/oracle/test.dmp
full=y
4.制定表導出(分區表導出及條件表導出)
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 --或tables(table1,table2,.....)
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=(T1: table1,T2: table2,.....) --T1是分區表
$ exp scott/tiger tables=emp query=/"where job=/'salesman/' and sal/<1600/" file=/directory/scott2.dmp 或根據參數文件進行導出
5.導入(一張或多張表)
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=(table1,table2) fromuser=dbuser
touser=dbuser2 commit=y ignore=y
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
commit=y ignore=y
6.只導出數據對象不導出數據
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n --rows=n/y說明是否導出數據行
7.分割多個文件導出和導入
$ exp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m log=xxx.log full=y
$ imp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=xxx fromuser=dbuser
touser=dbuser2 commit=y ignore=y
8.增量導出和導入
a.完全增量導出(inctype=complete) // 備份整個資料庫
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
b.增量型增量導出 導出上一次備份後改變的數據(inctype=incremental)。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
c.累計型增量導出(Cumulative) 只導出自上次"完全"導出之後資料庫中變化的信息。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
d.增量導入:
$ imp usr/pwd FULL=y inctype=system/restore/inctype --(SYSTEM: 導入系統對象,RESTORE: 導入所有用戶對象)
9.使用sysdba進行導出和導入
1. 命令行方式:
A: Windows平台:
C:/> exp 'sys/sys@instance as sysdba' tables=scott.emp file=e:/emp.dmp
B: Unix & linux平台(這時的"'"需要用到轉義字元"/"):
$ exp /'sys/change_on_install@instance as sysdba/' tables=scott.emp file=/home/oracle/emp.dmp
C: 表空間導入和導出
$ imp /'usr/pwd@instance as sysdba/' tablespaces=xx transport_tablespace=y
file=xxx.dmp datafiles=xxx.dbf
2. 交互輸入方式:
exp tables=scott.emp --不輸入連接字元串,直接回車
Export: Release 10.2.0.3.0 - Proction on Fri Jun 25 07:39:46 2004 Copyright (c) 1982, 2005, Oracle. All rights reserved.
Username: sys/change_on_install@instance as sysdba --輸入連接字元串.
3.如果是寫在參數文件中,則連接字元串需要用雙引號了:USERID="sys/change_on_install@instance as sysdba"
10.表空間傳輸(建議:10g以上使用,但我試了在9i沒有找到相對應的檢查表空是否傳輸的語句,10g 支持跨平台的表空間傳輸)
注意:
l.索引在待傳輸表空間集中而表卻不在。(注意,如果表在待傳輸表空間集中,而索引不在並不違反自包含原則,當然如果你堅持這樣傳輸的話,會造成目標庫中該表索引丟失)。
2.分區表中只有部分分區在待傳輸表空間集(對於分區表,要麼全部包含在待傳輸表空間集中,要麼全不包含)。
3.待傳輸表空間中,對於引用完整性約束,如果約束指向的表不在待傳輸表空間集,則違反自包含約束;但如果不傳輸該約束,則與約束指向無關。
4.對於包含LOB列的表,如果表在待傳輸表空間集中,而Lob列不在,也是違反自包含原則的。
a.查看錶空間包含那些XML文件
select distinct p.tablespace_name
from dba_tablespaces p, dba_xml_tables x, dba_users u, all_all_tables t
where t.table_name = x.table_name
and t.tablespace_name = p.tablespace_name
and x.owner = u.username
b.檢測一個表空間是否符合傳輸標準的方法:
SQL > exec sys.dbms_tts.transport_set_check('tablespace_name',true);
SQL > select * from sys.transport_set_violations;
c.簡要使用步驟
1.設置表空間為只讀(假定表空間名字為APP_Data 和APP_Index)
SQL > alter tablespace app_data read only;
SQL > alter tablespace app_index read only;
2.發出EXP 命令
SQL> host exp userid='''sys/password as sysdba''' transport_tablespace=y
tablespaces=(app_data, app_index)
以上需要注意的是:(或則參考我自己寫的 表空間導入和導出例題)
·為了在SQL中執行EXP,USERID 必須用三個引號,在UNIX 中也必須注意避免"/"的使用
·在816 和以後,必須使用sysdba 才能操作
·這個命令在SQL中必須放置在一行(這里是因為顯示問題放在了兩行)
3.拷貝.dbf數據文件(以及.dmp 文件)到另一個地點,即目標資料庫可以是cp(unix)或(windows)或通過ftp 傳輸文件(一定要在bin方式)
4.把本地的表空間設置為讀寫
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
5.在目標資料庫附加該數據文件 (直接指定數據文件名)
(表空間不能存在,必須建立相應用戶名或者用fromuser/touser)
$ imp file=expdat.dmp userid=」」」sys/password as sysdba」」」
transport_tablespace=y datafiles=(「c:/app_data.dbf,c:/app_index.dbf」)
tablespaces=app_data,app_index tts_owners=hr,oe
6.設置目標資料庫表空間為讀寫
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
11.優化IMP/EXP的速度(修改參數配置文件)
EXP:
加大large_pool_size,可以提高exp 的速度
採用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查.
設置較大的buffer,如果導出大對象,小buffer 會失敗。
export文件不在ORACLE 使用的驅動器上,不要export到NFS 文件系統
UNIX環境:用管道模式直接導入導出來提高imp/exp 的性能
IMP:
建立一個indexfile,在數據import完成後在建立索引
將import 文件放在不同的驅動器上
增加DB_BLOCK_BUFFERS
增加LOG_BUFFER
用非歸檔方式運行ORACLE:ALTER DATABASE NOARCHIVELOG;
建立大的表空間和回滾段,OFFLINE 其他回滾段,回滾段的大小為最大表的1/2
使用 COMMIT=N
使用ANALYZE=N
單用戶模式導入
UNIX環境:用管道模式直接導入導出來提高imp/exp 的性能
12.通過unix/Linux PIPE管道加快exp/imp速度
步驟如下:
通過管道導出數據:
1.通過mknod -p 建立管道
$ mknod /home/exppipe p // 在目錄/home下建立一個管道exppipe注意參數p
2.通過exp 和gzip 導出數據到建立的管道並壓縮
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ exp test/test tables=bitmap file=/home/newsys/test.pipe &
gzip < /home/newsys/test.pipe > bitmap.dmp.gz
3.導出成功完成之後刪除建立的管道
$ rm -rf /home/exppipe
4.shell腳本可以這樣寫(我只是寫主要的)
unix下:
mkfifo /home/exp.pipe
chmod a+rw exp.pipe
compress < exp.pipe > exp.dmp.Z &
su -u oracle -c "exp userid=ll/ll file=/home/exp.pipe full=y buffer=20000000"
rm exp.pipe
linux下:
mknod /home/exppipe p
$ imp test/test file=/home/exppipe fromuser=test touser=macro &
gunzip < exp.dmp.gz > /home/exppipe
$ rm –fr /home/exppipe
E. oracle中exp命令怎樣使用
exp三種用法:
1、exp 導出某個用戶全部資料庫
格式:exp ywxy/ywxy@ORCL file=d:/chu1.dmp full=y;
ywxy/ywxy@ORCL 是用戶名/密碼@資料庫名
file=d:/chu1.dmp 是導出的路徑
full=y 是導出全庫
2、exp 導出某個用戶的某個庫
格式:exp ywxy/ywxy@ORCL file=d:/chu1.dmp owner=system;
ywxy/ywxy@ORCL 是用戶名/密碼@資料庫名
file=d:/chu1.dmp 是導出的路徑
owner=system 是要導出的庫
3、exp 導出某個用戶的某個表
格式:exp ywxy/ywxy@ORCL file=d:/chu1.dmp tables=C_ZX_QYJC;
ywxy/ywxy@ORCL 是用戶名/密碼@資料庫名
file=d:/chu1.dmp 是導出的路徑
tables=C_ZX_QYJC 是導出的表名字,多個表名則 (table1,table2)形式
(5)exp命令日誌輸出到文件擴展閱讀:
常用選項:
1、FULL,用於導出整個資料庫,在ROWS=N一起使用時,可以導出整個資料庫的結構。
2、OWNER和TABLE,這兩個選項用於定義EXP的對象。OWNER定義導出指定用戶的對象,TABLE指定EXP的table名稱。
⒊BUFFER和FEEDBACK,在導出比較多的數據時,考慮設置這兩個參數。
⒋FILE和LOG,這兩個參數分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄。
⒌COMPRESS參數不壓縮導出數據的內容。用來控制導出對象的storage語句如何產生。默認值為Y,使用默認值,對象的存儲語句的init extent等於當前導出對象的extent的總和。推薦使用COMPRESS=N。
⒍ FILESIZE該選項在8i中可用。如果導出的dmp文件過大時,最好使用FILESIZE參數,限制文件大小不要超過2G。
F. 用exp命令備份oracle 之後生成的備份文件在哪裡
你可以加上參數 如:file=c:\exp.dmp log=c:\exp.log
這樣,導出的dmp文件就在c盤根下
G. oracle 10g用exp命令按用戶導出的DMP文件缺少表,誰能告訴我為什麼嗎
你缺少的表是不是都是沒數據的?如果是就按我提供的方法,應該能解決!
1.用以下這句查找空表並生成執行命令
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
2.將查詢結果的內容導出,執行導出的語句。
3.然後再用exp的方式去導出資料庫,就可以完整的導出包括空表的資料庫。
H. 怎樣把expect的執行結果輸出到一個文件中
ping命令的最後用管道命令>>e:\1.txt,如pingg.cn>>e:\1.txt,注意>>前面有空格,後面沒有。>>e:\1.txt就是把顯示輸出寫入到e:\1.txt文件中,一個>會覆蓋前面的內容的,用>>,就能把後面的命令輸出內容追加到e:\1.txt文件中。
I. Oracle 資料庫導出 exp命令,報錯:
那就要針對情況具體分析,一般可參考如下方法:
1. 獲取幫助
exp help=y
2. 導出一個完整資料庫
exp system/manager file=bible_db log=dible_db full=y
3. 導出資料庫定義而不導出數據
exp system/manager file=bible_db log=dible_db full=y rows=n
4. 導出一個或一組指定用戶所屬的全部表、索引和其他對象
exp system/manager file=seapark log=seapark owner=seapark
exp system/manager file=seapark log=seapark owner=(seapark,amy,amyc,harold)
注意:在導出用戶時,盡管已經得到了這個用戶的所有對象,但是還是不能得到這些對象引用的任何同義詞。解決方法是用以下的SQL*Plus命令創建一個腳本文件,運行這個腳本文件可以獲得一個重建seapark所屬對象的全部公共同義詞的可執行腳本,然後在目標資料庫上運行該腳本就可重建同義詞了。
SET LINESIZE 132
SET PAGESIZE 0
SET TRIMSPOOL ON
SPOOL c:\seapark.syn
SELECT 'Create public synonym '||synonym_name||' for'||table_owner||'.'||table_name||';' FROM dba_synonyms WHERE table_owner = 'SEAPARK' AND owner = 'PUBLIC';
SPOOL OFF
5. 導出一個或多個指定表
exp seapark/seapark file=tank log=tank tables=tank
exp system/manager file=tank log=tank tables=seapark.tank
exp system/manager file=tank log=tank tables=(seapark.tank,amy.artist)
6. 估計導出文件的大小
全部表總位元組數:
SELECT sum(bytes) FROM dba_segments WHERE segment_type = 'TABLE';
seapark用戶所屬表的總位元組數:
SELECT sum(bytes) FROM dba_segments WHERE owner = 'SEAPARK' AND segment_type = 'TABLE';
seapark用戶下的aquatic_animal表的位元組數:
SELECT sum(bytes) FROM dba_segments WHERE owner = 'SEAPARK' AND segment_type = 'TABLE' AND segment_name = 'AQUATIC_ANIMAL';
7. 導出表數據的子集(oracle8i以上)
NT系統:
exp system/manager query='Where salad_type='FRUIT'' tables=amy.salad_type file=fruit log=fruit
UNIX系統:
exp system/manager query=\"Where salad_type=\'FRUIT\'\" tables=amy.salad_type file=fruit log=fruit
8. 用多個文件分割一個導出文件
exp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) log=paycheck, filesize=1G tables=hr.paycheck
9. 使用參數文件
exp system/manager parfile=bible_tables.par
bible_tables.par參數文件:
#Export the sample tables used for the Oracle8i Database Administrator's Bible.
file=bible_tables
log=bible_tables
tables=(
amy.artist
amy.books
seapark.checkup
seapark.items
)
10. 增量導出
「完全」增量導出(complete),即備份整個資料庫
exp system/manager inctype=complete file=990702.dmp
「增量型」增量導出(incremental),即備份上一次備份後改變的數據
exp system/manager inctype=incremental file=990702.dmp
「累計型」增量導出(cumulative),即備份上一次「完全」導出之後改變的數據
exp system/manager inctype=cumulative file=990702.dmp
J. 如何把遠程的oracle資料庫導出到本地計算機上
1,可用exp命令導出到本地:
win+R,然後輸入cmd進入命令提示符。