正文 Oracle Data Pump(以下簡稱數據泵)是Oracle 10g開始提供的一種數據遷移工具,同時也被廣大DBA用來作為資料庫的邏輯備份工具和體量較小的數據遷移工具。與傳統的數據導出/導入工具,即 exp/imp 工具相比,數據泵更為高效和安全,數據泵主要包含以下三個部分: 1. 操作系 ...
正文
Oracle Data Pump(以下簡稱數據泵)是Oracle 10g開始提供的一種數據遷移工具,同時也被廣大DBA用來作為資料庫的邏輯備份工具和體量較小的數據遷移工具。與傳統的數據導出/導入工具,即exp/imp工具相比,數據泵更為高效和安全,數據泵主要包含以下三個部分:
- 操作系統命令行客戶端,expdp和impdp;
- DBMS_DATAPUMP PL/SQL包(也被認為是Data Pump API);
- DBMS_METADATA PL/SQL包(也被認為是Metadata API)。
DBMS_DATAPUMP包主要執行實際數據的導出和導入工作,expdp和impdp命令也是通過命令行調用該包當中的存儲過程實現數據導出導入功能,這個包是數據泵當中最核心的部分;
DBMS_METADATA包主要提供當數據導出導入用於元數據移動時,對元數據內容的提取、修改和重新創建的功能。
本文主要討論的是命令行工具expdp和impdp。關於數據泵更詳細的內容可以參考官方文檔說明:Overview of Oracle Data Pump
主要說明
數據泵操作系統命令行分為導出工具expdp,導入工具impdp,對比早期版本的數據導出導入工具而且有著較大的效率性能提高,主要包含以下優點:
- 支持並行地進行數據導出和導入任務;
- 支持暫停、重啟動任務;
- 支持更多的對象類型的過濾;
- 支持導入任務中元數據對象的修改、重映射;
- 支持預估導出任務所需的空間大小需求,以便合理規劃存儲導出任務數據的路徑。
環境準備
- 操作系統(OS):CentOS Linux release 7.5.1804 (Core)
- 資料庫版本(Oracle Database):Oracle Database 11g R2(11.2.0.4.0)
同時配置了示例SCHEMA和解鎖了用戶SCOTT、HR。
- 創建數據泵導出導入目錄
SYS@dbabd> create directory datapump as '/data/app/datapump';
Directory created.
SYS@dbabd> select directory_name,directory_path from dba_directories;
DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ---------------------------------------------
SUBDIR /data/app/oracle/product/11.2.0/db_1/demo/schema/order_entry//2002/Sep
SS_OE_XMLDIR /data/app/oracle/product/11.2.0/db_1/demo/schema/order_entry/
DATAPUMP /data/app/datapump
LOG_FILE_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/log/
MEDIA_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/product_media/
DATA_FILE_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/sales_history/
XMLDIR /data/app/oracle/product/11.2.0/db_1/rdbms/xml
ORACLE_OCM_CONFIG_DIR /data/app/oracle/product/11.2.0/db_1/ccr/hosts/dbabd/state
DATA_PUMP_DIR /data/app/oracle/admin/dbabd/dpdump/
ORACLE_OCM_CONFIG_DIR2 /data/app/oracle/product/11.2.0/db_1/ccr/state
10 rows selected
- 授予用戶讀寫目錄許可權
SYS@dbabd> grant read,write on directory datapump to scott;
Grant succeeded.
SYS@dbabd> grant read,write on directory datapump to hr;
Grant succeeded.
- 授予用戶DATAPUMP_EXP_FULL_DATABASE角色和DATAPUMP_IMP_FULL_DATABASE角色許可權
為了使scott和hr用戶有導出/導入全庫的許可權,所以授予這兩個用戶DATAPUMP_EXP_FULL_DATABASE角色和DATAPUMP_IMP_FULL_DATABASE角色許可權
SYS@dbabd> grant DATAPUMP_EXP_FULL_DATABASE to scott;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_IMP_FULL_DATABASE to scott;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_EXP_FULL_DATABASE to hr;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_IMP_FULL_DATABASE to hr;
Grant succeeded.
expdp工具
Oracle Data Pump Export(以下簡稱為export)是數據泵用於將數據和元數據從資料庫中導出並存儲在操作系統上一組轉儲文件集的工具(對應操作系統命令為expdp)。導出的轉儲文件集只能通過數據泵導入工具impdp進行導入,文件集可以在本系統進行導入同時也支持在其他系統上進行導入。文件集包含一個或多個文件,這些文件分別存儲了表實際數據、對象元數據和控制信息,文件集存儲格式為專有的二進位格式。
由於expdp工具是服務端而非客戶端工具,因此DBA必須為導出操作用戶指定目錄對象來存儲轉儲文件集,目錄對象是資料庫對象,在操作系統層面對應的文件路徑。
工作方式
expdp命令行工具主要有三種工作方式:
命令行方式(Command-Line Interface)
通過命令行方式直接為expdp指定相應的參數文件進行導出任務。參數文件方式(Parameter File Interface)
將命令行參數寫入參數文件,通過指定參數parfile來指定要讀取的參數文件,如果指定參數涉及引號,建議使用參數文件方式。命令交互方式(Interactive-Command Interface)
停止寫入日誌文件,並顯示Export>提示符,可以在提示符當中輸入相應的命令。可以在命令行方式和參數文件方式開始之後輸入Ctrl+C調用命令交互方式,命令交互方式也可以連接到正在執行或者已停止的任務。
命令說明
通過執行如下命令可以得出expdp主要參數用法說明:
$ expdp help=y
[oracle@dbabd ~]$ expdp help=y
-- USERID在命令行方式當中必須是第一個參數
USERID must be the first parameter on the command line.
The available keywords and their descriptions follow. Default values are listed within square brackets.
-- 指定導出訪問數據時使用的特殊方法,預設值AUTOMATIC
'
AUTOMATIC:由數據泵自動選擇導出訪問數據方式;
DIRECT_PATH:使用直接路徑訪問方式;
EXTERNAL_TABLE:使用外部表訪問方式。
建議使用預設值方式,讓數據泵自己選擇適合的方式。
限制:
1.如果同時指定了參數NETWORK_LINK,則不支持直接路徑訪問方式;
2.可傳輸表空間導出任務不支持參數ACCESS_METHOD。
'
ACCESS_METHOD=[AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE]
-- 連接到已存在指定名稱的導出任務上,如ATTACH=job_name
ATTACH [=[schema_name.]job_name]
-- 針對RAC環境,可以在導出任務中在RAC其他實例中啟用工作進程,預設值YES,建議RAC環境導出時指定CLUSTER=NO,不會影響其他實例的性能
CLUSTER=[YES | NO]
-- 指定哪些數據在導出時需要進行壓縮,主要有4種選項,預設值METADATA_ONLY
'
ALL:導出所有對象都壓縮;
DATA_ONLY:導出的數據壓縮;
METADATA_ONLY:導出的元數據壓縮,預設選項;
NONE:導出過程不執行壓縮。
'
COMPRESSION=[ALL | DATA_ONLY | METADATA_ONLY | NONE]
-- 指定導出內容,主要有3種選項,預設值ALL
'
ALL:導出所有數據和元數據,預設選項;
DATA_ONLY:只導出資料庫表行數據,不導出資料庫對象定義數據;
METADATA_ONLY:只導出資料庫對象定義數據,不導出資料庫表行數據。
'
CONTENT=[ALL | DATA_ONLY | METADATA_ONLY]
-- 指定導出文件存儲的目錄,預設值為DATA_PUMP_DIR目錄
'
該目錄指的是資料庫對象中的一種,而不是操作系統當中的目錄;
如果在參數DUMPFILE和LOGFILE當中指定目錄則會覆蓋DIRECTORY指定的值。
'
DIRECTORY=directory_object
-- 指定導出文件的文件名,也可以加上目錄選項,預設值expdat.dmp
'
可以為導出任務指定轉儲為多個文件,如有多個用逗號進行分隔,如果沒有為文件指定擴展名,則預設為.dmp;
文件名也可以使用變數%U,這樣意味著將生成多個文件,%U變數是一個2位寬度的遞增整數,從01~99;
如果參數FILESIZE有指定值,則導出的每個文件都是指定大小的值並且無法擴展,即使每個文件只包含少量的數據,相當於文件大小是固定的。
限制:
如果導出文件名與先前導出文件名重覆,則導出任務不會進行覆蓋而中止報錯,可以通過參數REUSE_DUMPFILES=YES來覆蓋之前同名文件。
'
DUMPFILE=[directory_object:]file_name [, ...]
-- 指定哪些數據在導出時需要進行加密,主要有5種選項,預設值由其他幾個加密相關參數共同決定
'
要開啟加密,參數ENCRYPTION和ENCRYPTION_PASSWORD必須至少指定一個;
ALL:導出所有對象都加密;
DATA_ONLY:導出的數據加密;
ENCRYPTED_COLUMNS_ONLY:指定只有原先加密欄位的導出數據加密,要開啟欄位加密,則需開啟TDE;
METADATA_ONLY:導出的元數據加密;
NONE:導出過程不執行加密。
如果只指定ENCRYPTION_PASSWORD參數的話,ENCRYPTION預設為ALL。
如果只指定ENCRYPTION參數,同時加密wallet開啟,則加密模式為TRANSPARENT,如果加密wallet關閉,則報錯。
如果參數ENCRYPTION和ENCRYPTION_PASSWORD都沒有指定的話,ENCRYPTION為NONE。
'
ENCRYPTION = [ALL | DATA_ONLY | ENCRYPTED_COLUMNS_ONLY | METADATA_ONLY | NONE]
-- 指定導出加密演算法,主要有3種選項,預設值為AES128
'
如果有指定該參數,參數ENCRYPTION和ENCRYPTION_PASSWORD必須至少指定一個,否則報錯。
'
ENCRYPTION_ALGORITHM = [AES128 | AES192 | AES256]
-- 指定導出的加密模式,主要有3種選項,預設值由其他幾個加密相關參數共同決定
'
DUAL:雙模加密模式,導出文件加密可以使用透明加密或者是指定加密密碼模式,雙模模式加密的導出文件適用於當前主機加密wallet開啟的導入,同時也適用於未開啟加密wallet但指定密碼的導入;
PASSWORD:密碼模式,要求在導出任務時指定加密文件的加密密碼,在加密文件導入時必須指定相同密碼,必須同時指定參數ENCRYPTION_PASSWORD,對於異機導入並需要加密的文件來說最適用;
TRANSPARENT:透明加密模式,導出文件的加密無需DBA的干預,需要加密wallet的開啟,參數ENCRYPTION_PASSWORD無需指定,相反的指定反而會報錯,這種模式適用於導出導入只在當前主機進行並需要對文件進行加密。
限制:
1.如果有指定該參數,參數ENCRYPTION和ENCRYPTION_PASSWORD必須至少指定一個,否則報錯;
2.當指定參數ENCRYPTION=ENCRYPTED_COLUMNS_ONLY時,不能使用該參數,否則報錯。
'
ENCRYPTION_MODE = [DUAL | PASSWORD | TRANSPARENT]
-- 指定導出的加密密碼
'
如果指定了該參數,則參數ENCRYPTION_MODE必須設置成DUAL或PASSWORD。
如果指定了該參數,但沒有指定參數ENCRYPTION_MODE,則不需要通過TDE來加密,因為ENCRYPTION_MODE預設為PASSWORD。
如果加密模式為TRANSPARENT,則該參數是無效的。
如果參數ENCRYPTION_MODE=DUAL時,需要使用該參數,則需要開啟TDE。
對於網路導出任務,該參數與ENCRYPTION=ENCRYPTED_COLUMNS_ONLY聯合使用時不支持用戶定義有加密欄位的外部表導出,該表在導出時會被忽略,但是導出任務還會繼續。
對於導出作為源表,導入的作為目標表並事先已存在,相關欄位的加密屬性必須完全匹配,否則會報錯。
'
ENCRYPTION_PASSWORD = password
-- 指定導出任務對磁碟空間需求的估算方式,估算值輸出到日誌和標準輸出,主要有2種選項,預設值BLOCKS
'
BLOCKS:通過計算導出對象對應的塊數量與塊大小的乘積進行估算;
STATISTICS:通過每張表的統計信息進行估算。
估算只包含表行數據,而不包含元數據。
限制:
1.當該參數指定為BLOCKS時,對於導出任務指定壓縮的表的估算是不准確的,應當指定為STATISTICS;
2.當指定參數QUERY或REMAP_DATA時,估算值是不准確的。
'
ESTIMATE=[BLOCKS | STATISTICS]
-- 指定對導出任務進行磁碟空間進行估算,但不進行導出,預設值NO
'
該參數不能與參數QUERY聯合使用。
'
ESTIMATE_ONLY=[YES | NO]
-- 指定導出任務當中需要過濾排除的元數據對象和對象類型
'
object_type指定需要排除的對象類型,可以通過以下三個視圖查詢哪些是可以排除的對象類型:
1.DB級:DATABASE_EXPORT_OBJECTS
2.SCHEMA級:SCHEMA_EXPORT_OBJECTS
3.TABLE級:TABLE_EXPORT_OBJECTS
如果一個對象被排除,則與之相關聯的對象也會被排除,比如排除一張表,表相關的索引和觸發器等也會被排除。
name_clause是個可選項,允許在需要排除的對象類型進行選擇。它可以使用SQL運算符和表達式來進行選擇匹配,與對象類型之間必須用冒號(:)進行隔開並使用雙引號("")包圍,如EXCLUDE=INDEX:"LIKE 'EMP%'"。
name_clause涉及名稱的字元必須全匹配,包括大小寫敏感,如果name_clause沒有指定,則所有指定類型對象都將被排除。
排除約束:
1.EXCLUDE=CONSTRAINT會排除所有非參考約束,除了NOT NULL約束和一些表重建時必須依賴的約束;
2.EXCLUDE=REF_CONSTRAINT會排除所有參考完整的約束,如外鍵。
排除許可權和用戶:
1.EXCLUDE=GRANT會排除對象類型所有對象許可權和系統許可權;
2.EXCLUDE=USER會排除定義用戶的元數據(創建用戶的DDL語句),但不會排除用戶所在SCHEMA的其他對象。
'
EXCLUDE=object_type[:name_clause] [, ...]
-- 指定導出任務中每個文件的最大值,預設值0(相當於允許最大值16TB),如果沒指定單位,預設是位元組
'
最小值是預設數據泵塊大小的10倍,4KB;
最大值是16TB
'
FILESIZE=integer[B | KB | MB | GB | TB]
-- 指定導出指定SCN時刻的數據,用於閃回查詢功能
'
導出任務是以指定SCN時一致性的數據,如果指定參數NETWORK_LINK,則SCN引用的是源資料庫的SCN;
'
FLASHBACK_SCN=scn_value
-- 指定導出的時間,這個時間會匹配最為接近的SCN時刻的數據,用於閃回查詢功能
'
因為TO_TIMESTAMP必須包含在雙引號("")當中,所以如果有使用該參數建議書寫在參數文件當中。
'
FLASHBACK_TIME="TO_TIMESTAMP(time-value)"
-- 指定需要導出整個資料庫,預設值NO
'
參數FULL=YES表明導出所有數據和元數據,要使用FULL模式導出,必須有DATAPUMP_EXP_FULL_DATABASE角色許可權。
限制:
FULL模式導出數據並不包括Oracle自身管理的數據和元數據,還有SYS、ORDSYS和MDSYS的SCHEMA數據;
FULL模式不會導出SYS所有的對象許可權。
'
FULL=[YES | NO]
-- 指定列印expdp的幫助信息和簡要說明,預設值NO
HELP = [YES | NO]
-- 指定在當前導出模式的任務當中需要包含的元數據對象和對象類型
'
INCLUDE的用法大部分可以參考EXCLUDE參數用法。
'
INCLUDE = object_type[:name_clause] [, ...]
-- 指定導出任務名稱,預設值系統生成類似SYS_EXPORT_<mode>_NN格式
'
當後續操作ATTACH參數需要指定連接的任務名稱,可以通過DBA_DATAPUMP_JOBS和USER_DATAPUMP_JOBS查詢獲取。
jobname_string:名稱最長為30個位元組大小(包含空格),如果有包含空格還必須用單引號('')包圍。
'
JOB_NAME=jobname_string
-- 指定導出任務的日誌文件名,也可以加上具體路徑,預設值export.log
'
directory_object:可以為日誌文件另外指定DBA創建的其他目錄存儲,前提是導出用戶需要對目錄有寫許可權。
file_name:可以為日誌文件指定名稱,預設在參數DIRECTORY指定的目錄下創建export.log日誌文件。
日誌文件總是會被創建的,除非指定了參數NOLOGFILE=YES,並且遇到同名日誌文件會進行覆蓋。
'
LOGFILE=[directory_object:]file_name
-- 指定通過DBLINK導出源端資料庫的數據寫入目的端的文件
'
如果源資料庫是只讀的,則使用DBLINK連接源資料庫的用戶必須有本地管理的臨時表空間作為預設臨時表空間,否則導出任務會失敗。
如果導出操作是建立在非加密的DBLINK上,則導出的所有數據都將以明文方式保存,即使數據在資料庫層面是加密的。
限制:
1.DBLINK導出任務不支持LONG類型的欄位;
2.基於DBLINK導出任務兩個資料庫大版本差不能超過1,如11g與10g、11g與12c。
'
NETWORK_LINK=source_database_link
-- 指定導出任務是否阻止創建日誌文件,預設值NO
NOLOGFILE=[YES | NO]
-- 指定導出任務最大並行的活動進程數,預設值1
'
指定的數值應該小於等於導出文件的數量(或者導出文件時使用變數%U),這是因為每個工作進程或者I/O服務進程一次只能獨占寫入一個文件,如果指定不足的導出文件數會影響並行的效果,導致一部分工作進程等待其他進程寫入文件。如果其中某個並行I/O服務進程無法獲得寫入的文件時,導出任務會停止並報ORA-39095錯誤。一旦出現導出文件數不足以進行並行導出時,可以通過交互模式的ADD_FILE命令添加導出文件。
如果要在導出任務的過程當中調整並行數可以使用交互模式,降低並行數並不會導致減少工作進程的數量,而是在之後任意給定時間減少工作進程數量。如果導出任務支持並行時,提高並行數可以立刻生效。
如果需要並行導出表或表分區,則必須具有DATAPUMP_EXP_FULL_DATABASE角色許可權。
'
PARALLEL=integer
-- 指定導出任務的參數文件
'
與其他導出任務的文件相比,參數文件是被導出客戶端使用的,所以不依賴於DIRECTORY指定的目錄路徑,預設路徑為執行導出命令的當前目錄下。建議需要使用雙引號("")指定值的參數寫進參數文件中引用,同時PARFILE不支持寫入參數文件。
'
PARFILE=[directory_path]file_name
-- 指定導出任務通過查詢子句過濾導出內容
'
query_clause:類似於SQL語句當中的WHERE子句,但也可以是其他SQL子句,比如ORDER BY子句,它可以通過數據排序將導出時的堆表轉換為索引組織表。如果SCHEMA和表的名字沒有指定,則query_clause作用於所有導出的所有表。當指定表名時,表名與query_clause要以冒號(:)隔開,可以指定多個查詢子句,但是每張表只能指定一個查詢子句。
如果該參數與NETWORK_LINK一起使用,則在query_clause也需要加上NETWORK_LINK的值,如果沒加上,數據泵會認為該對象為本地對象,而非源端對象,例:QUERY=(hr.employees:"WHERE last_name IN(SELECT last_name FROM hr.employees@dblink1)")。
限制:
該參數不能與以下參數共同使用:
1.CONTENT=METADATA_ONLY;
2.ESTIMATE_ONLY;
3.TRANSPORT_TABLESPACES。
如果指定了該參數,數據泵使用外部表進行數據導出,外部表使用的是CREATE TABLE AS SELECT語句,SELECT部分就來自於WHERE子句當中指定的內容,當查詢子句中包含需要導出表欄位,但該欄位名與其它語句中出現無需導出表欄位名匹配時,導出欄位必須加上別名KU$。
查詢子句支持的最大字元串大小為4000位元組(包含雙引號),實際大小為3998位元組。
'
QUERY = [schema.][table_name:] query_clause
-- 指定導出任務時通過remap函數對部分表的欄位值進行重映射成新值,通常適用於生產環境向測試環境移動數據的脫敏操作
'
參數使用語法中涉及的選項說明(以語法出現順序):
1.schema:需要進行remap的表所屬schema,預設為導出用戶的schema;
2.tablename:需要進行remap的表;
3.column_name:需要進行remap的表欄位名,一張表最多可以remap欄位數量為10;
4.schema:需要進行remap操作的PL/SQL包所屬schema,預設為導出用戶的schema;
5.pkg:進行remap操作的PL/SQL包;
6.function:進行remap操作的PL/SQL包中的函數。
'
REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
-- 指定導出任務是否覆蓋之前同名的導出文件,預設值NO
REUSE_DUMPFILES=[YES | NO]
-- 指定導出任務導出數據的百分比
'
參數代表的是可以導出指定數據的百分比(數據的子集),但這個樣本百分比並非是個準確的值,取值範圍從.000001到100,但不包含100。
如果指定了表的SCHEMA,也必須指定一張表,也可以僅指定表而不需要指定SCHEMA。如果表沒有指定,則參數作用於整個導出任務。
'
SAMPLE=[[schema_name.]table_name:]sample_percent
-- 指定導出任務是否是基於SCHEMA模式的導出,預設值當前導出用戶的SCHEMA,也是數據泵預設的導出模式
'
如果導出用戶擁有DATAPUMP_EXP_FULL_DATABASE許可權,允許導出其他SCHEMA數據,否則只能導出當前用戶的SCHEMA。
在導出數據的同時也會導出有關用戶定義信息、相關對象許可權授予信息等,在執行導入的時候會自動創建SCHEMA。
'
SCHEMAS=schema_name [, ...]
-- 當導出任務指定參數CLUSTER時,指定通過那個服務名所對應的實例進行導出任務,用於RAC環境
'
當參數CLUSTER=NO時,該參數被忽略。
'
SERVICE_NAME=name
-- 指定導出任務需要導出的對象版本,只適用於多個可用版本同時存在資料庫中
SOURCE_EDITION=edition_name
-- 指定導出任務列印詳細狀態信息的頻率,預設值0
'
參數單位是秒,詳細信息只輸出到標準輸出設備,而不輸出到日誌文件中。
'
STATUS=[integer]
-- 指定導出任務為表導出模式
'
當導出的表是分區表時,在導入的過程中是以一個整體分區表進行導入,可以在導入的過程指定參數PARTITION_OPTIONS=DEPARTITION禁止這種方式。
在指定表名之前也可以指定SCHEMA,如果沒指定,預設是當前導出用戶的SHCEMA,如果想導出其它SCHEMA當中的表,需要具有DATAPUMP_EXP_FULL_DATABASE角色許可權。
可以使用%通配符來匹配表名或者表分區名。
關於表名稱的限制:
1.預設存儲在資料庫中的表名是大寫格式的,如果指定表名有大小寫相互出現時必須包含在雙引號("")之中,並且表名稱需完全匹配;
2.表名中不允許出現#符號,如果表名需要包含#,同樣需要包含在雙引號("")之中。
該參數與參數TRANSPORTABLE=ALWAYS一起使用時,對於指定表導出的是元數據、表分區和子分區,而對於實際表數據可以手動拷貝,如果只是導出表分區的一部分,在導入過程中會變成非分區表。
限制:
1.指定表如果有對象屬於其他SCHEMA的不會導出,除非特別指定,如指定表有一個觸發器與表在不同的SCHEMA,如果沒有特別指定,則表觸發器不會導出;
2.表使用的類型並不會在表導出模式被導出,這意味著之後在導入時目標資料庫沒有相應類型,則表創建失敗;
3.表導出模式不支持表別名方式指定表名稱;
4.通配符%不支持表是分區表的匹配,除非通配符匹配的是表的分區;
5.參數TABLES指定導出表的表名總長度最大值為4MB;
'
TABLES=[schema_name.]table_name[:partition_name] [, ...]
-- 指定導出模式為tablespace需要導出的表空間
'
如果表的所有任意部分都在指定導出表空間當中,則表的所有內容都會被導出。
有許可權的用戶導出所有的表,而無許可權的用戶導出所屬SCHEMA的表。
'
TABLESPACES=tablespace_name [, ...]
-- 指定導出任務模式為table(指定參數TABLES)一同使用時是否導出表的元數據、分區數據和子分區數據,預設值NEVER
'
ALWAYS:指定導出任務使用可傳輸選項,該選項與參數TABLES一起使用時只導出表的元數據、分區信息和子分區信息;
NEVER:指定導出任務使用直接路徑或外部表方法導出數據而不使用可傳輸選項,這是預設值。
如果要在可傳輸模式下導出整個表空間,則需要使用參數TRANSPORT_TABLESPACES。
如果指定了參數TRANSPORTABLE=ALWAYS導出分區表的一部分時,在導入之後原分區表將變成非分區表。
如果指定了參數TRANSPORTABLE=NEVER或者未指定TRANSPORTABLE,在導入時:
1.指定了參數PARTITION_OPTIONS=DEPARTITION,則原表分區每部分生成非分區表;
2.參數PARTITION_OPTIONS未使用,則原表會被創建成完整的分區表,但只有數據被導入,其他元數據數據則沒有導入。
限制:
1.該參數只在導出任務模式為table才生效;
2.使用該參數需要有DATAPUMP_EXP_FULL_DATABASE許可權;
3.表空間當中的表、表分區、子分區必須是只讀的(read only);
4.指定該參數下的導出任務不導出任何的數據,數據導入要通過表空間對應數據文件的拷貝完成;
5.為了確保該參數可用,要將COMPATIBLE相容性參數至少設置為11.0.0。
'
TRANSPORTABLE = [ALWAYS | NEVER]
-- 指定導出任務是可傳輸(transportable)模式時是否進行對可傳輸對象獨立性的檢查,預設值NO
'
該參數只針對錶空間可傳輸模式的導出任務有效。
如果參數TRANSPORT_FULL_CHECK=YES,導出任務需要保證在導出可傳輸集中的對象沒有存在依賴於其它非導出的對象,這個檢查是雙向的。如:一張表在導出可傳輸集中,而表的索引不在,則導出中止,如果索引在導出可傳輸集中,而表不在,導出也會中止;
如果參數TRANSPORT_FULL_CHECK=NO,導出任務只檢查在導出可傳輸集中是否有對象依賴於非導出的對象,這個檢查是單向的。如:一張表在導出可傳輸集中,而表的索引不在,則導出可以繼續併成功,如果索引在導出可傳輸集中,而表不在,導出會中止,因為只有索引沒有表是沒有意義的。
該參數與參數TRANSPORT_TABLESPACES一起使用時也進行其它方面的檢查,對於實例層面,檢查表(包括表索引)的數據段是否都在導出可傳輸集當中。
'
TRANSPORT_FULL_CHECK=[YES | NO]
-- 指定導出任務是可傳輸表空間(transportable-tablespace)模式
'
使用該參數指定導出哪些表空間的元數據,日誌文件中記錄了可傳輸集中需要用到的數據文件和包含衝突的對象。
該參數導出指定表空間所有對象的元數據,如果要導出特定表的元數據等,只能通過參數TABLES和參數TRANSPORTABLE=ALWAYS一起使用來實現。
導出可傳輸集在導入時的資料庫版本不能低於導出資料庫的版本,只能相同或者高於導出時的版本。
限制:
1.可傳輸的導出任務不支持重啟;
2.可傳輸的導出任務並行度限製為1;
3.可傳輸表空間模式需要有DATAPUMP_EXP_FULL_DATABASE許可權;
4.可傳輸模式不支持加密的欄位;
5.執行導出任務用戶的預設表空間不能包含在導出任務可傳輸集中;
6.SYS和SYSAUX表空間不支持可傳輸模式;
7.所有包含在導出可傳輸集中的表空間必須是只讀的;
8.如果參數TRANSPORT_TABLESPACES與參數VERSION一起使用時,則VERSION必須等於大於資料庫參數COMPATIBLE指定的值;
9.參數TRANSPORT_TABLESPACES不能與參數QUERY一起使用;
10.可傳輸表空間導出任務不支持參數ACCESS_METHOD。
'
TRANSPORT_TABLESPACES=tablespace_name [, ...]
-- 指定導出的資料庫對象的版本,預設值COMPATIBLE
'
COMPATIBLE:導出元數據版本與資料庫相容性級別一致,這是預設值,資料庫相容性值必須大於等於9.2;
LATEST:導出元數據版本與資料庫發行版一致;
version_string:指定資料庫發行版,如11.2.0,在11g環境下,該值不能低於9.2。
'
VERSION=[COMPATIBLE | LATEST | version_string]
------------------------------------------------------------------------------
-- 以下是交互模式(interactive-command mode)下的命令,在交互模式下,當前導出任務依然在運行,但日誌輸出是掛起狀態,同時會現Export>提示符。
'
開啟交互模式有以下兩種方式:
1.通過客戶端連接,執行Ctrl+C;
2.通過另一個終端,使用expdp命令與參數ATTACH連接到正在運行的導出任務。
'
The following commands are valid while in interactive mode.
Note: abbreviations are allowed.
-- 為導出任務添加額外導出文件,可以使用變數%U
'
file_name中不能包含任何目錄信息,如果沒有指定則預設為導出目錄,有指定需以冒號(:)隔開。
'
ADD_FILE=[directory_object:]file_name [,...]
-- 從交互模式轉換為日誌記錄模式
'
在日誌記錄模式下,導出任務狀態還是會持續輸出到終端,如果當前任務是停止的,CONTINUE_CLIENT也會重新啟動任務。
'
Export> CONTINUE_CLIENT
-- 退出導出任務客戶端會話,同時退出日誌記錄模式,但保持當前任務的運行狀態
'
因為導出任務還在運行,所以在之後的某個時間可以通過客戶端連接任務,為了獲取任務的狀態信息,可以查詢日誌文件或者通過視圖USER_DATAPUMP_JOBS或動態視圖V$SESSION_LONGOPS。
'
Export> EXIT_CLIENT
-- 重新定義之後產生的導出文件大小,預設單位位元組
'
可以參考參數FILESIZE的用法。
'
FILESIZE=integer[B | KB | MB | GB | TB]
-- 指供交互模式的命令信息
Export> HELP
-- 斷開當前所有的客戶端會話並且中止當前的導出任務
'
使用KILL_JOB中止的導出任務不能被重新啟動,所有連接到導出任務的客戶端會話(包括執行KILL_JOB的會話)都會斷開並會收到警告信息,當所有客戶端會斷開之後,任務的工作進程也跟著停止,master table和導出文件集都會刪除,但日誌文件不會被刪除。
'
Export> KILL_JOB
-- 調整當前導出任務的活動進程數,即調整導出任務的並行度
PARALLEL=integer
REUSE_DUMPFILES
Overwrite destination dump file if it exists [N].
-- 啟動當前會話連接的導出任務
'
START_JOB會重新啟動當前會話連接的導出任務(導出任務當前無法執行)。START_JOB會使一個未知錯誤或STOP_JOB中止的導出任務重新啟動,並且不會引起數據丟失和數據文件損壞。
'
Export> START_JOB
-- 顯示導出任務的狀態信息
'
可以參考參數STATUS的用法
'
STATUS[=integer]
-- 立刻停止或有序地停止當前的導出任務
'
如果當運行STOP_JOB之後master table和導出文件集沒有被重建,則連接導出之後還可以通過START_JOB重啟。
只執行STOP_JOB而不需加任何選項可以進行有序停止當前導出任務,同時會發出待確認的警告信息。有序停止會等待導出任務的工作進程完成當前的工作。
如果需要立刻中止當前導出任務,則使用STOP_JOB=IMMEDIATE,同時會發出待確認的警告信息,所有的連接客戶端會話,包括當前執行命令的會話都會斷開。當所有會話都斷開之後,導出任務會立刻停止,主進程不會等待工作進程完成當前任務,使用STOP_JOB=IMMEDIATE不存在損壞或數據丟失的風險。
'
STOP_JOB[=IMMEDIATE]
導出模式
全導出模式
需要導出全部資料庫數據。通過指定參數FULL,必須有DATAPUMP_EXP_FULL_DATABASE許可權。SCHEMA導出模式
需要導出指定SCHEMA的所有數據。預設的導出模式,要導出非導出用戶SCHEMA數據必須有DATAPUMP_EXP_FULL_DATABASE許可權。表空間模式
需要導出屬於表空間的所有數據。表導出模式
需要導出指定的表。可傳輸表空間模式
需要導出指定表或者指定表空間的元數據信息,便於表或表空間的數據遷移。詳見參數TRANSPORTABLE和TRANSPORTABLE_TABLESPACES說明。
用法示例
- 導出整個資料庫
$ expdp scott/tiger FULL=YES DIRECTORY=datapump DUMPFILE=full.dmp LOGFILE=full.log JOB_NAME=scott_full
- 導出SCHEMA
$ expdp scott/tiger SCHEMAS=scott DIRECTORY=datapump DUMPFILE=scott.dmp LOGFILE=scott.log JOB_NAME=scott_schema
- 導出表空間
$ expdp scott/tiger DIRECTORY=datapump DUMPFILE=scott_tbs_users.dmp LOGFILE=scott_tbs_users.log JOB_NAME=scott_tbs_users TABLESPACES=users
- 導出表數據(包含表的對象)
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp TABLES=employees
- 只導出表(或多張)數據(不包含其它表對象)
# 命令行方式
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_emp_job.dmp LOGFILE=hr_emp_job.log JOB_NAME=hr_emp_job TABLES=employees,jobs CONTENT=data_only
# PARFILE方式
$ vim hr_exp.par
DIRECTORY=datapump
DUMPFILE=hr_emp_job.dmp
LOGFILE=hr_emp_job.log
JOB_NAME=hr_emp_job
CONTENT=data_only
INCLUDE=TABLE:"IN ('EMPLOYEES', 'JOBS')"
$ expdp hr/hr PARFILE=hr_exp.par
- 只導出表索引(不包含其它對象)
$ expdp hr/hr TABLES=employees DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp CONTENT=metadata_only INCLUDE=INDEX:\"LIKE \'EMP%\'\"
- 導出表中部分數據
# 單張表
$ expdp hr/hr TABLES=employees CONTENT=data_only DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp QUERY='"where employee_id > 150"'
# 多張表
$ expdp hr/hr TABLES=employees,scott.emp CONTENT=data_only DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp QUERY='"where employee_id > 150"','scott.emp:"where empno = 7788"'
- 指定導出為多個文件
# 當需要指定導出多個文件時最好也指定並行導出或限定每個導出文件大小,否則expdp總是寫入第一個文件,對於其他文件只是生成大小為預設4k大小的文件,如果指定每個文件最大大小*文件數量不足以存儲導出任務數據,則會報錯中止,推薦使用替代變數%U。
# 確定文件數,指定並行度
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_1.dmp,hr_full_2.dmp PARALLEL=2 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未確定文件數,指定並行度
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp PARALLEL=3 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 確定文件數,指定文件最大大小(前提總大小足以存儲導出數據)
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_1.dmp,hr_full_2.dmp FILESIZE=80MB LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未確定文件數,指定並行度,指定文件最大大小
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp FILESIZE=50MB PARALLEL=2 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未確定文件數,指定文件最大大小
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp FILESIZE=50MB LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
- 壓縮導出文件
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full.dmp COMPRESSION=all LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
- 加密導出文件
# 只指定加密範圍(ENCRYPTION),必須開啟wallet,否則報錯
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION=all LOGFILE=hr.log JOB_NAME=hr
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: invalid operation
ORA-39188: unable to encrypt dump file set
ORA-28365: wallet is not open
# 開啟wallet
'
1.查詢存儲wallet文件目錄是否創建
SQL@dbabd> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ---------------------------------------- ------------------
file /data/app/oracle/admin/dbabd/wallet CLOSED
$ ll /data/app/oracle/admin/dbabd/wallet
ls: cannot access /data/app/oracle/admin/dbabd/wallet: No such file or directory
2.創建目錄
$ mkdir -pv /data/app/oracle/admin/dbabd/wallet
mkdir: created directory ‘/data/app/oracle/admin/dbabd/wallet’
3.開啟wallet
SYS@dbabd> alter system set encryption key identified by oracle;
System altered.
SQL@dbabd> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ---------------------------------------- ------------------
file /data/app/oracle/admin/dbabd/wallet OPEN
$ ls /data/app/oracle/admin/dbabd/wallet
ewallet.p12
'
# 只指定加密密碼(ENCRYPTION_PASSWORD),加密範圍(ENCRYPTION)預設為ALL
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION_PASSWORD=oracle LOGFILE=hr.log JOB_NAME=hr
# 指定加密範圍(ENCRYPTION),同時指定加密密碼(ENCRYPTION_PASSWORD),wallet不需要開啟
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION=all ENCRYPTION_PASSWORD=oracle LOGFILE=hr.log JOB_NAME=hr
- 預估導出所需空間大小
$ expdp hr/hr SCHEMAS=hr DIRECTORY=datapump ESTIMATE=statistics ESTIMATE_ONLY=yes JOB_NAME=hr
impdp工具
Oracle Data Pump Import(以下簡稱為import)是數據泵用於將數據和元數據從expdp導出文件集中導入目標資料庫的工具(對應操作系統命令為impdp)。
工作方式
與expdp工具相似,impdp命令行工具也有三種工作方式:
命令行方式(Command-Line Interface)
通過命令行方式直接為impdp指定相應的參數文件進行導入任務。參數文件方式(Parameter File Interface)
將命令行參數寫入參數文件,通過指定參數parfile來指定要讀取的參數文件,如果指定參數涉及引號,建議使用參數文件方式。命令交互方式(Interactive-Command Interface)
停止寫入日誌文件,並顯示Ixport>提示符,可以在提示符當中輸入相應的命令。可以在命令行方式和參數文件方式開始之後輸入Ctrl+C調用命令交互方式,命令交互方式也可以連接到正在執行或者已停止的任務。
命令說明
通過執行如下命令可以得出impdp主要參數用法說明:
$ impdp help=y
因為impdp大部分命令與expdp相同,以下只說明不同的部分:
[oracle@dbabd ~]$ impdp help=y
USERID must be the first parameter on the command line.
The available keywords and their descriptions follow. Default values are listed within square brackets.
-- 指定導入訪問數據時使用的特殊方法,預設值AUTOMATIC
'
AUTOMATIC:由數據泵自動選擇導出訪問數據方式;
DIRECT_PATH:使用直接路徑訪問方式;
EXTERNAL_TABLE:使用外部表訪問方式;
CONVENTIONAL:使用常規訪問方式。
建議使用預設值方式,讓數據泵自己選擇適合的方式。
限制:
1.如果同時指定了參數NETWORK_LINK,則忽略該參數選項;
2.可傳輸表空間導入任務不支持參數ACCESS_METHOD。
'
ACCESS_METHOD=[AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE | CONVENTIONAL]
ATTACH
Attach to an existing job.
For example, ATTACH=job_name.
CLUSTER
Utilize cluster resources and distribute workers across the Oracle RAC.
Valid keyword values are: [Y] and N.
CONTENT
Specifies data to load.
Valid keywords are: [ALL], DATA_ONLY and METADATA_ONLY.
-- 指定哪些數據類型在導入過程中需要作相應的特殊處理
'
DISABLE_APPEND_HINT:指定在數據對象導入的時候不使用APPEND hint的功能。如果資料庫中已經存在一部分需要導入的數據對象,為了提高應用對這部分數據的併發訪問能力,禁用APPEND hint可以收到不錯的效果,如果沒有指定DISABLE_APPEND_HINT,則預設會使用APPEND hint來導入數據;
SKIP_CONSTRAINT_ERRORS:指定在數據對象導入的時候如果遇到非延遲約束檢測衝突時繼續進行導入操作。該選項記錄哪些行引起了衝突但不會中止導入,如果沒有指定SKIP_CONSTRAINT_ERRORS,當遇到非延遲約束衝突時則預設會回滾數據對象導入操作。
限制:
1.如果指定了DISABLE_APPEND_HINT,則導入可能需要更長的時間;
2.如果指定了SKIP_CONSTRAINT_ERRORS,在導入過程中在相對應的數據對象上創建唯一索引或約束條件,則APPEND hint不會作用於對象的導入,所以對於這些對象的導入會花費較多時間;
3.即使指定了SKIP_CONSTRAINT_ERRORS,除非數據對象使用外部表方式導入,否則該選項也不會生效。
'
DATA_OPTIONS = [DISABLE_APPEND_HINT | SKIP_CONSTRAINT_ERRORS]
DIRECTORY
Directory object to be used for dump, log and SQL files.
DUMPFILE
List of dump files to import from [expdat.dmp].
For example, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
ENCRYPTION_PASSWORD
Password key for accessing encrypted data within a dump file.
Not valid for network import jobs.
ESTIMATE
Calculate job estimates.
Valid keywords are: [BLOCKS] and STATISTICS.
EXCLUDE
Exclude specific object types.
For example, EXCLUDE=SCHEMA:"='HR'".
FLASHBACK_SCN
SCN used to reset session snapshot.
FLASHBACK_TIME
Time used to find the closest corresponding SCN value.
-- 指定需要導入整個資料庫(或者從所有導出文件中導入),預設值YES
'
指定該參數需要有DATAPUMP_IMP_FULL_DATABASE角色許可權。
'
FULL
Import everything from source [Y].
HELP
Display help messages [N].
INCLUDE
Include specific object types.
For example, INCLUDE=TABLE_DATA.
JOB_NAME
Name of import job to create.
-- 指定導入任務的日誌文件名,也可以加上具體路徑,預設值import.log
LOGFILE=[directory_object:]file_name
NETWORK_LINK
Name of remote database link to the source system.
NOLOGFILE
Do not write log file [N].
PARALLEL
Change the number of active workers for current job.
PARFILE
Specify parameter file.
-- 指定在導入任務時是否創建表分區,當指定參數TABLES和TRANPORTABLE=ALWAYS進行導入時預設值為departition,否則為none
'
none:指定導入時根據表導出時的方式重建表。當表導出時是可傳輸模式並過濾了部分表分區或子分區時,不能指定該值,必須使用departition;
departition:指定對於導出時是分區表,導入時每個表分區或子分區創建為獨立的新表,表名繼承表分區和子分區名稱;
merge:指定對於導出時是分區表,導入時合併創建為一張新表。
關於分區表導入並行度的說明:
1.如果是分區表數據導入一張已存在的分區表,則數據泵導入時一次只能處理一個分區或子分區,將會忽略參數PARALLEL指定的值;
2.如果要導入的分區表並不存在,必須通過數據泵導入進行創建,則參數PARALLEL指定值可以提高導入並行度。
限制:
1.如果表導出狀態是可傳輸模式和指定表分區或子分區的導出時,在表導入時必須指定為PARTITION_OPTIONS=departition;
2.如果表導出狀態是可傳輸模式時,則表導入時不能使用PARTITION_OPTIONS=merge;
3.如果導入操作要對已授權表分區對象進行非分區化操作,則會提示錯誤信息且不會導入對象。
'
PARTITION_OPTIONS=[NONE | DEPARTITION | MERGE]
QUERY
Predicate clause used to import a subset of a table.
For example, QUERY=employees:"WHERE department_id > 10".
REMAP_DATA
Specify a data conversion function.
For example, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO.
-- 指定重映射導出文件中對於語句CREATE TABLESPACE、CREATE LIBRARY和CREATE DIRECTORY語句的數據文件引用對象
'
對於需要在不同操作系統平臺轉換數據文件路徑命名規則時較為適用,在導入的過程中可以進行數據文件的重映射。建議源路徑名和目標路徑名都用雙引號("")包圍,最好可以採用參數文件方式,避免不必要的轉義符使用。
'
REMAP_DATAFILE=source_datafile:target_datafile
-- 指定重映射導出文件中對象所屬的SCHEMA
'
REMAP_SCHEMA可以指定多個,但每一個的source_schema必須不相同,不同的source_schema可以映射到相同的target_schema中。
如果需要重映射的target_schema不存在,則在導入的過程中會創建,前提是在導出文件中包含針對source_schema的CREATE USER元數據信息和創建所需要的許可權;
如果導出文件當中沒有包含創建SCHEMA所需的元數據信息或者導入用戶沒有創建的相應許可權,則target_schema必須在導入操作之前創建完成;
如果導入操作沒有創建SCHEMA,當導入操作完成之後必須為SCHEMA指定一個新的密碼進行連接,SQL語句如下:
SQL> ALTER USER schema_name IDENTIFIED BY new_password
限制:
1.不具有許可權的用戶只能夠執行target_schema是本身用戶的重映射操作,如SCOTT可以重映射BLAKE對象到SCOTT,但沒辦法重映射自身對象到BLAKE;
2.如果導入正在重映射的任何表中包含用戶定義的對象類型,併在導出和導入之間發生了變化,則該表的導入操作將失敗,但是整個導入操作會繼續進行;
3.預設情況下,SCHEMA對象在源資料庫中都有對象標識符(OID),在導入時會將OID一同導入到目標資料庫中。如果導入操作也是在源資料庫上進行操作,則會發生OID的衝突導致導入操作失敗,解決方式是指定參數TRANFORM=OID:N進行導入,這樣會為導入對象創建一個新的OID,允許導入操作成功進行。
'
REMAP_SCHEMA=source_schema:target_schema
-- 指定在導入過程中重命名錶名
'
可以使用REMAP_TABLE重命名整張表或者當導入操作將分區表轉化為非分區表時進行重命名。
當使用如下第一種書寫方式時,假設有REMAP_TABLE=A.B:C,則A是SCHEMA名,B是舊表名,C為新表名,如果需要將表的分區重命名為非分區表,則必須指定SCHEMA名;
當使用如下第二種書寫方式時,如果需要將表的分區重命名為非分區表,則只需要對舊表名進行限定,不用指定SCHEMA名。
限制:
1.只有在進行導入操作的表才能進行重命名,已存在的表不支持;
2.如果需要重映射的表在相同SCHEMA中具有命名約束,並且在創建表時需要創建約束,則REMAP_TABLE不生效。
'
REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename
或
REMAP_TABLE=[schema.]old_tablename[:partition]:new_tablename
-- 指定在導入操作時所有選擇的對象及其包含的持久數據重映射在新的表空間中創建
'
REMAP_TABLESPACE可以指定多個,但每一個的source_tablespace必須不相同,並且導入的目標SCHEMA需要在target_tablespace具有合適的表空間配額。
使用REMAP_TABLESPACE是對象在導入操作重映射表空間的唯一方法,適用於幾乎所有的對象,包括用戶等。
'
REMAP_TABLESPACE=source_tablespace:target_tablespace
-- 指定導入操作任務是否重用已存的數據文件創建表空間,預設值NO
'
如果指定預設值NO並且在CREATE TABLESPACE語句中的數據文件已經存在,則CREATE TABLESPACE將報錯,但導入任務會繼續。
如果指定值為YES,則已存在的數據文件會被初始化,有可能會導致數據丟失。
'
REUSE_DATAFILES=[YES | NO]
-- 指定導入任務方式為SCHEMA模式導入,當使用基於網路導入模式時,該模式為預設模式
'
如果執行導入操作的用戶具有DATAPUMP_IMP_FULL_DATABASE角色許可權,則可以通過該參數SCHEMAS指定需要進行該模式導入的SCHEMA列表,首先是用戶定義語句(前提是事先並不存在)、系統和角色許可權授予、密碼歷史紀錄等等,其次是導入SCHEMA包含的所有對象。如果沒有DATAPUMP_IMP_FULL_DATABASE角色許可權,則只能導入用戶自身的SCHEMA。
'
SCHEMAS=schema_name [,...]
SERVICE_NAME
Name of an active Service and associated resource group to constrain Oracle RAC resources.
-- 指定導入操作是否跳過表中標記為Unusable狀態的索引,預設值依據資料庫參數SKIP_UNUSABLE_INDEXES指定的值
'
如果該參數的值為YES,則遇到表或者表分區當中的索引是Unusable狀態時導入操作依然會進行,就像該索引不存在一樣;
如果該參數的值為NO,則遇到表或者表分區當中的索引是Unusable狀態時導入操作不會進行,其他表如果之前沒有設置Unusable狀態的索引依然會進行導入更新;
如果參數未指定,則依據數據參數SKIP_UNUSABLE_INDEXES指定的值(預設為TRUE)來處理;
如果索引被用來強制執行約束但並標記為Unusable狀態,則表的數據不會被導入。
此參數只適用於導入目標庫中已存在表一部分數據時有用,如果表和索引的創建作為導入操作的一部分,則這個參數沒有意義。
'
SKIP_UNUSABLE_INDEXES=[YES | NO]
SOURCE_EDITION
Edition to be used for extracting metadata.
-- 指定將導入操作基於其他參數需要執行的DDL語句寫入到文件中
'
file_name指定需要寫入SQL DDL語句的文件名,可以額外為其指定目錄(前提是用戶需要有讀寫許可權),SQL語句實際上並沒有執行,連接用戶的密碼並不存儲在該文件中。
限制:
1.如果指定了SQLFILE,參數CONTENT如果指定值為ALL或DATA_ONLY則被忽略;
2.如果導入操作使用到了ASM,則SQLFILE必須寫入到磁碟文件,而不是寫到ASM中;
3.SQLFILE不能與參數QUERY聯合使用。
'
SQLFILE=[directory_object:]file_name
STATUS
Frequency (secs) job status is to be monitored where
the default [0] will show new status when available.
-- 指定是否導入在導出文件中包含的Streams元數據,預設值YES
STREAMS_CONFIGURATION=[YES | NO]
-- 指定導入操作對目標資料庫中已存在表如何處理,預設值SKIP(當指定參數CONTENT=DATA_ONLY時,預設值為APPEND)
'
SKIP:讓已存在的表保持原樣並跳過至下一個對象進行導入,如果指定參數CONTENT=DATA_ONLY,該選項無效;
APPEND:保持已存在的表原有行數據不變,並追加新的行數據;
TRUNCATE:對已存在的表執行TRUNCATE操作後再插入新的行數據;
REPLACE:刪除已存在的表然後從導出文件中重新創建表並插入新的行數據,如果指定參數CONTENT=DATA_ONLY,該選項無效。
註意:
1.當指定參數值為TRUNCATE或REPLACE時,需確保受影響表中的行不受參考約束的限制;
2.當指定參數值為SKIP、APPEND或TRUNCATE時,對於源端已存在的表獨立對象,如索引、對象授權、觸發器和約束都不會被修改。當指定參數值為REPLACE時,如果沒有顯式或隱式的指定EXCLUDE排除對象,則源端獨立對象會被刪除並且重建;
3.當指定參數值為APPEND或TRUNCATE時,將會先對源端表數據行與已存在的表數據行是否相容,然後再執行其它操作:
(1).如果已存在的表存在活動狀態的約束和觸發器,則導入操作使用外部表訪問方式進行,假如行數據與約束衝突,則導入操作失敗,數據也不會被導入,可以通過參數DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS跳過檢查;
(2).如果表數據是必須被導入,但有可能會引起約束檢測衝突,解決方式可以先禁用約束檢測,導入完數據並且清除導致衝突的數據再重新啟用約束。
4.當指定參數值為APPEND時,導入數據總是會使用新的空間,即使原先有空閑空間也不會被重覆使用,所以可能需要在導入完成之後進行數據壓縮。
'
TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]
TABLES
Identifies a list of tables to import.
For example, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995.
-- 指定導入任務方式為表空間模式(tablespace-mode)導入
'
該參數指定在導出文件集中(FULL、SCHEMA、TABLESPACE和TABLE的導出模式)或其它源資料庫里哪些表空間和表空間下麵包含的表以及獨立對象會被導入。
以下情況導入操作會自動創建表空間:
1.導入模式是FULL模式或使用可傳輸表空間模式(TRANSPORT_TABLESPACES);
2.導入模式是表模式,但同時指定了TRANSPORTABLE=ALWAYS。
對於其他模式的導入都需要表空間事先存在,也可以通過參數REMAP_TABLESPACE指定重映射到已存在的表空間。
'
TABLESPACES=tablespace_name [, ...]
-- 可以參考expdp中的SOURCE_EDITION參數說明
TARGET_EDITION
Edition to be used for loading metadata.
-- 指定更改導入對象DDL創建語句
'
transform_name指定需要轉換的名稱,主要有以下幾種:
1.SEGMENT_ATTRIBUTES(段屬性):如果指定值為y,則段屬性(物理屬性、存儲屬性、表空間和日誌記錄都包含在內)及適合的DDL語句。預設值為y。
2.STORAGE(存儲):如果指定值為y,則包含存儲子句及適合的DDL語句。預設值為y。如果選項SEGMENT_ATTRIBUTES=n則忽略該選項的值。
3.OID(對象標識符):如果指定值為n,則在導入時禁止為導出的表和類別對象創建新的OID。導入為對象創建新的OID對於SCHEMA的克隆很有用,但並不會影響參考的對象。預設值為y。
4.PCTSPACE:指定數據文件當中區分配的百分比大小。指定值必須是一個大於0的數值。
5.SEGMENT_CREATION(段創建):如果指定值為y,則SEGMENT CREATION子句會加入到CREATE TABLE語句中,SEGMENT CREATION會以SEGMENT CREATION DEFERRED或SEGMENT CREATION IMMEDIATE的形式存在。如果指定值為n,則在CREATE TABLE省略SEGMENT CREATION子句,使用資料庫預設創建段的方式。
value指定轉換的取值,根據轉換的種類來決定取值,從以上取值可發現,除了PCTSPACE需要為數值時,其它的都是y/n。
object_type指定轉換類型,為可選項,如果沒指定的話則應用於所有的對象類型。詳細可以參考官方文檔:
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm#SUTIL939
'
TRANSFORM = transform_name:value[:object_type]
-- 指定導入任務方式為表模式(table-mode)導入是否使用可傳輸選項導入指定表、表分區和子分區的元數據,預設值NEVER
'
ALWAYS:指定導入任務使用可傳輸選項,該選項與參數TABLES一起使用時只導入表、表分區和子分區的元數據;
NEVER:指定導入任務使用直接路徑或外部表方法導入數據而不使用可傳輸選項,這是預設值。
其他說明可以參考expdp同名參數說明。
限制:
1.TRANSPORTABLE參數只有與參數NETWORK_LINK一起使用時才生效;
2.TRANSPORTABLE參數只適用於表模式導入任務(表不能被分區或生成子分區);
3.要執行可傳輸選項的導入任務,用戶在源端需要有DATAPUMP_EXP_FULL_DATABASE角色許可權,在目標端需要有DATAPUMP_IMP_FULL_DATABASE角色許可權;
'
TRANSPORTABLE = [ALWAYS | NEVER]
-- 指定一個或多個數據文件通過可傳輸表空間模式導入目標資料庫,或者在導出期間使用參數TRANSPORTABLE=ALWAYS並使用表模式導入。數據文件必須在目標資料庫存在。
'
datafile_name必須以絕對路徑的方式提供。
在執行導入任務操作之前,數據文件必須拷貝到目標端操作系統中,同時也可以對數據文件進行重命名操作。
如果已經有存在通過可傳輸表空間導出的轉儲文件,則可以通過可傳輸模式執行導入任務,通過指定轉儲文件(包含元數據)和指定參數TRANSPORT_DATAFILE來實現。參數TRANSPORT_DATAFILE為導入任務指明從哪裡獲取實際的數據。
'
TRANSPORT_DATAFILES=datafile_name
-- 指定是否驗證通過可傳輸表空間導出的文件是否被屬於其它表空間的對象引用,預設值NO
'
參數說明可以參考expdp同名參數。
該參數只有當與參數NETWORK_LINK一起使用且針對可傳輸模式的導出(或對指定參數TRANSPORTABLE=ALWAYS的表模式導出)才生效。
'
TRANSPORT_FULL_CHECK=[YES | NO]
-- 指定哪些表空間通過DBLINK進行可傳輸表空間模式的導入任務
'
該參數是將指定的一個或多個表空間元數據從源端資料庫導入到目標資料庫。
因為是可傳輸模式的導入任務,所以在導入過程中數據泵會自動創建表空間,但是必須在執行導入任務之前拷貝相應的數據文件到目標資料庫。
因為在進行基於DBLINK的可傳輸表空間導入任務中指定了參數NETWORK_LINK,所以在數據傳輸過程當中並沒有生成導出文件,因此還必須指定參數TRANSPORT_DATAFILES來確保impdp工具從哪裡獲取實際的數據,該數據文件在先前已經拷貝成功。
如果之前已經通過可傳輸表空間模式的導出任務生成了導出文件集,則也可以執行基於導出文件的可傳輸表空間模式的導入任務,但在這種情況下不再需要指定參數TRANSPORT_TABLESPACES或者NETWORK_LINK,指定了這兩個參數反而會報錯,只需要指定導出文件集和參數TRANSPORT_DATAFILES即可。
限制:
1.通過可傳輸表空間模式進行導出導入任務時,目標資料庫版本必須不低於源端資料庫;
2.該參數只有與參數NETWORK_LINK一起使用才生效;
3.可傳輸模式不支持加密欄位;
4.可傳輸表空間導入任務不支持參數ACCESS_METHOD。
'
TRANSPORT_TABLESPACES=tablespace_name [, ...]
VERSION
Version of objects to import.
Valid keywords are: [COMPATIBLE], LATEST or any valid database version.
Only valid for NETWORK_LINK and SQLFILE.
------------------------------------------------------------------------------
-- 以下交互模式命令說明與expdp一致
The following commands are valid while in interactive mode.
Note: abbreviations are allowed.
CONTINUE_CLIENT
Return to logging mode. Job will be restarted if idle.
EXIT_CLIENT
Quit client session and leave job running.
HELP
Summarize interactive commands.
KILL_JOB
Detach and delete job.
PARALLEL
Change the number of active workers for current job.
START_JOB
Start or resume current job.
Valid keywords are: SKIP_CURRENT.
STATUS
Frequency (secs) job status is to be monitored where
the default [0] will show new status when available.
STOP_JOB
Orderly shutdown of job execution and exits the client.
Valid keywords are: IMMEDIATE.
導入模式
全導入模式
需要導入全部資料庫數據。通過指定參數FULL,必須有DATAPUMP_IMP_FULL_DATABASE許可權,這是基於文件導入的預設模式。SCHEMA導入模式
需要導入指定SCHEMA的所有數據。導入源可以是FULL、表、表空間或SCHEMA模式導出轉儲文件集或其他資料庫,要導入非導入用戶SCHEMA數據必須有DATAPUMP_IMP_FULL_DATABASE許可權。表空間模式
需要導入屬於表空間的所有數據,導入源可以是FULL、表、表空間或SCHEMA模式導出轉儲文件集或其他資料庫。表導入模式
需要導入指定的表,導入源可以是FULL、表、表空間或SCHEMA模式導出轉儲文件集或其他資料庫,如果要導入不屬於導入用戶SCHEMA的表,則必須有DATAPUMP_IMP_FULL_DATABASE許可權。可傳輸表空間模式
需要導入指定表或者指定表空間的元數據信息,便於表或表空間的數據遷移,必須有DATAPUMP_IMP_FULL_DATABASE許可權。詳見參數TRANSPORTABLE_TABLESPACES和TRANSPORT_DATAFILES說明。
用法示例
- 數據準備
先使用SYS用戶通過expdp執行一次FULL模式的導出:
$ expdp "'/ as sysdba'" FULL=yes DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=expfull.log JOB_NAME=expfull
- 導入整個資料庫
$ impdp "'/ as sysdba'" FULL=yes DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=impfull.log JOB_NAME=impfull
- 導入SCHEMA
# 先查詢原先資料庫SCOTT用戶SCHEMA對象信息
SQL@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SCOTT PK_DEPT INDEX
SCOTT DEPT TABLE
SCOTT EMP TABLE
SCOTT PK_EMP INDEX
SCOTT BONUS TABLE
SCOTT SALGRADE TABLE
6 rows selected
# 刪除SCOTT用戶及所有SCHEMA對象
SQL@dbabd> drop user scott cascade;
User dropped
SYS@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
no rows selected
SYS@dbabd> select * from all_users where username = 'SCOTT';
no rows selected
# 執行SCHEMA模式導入SCOTT
$ impdp "'/ as sysdba'" SCHEMAS=scott DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=imp_scott.log JOB_NAME=imp_scott
# 查詢驗證
SQL@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SCOTT SALGRADE TABLE
SCOTT BONUS TABLE
SCOTT EMP TABLE
SCOTT DEPT TABLE
SCOTT PK_DEPT INDEX
SCOTT PK_EMP INDEX
6 rows selected
- 導入表數據(包含表的對象)
# 以scott.emp表為例
:'
1.表行數
SYS@dbabd> select count(*) from scott.emp;
COUNT(*)
----------
14
2.表索引
SQL@dbabd> select owner,index_name,table_owner,table_name from dba_indexes where table_name = 'EMP';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME
-------------------- -------------------- -------------------- --------------------
SCOTT PK_EMP SCOTT EMP
3.