建議:若備份數據庫較大遠程導入導出比較容易出錯,建議先備份表結構,再導入表數據
1.本地數據庫新建一個用戶test,並授予以下基本權限
grant connect to test;
grant resource to test;
grant create table, create database link to test;
grant create session to test;
grant resource to test;
grant create table, create database link to test;
grant create session to test;
2.創建遠程dblink
create public database link linkname_xxx connect to 遠程username identified by 遠程password
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST = IP)(PORT = 端口)))(CONNECT_DATA =(SERVICE_NAME
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST = IP)(PORT = 端口)))(CONNECT_DATA =(SERVICE_NAME
= 服務名)))';
3
.創建導出文件目錄,本地要存在該路徑,並授權給test
create directory expdir as 'e:\expdir';
grant read,write on directory expdir to test;
4.參數解釋
參數名 | 說明 | 使用示例 |
network_link | 指定遠程dblink | network_link=linkname |
directory | 指定導出目錄 | directory=directoryname |
dumpfile | 指定備份文件名 | dumpfile=remoteDB.dmp |
logfile | 指定日志文件名 | logfile=logname.log |
schemas | 指定導出/導入某一個用戶 | schemas=remoteDBUername |
content |
指定要導出的內容,默認值為ALL,語法如下:content={all| data_only | metadata_only}
|
content=metadata_only |
remap_schema | 只在導入時使用,實現將一個用戶的的數據遷移到另外一個用戶 | remap_schema=localDBuername:remoteDBUername |
remap_tablespace | 只在導入時使用,把冒號前面的表空間對象導入到冒號后面的表空間 |
remap_tablespace=sourceTablespace:target Tablespace
|
table_exists_action | 只在導入時使用,導入時,假如目標庫中已存在對應的表,對於這種情況,提供三種不同的處理方式:append,truncate,skip,replace append : 追加數據到表中 truncate: 將目標庫中的同名表的數據truncate掉。 skip:遇到同名表,則跳過,不進行處理,注意:使用此參數值時,與該表相關的所有操作都會skip掉。 replace:導入過程中,遇到同名表,則替換到目標庫的那張表(先drop,再創建)。 |
table_exists_action=replace |
ATTACH | 當我們使用ctrl+C 退出交互式命令時,可使用attach參數重新進入到交互模式, 語法:ATTACH=[schema_name.]job_name Schema_name用戶名,job_name任務名 |
Expdp scott/tiger ATTACH=scott.export_job |
EXCLUDE | 此參數用於排除不需要導出的內容,如我們進行全庫導出,但是不需要導出用戶scott,此時需要在exlude后先指定排除類型為schema,再指定具體的schema。具體使用方法見include參數. EXCLUDE與include的使用方法是一樣的 語法 EXCLUDE=object_type[:name_clause] [,object_type[:name_clause] ] name_clause "='object_name'" "in ('object_name'[,'object_name',....])" "in (select_clause) " Object_type對象類型,如:table,view,procedure,schema等 name_clause指定名稱的語句,如果不具體指定是哪個對象,則此類所有對象都不導出, select 語句中表名不要加用戶名。用戶名,通過schemas 指定。 |
expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=VIEW expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=TABLE:\" IN\(\'TEMP\',\'GRADE\'\)\" EXCLUDE=TABLE:"='APPLICATION_AUDIT'" |
INCLUDE | 限制范圍,指定自己想要的內容,比如要導出某個用戶的某張表。 語法: INCLUDE=object_type[:name_clause],object_type[:name_clause] |
impdp dbmon/dbmon_123 directory=dump_dir network_link=zjzwb2 SCHEMAS=AICBS remap_schema=aicbs:aicbsb include=table:\"IN\(SELECT TABLE_NAME FROM dbmon.TABLES_TOBE_MASKED\)\" LOGFILE=zjzwb.log transform=segment_attributes:n PARFILE中設置: INCLUDE=table:"in(select table_name from dba_tables where owner='AA')" INCLUDE=TABLE:"IN('TEST1','TEST2')" SHELL環境設置: INCLUDE=TABLE:\"IN\(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER=\'AA\'\)\" INCLUDE=TABLE:\"IN\(\'TEST1\',\'TEST2\'\)\" |
TRANSFORM | 此參數只在導入時使用,是一個用於設定存儲相關的參數,有時候也是相當方便的。假如數據對應的表空間都存在的話,就根本用不到這個參數,但是,假如數據存儲的表空間不存在,使用此參數導入到用戶默認表空間就可以了。更靈活的,可以使用remap_tablespace參數來指定。 格式: transform=transform_name:value[bject_type] transform_name = [OID | PCTSPACE | SEGMENT_ATTRIBUTES | STORAGE]:[Y|N] segment attributes:段屬性包括物理屬性、存儲屬性、表空間和日志,Y 值按照導出時的存儲屬性導入,N時按照用戶、表的默認屬性導入 storage:默認為Y,只取對象的存儲屬性作為導入作業的一部分 oid: owner_id,如果指定oid=Y(默認),則在導入過程中將分配一個新的oid給對象表,這個參數我們基本不用管。 pctspace:通過提供一個正數作為該轉換的值,可以增加對象的分配尺寸,並且數據文件尺寸等於pctspace的值(按百分比) |
transform=segment_attributes:n --表示將用戶所有對象創建到用戶默認表空間,而不再考慮原來的存儲屬性。 |
FULL | 指定導出內容為全庫導出。這里需要特別注意的是,expdp 不能導出sys用戶對象。即使是全庫導出也不包含sys用戶。 語法:FULL={Y | N} |
expdp \'\/ as sysdba\' directory=dump_dir full=y |
5.導出dmp文件
expdp localDBuername/localDBpasswd network_link =
linkname_xxx
directory =
expdir
dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername
例:expdp yl_etyy/yl_etyy@127.0.0.1:1521/orcl network_link = linkname_xxx directory = expdir dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername
只導出標結構,增加content參數:
例:expdp yl_etyy/yl_etyy@127.0.0.1:1521/orcl network_link = linkname_xxx directory = expdir dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername content=metadata_only
6.將dmp文件導入到數據庫
建議目標數據庫和源數據庫的表空間、臨時表空間、索引表空間名字一致,否則會出現表空間找不到的錯誤
1)impdp
username
/
pwd
@
IP
:
端口
/
服務名
dumpfile=
數據備份.dmp
例:impdp NCC2020_0609/1@127.0.0.1:1521/orcl dumpfile=NCC2020_0609.dmp
2)impdp localDBuername/localDBpasswd directory =
expdir
dumpfile = remoteDB.dmp logfile = impremoteDB.log remap_schema=localDBuername:remoteDBUername
7.直接用
impdp導入遠程數據庫到本地,不生成dmp文件
impdp username/pwd@IP:端口/服務名 directory=expdir logfile=impdp.log network_link=linkname_xxx schemas=remoteDBUername
8.impdp導入數據時數據表已經存在或者只想導入數據的情況
當使用impdp導入數據時,如果遇到表已經存在或者已經導入過表結構只想導入表數據,Oracle提供了以下四種方式:
- SKIP:跳過已經存在的表,繼續導入下一個對象,如果CONTENT設置了DATA_ONLY參數,則不能使用SKIP
- APPEND:不會影響已存在的數據,在原有數據表的基礎上繼續增加數據
- REPLACE:先刪除掉表,然后創建表,最后完成數據插入
- TRUNCATE:刪除已存在的行,然后插入所有的數據
我們需要在導入語句中使用TABLE_EXISTS_ACTION參數指定導入數據方式,方法如下
例:impdp zcgl/system dumpfile=GUIDONG.DMP directory=data_pump_dir REMAP_TABLESPACE=ASSETS:ZCGL REMAP_SCHEMA=TESTUSER:ZCGL
TABLE_EXISTS_ACTION=APPEND
logfile=TEST20191111.log
9.異常情況
在執行過程中可能會出現卡住不動,並且備份文件也不增長的情況,可以按以下步驟進行嘗試:
1)查詢dba_datapump_jobs表查看job狀態

運行狀態為EXECUTING
2)進入
Export狀態
按Ctrl+C組合鍵,
若進入Export>,則直接進行3)停止job,
若進入C:\Users\Administrator>,需要執行Expdp username/pwd ATTACH=job_name(通過查詢dba_datapump_jobs得到),進入Export>
3)停止job
在 “Export> ”提示符下輸入命令:stop_job=immediate ,回車后,再輸入yes確定結束當前任務,即可正確終止正在進行expdp導出數據的任務。

正確停止后按照第一步查詢dba_datapump_jobs表狀態為NOT RUNNING,
或者
IDLING
4)恢復執行job
控制台執行Expdp username/pwd ATTACH=job_name(通過查詢dba_datapump_jobs得到),進入Export狀態
C:\Users\Administrator>Expdp username/pwd ATTACH=job_name
執行start_job:
Export> start_job --打開暫停的JOB(並未開始重新執行)
執行continue_client:
Export> continue_client --通過此命令重新啟動job
5)按照第一步查詢job狀態,並且檢查備份文件是否重新開始增長