目錄對象
- 數據泵必須在 服務端 執行;使用數據泵,需要先創建目錄對象,並且需要為數據庫用戶授予使用該 directory 的權限
- 當你創建一個 directory 時,會自動獲得該 directory 的 READ / WRITE / EXECUTE 權限,你也可以將這些權限授給其他用戶或角色
SELECT * FROM dba_directories; 查詢已有的目錄
CREATE OR REPLACE DIRECTORY exp_dir AS '/oratmp'; 自定義目錄對象
GRANT READ,WRITE ON DIRECTORY dir_dump TO u1; 授予 u1 用戶對該目錄的讀寫權限
DROP DIRECTORY exp_dir; 刪除目錄
隱含參數 trace
- 可以通過在 Export DataPump(expdp)或 Import DataPump(impdp)的TRACE 參數中指定7位十六進制掩碼來啟用跟蹤;前三位啟用對特定數據泵組件的跟蹤,而最后四位數通常為:0300
- 可以省略前導零,並且為 TRACE 參數指定的值不區分大小寫
- 在為 TRACE 參數指定值時需要記住一些規則:
- 不要指定多於 7個十六進制數字
- 不要指定典型的十六進制規范字符 前導 0x
- 不要將十六進制值轉換為十進制值;
- 省略任何前導零(不強制要求);
- 值不區分大小寫
- 使用 TRACE 參數時,如果數據泵作業與非特權用戶一起運行,則可能會發生錯誤,例如:
expdp scott/tiger DIRECTORY=my_dir DUMPFILE=expdp_s.dmp LOGFILE=expdp_s.log TABLES=emp TRACE=480300
Export: Release 10.2.0.3.0 - Production on Friday, 19 October, 2007 13:46:33
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options
ORA-31631: privileges are required
- 要解決此問題,請確保使用 expdp 或 impdp 連接到數據庫的用戶是特權用戶(即具有DBA 角色、 EXP_FULL_DATABASE 或 IMP_FULL_DATABASE 角色),例如:
-- run this Data Pump job with TRACE as a privileged user:
expdp system/manager DIRECTORY=my_dir DUMPFILE=expdp_s.dmp LOGFILE=expdp_s.log TABLES=scott.emp TRACE=480300
-- or:
-- make user SCOTT a privileged user:
CONNECT / AS SYSDBA
GRANT exp_full_database TO scott;
expdp scott/tiger DIRECTORY=my_dir DUMPFILE=expdp_s.dmp LOGFILE=expdp_s.log TABLES=emp TRACE=480300
- 數據泵作業期間發生的大多數錯誤可以通過為主控制進程(MCP)和工作進程創建一個跟蹤文件來診斷,例如:
-- To run a Data Pump job with standard tracing:
-- This results in two trace files in BACKGROUND_DUMP_DEST:
-- Master Process trace file: <SID>_dm<number>_<process_id>.trc
-- Worker Process trace file: <SID>_dw<number>_<process_id>.trc
expdp system/manager DIRECTORY=my_dir DUMPFILE=expdp_s.dmp LOGFILE=expdp_s.log SCHEMAS=scott TRACE=480300
-
可以顯式地指定數據泵組件,以獲取該組件的詳細 trace 信息:
-
跟蹤數據泵組件的組合是可能的,例如:
-
對於初始數據泵跟蹤,值 480300 足夠。當指定值 480300 時,我們將追蹤主控制進程(MCP)和工作進程(DW);創建數據泵跟蹤文件時,我們建議使用值 480300,除非 Oracle Support 要求不同的跟蹤級別
一、數據泵導出介紹
- 數據泵導出是將數據和元數據卸載到操作系統文件集合(稱為 dump 文件集)的工具,dump 文件集只能使用數據泵導入工具(impdp)導入
- dump 文件集可以被導入到同一系統,亦可以移動到另一系統進行加載
- dump 文件集由一或多個磁盤文件組成,包含表數據、數據庫對象元數據、控制信息的。文件以專有的二進制格式編寫。在導入操作期間,Data Pump Import 程序使用這些文件來定位 dump 文件集中的每個數據庫對象
二、數據泵導出界面
- 使用 expdp 命令調用數據泵導出程序。導出操作的特征由指定的導出參數決定,可以在命令行或參數文件中指定這些參數
- 1)命令行界面:可以直接在命令行中指定大部分導出參數
- 2)參數文件界面:允許參數文件中指定命令行參數。唯一的例外是 PARFILE 參數,因為參數文件不能嵌套。如果使用值需要引號的參數,建議使用參數文件
- 3)交互命令界面:停止終端的日志記錄並顯示 Export 提示,從中可以輸入各種命令,其中一些命令特定於交互式命令模式。在使用命令行或參數文件界面啟動的導出操作期間,按 Ctrl + C 啟用此模式。當 attach 到正在執行或停止的作業時,也會啟用交互式命令模式
三、數據泵導出模式
- 1)全庫導出:使用 FULL 參數指定,該模式下,整個數據庫被卸載、該模式需要你具有 DATAPUMP_EXP_FULL_DATABASE 角色
- 2)Schema 導出:使用 SCHEMAS 參數指定 ,這是默認的導出模式。如果你具有 DATAPUMP_EXP_FULL_DATABASE 角色,那么你可以指定一個 shema 列表,包括 schema 定義,以及授予這些 schema 的系統權限;如果你不具有 DATAPUMP_EXP_FULL_DATABASE 角色,那你只能導出自己的 schema
SYS schema 不可以作為一個導出作業的源 schema - 3)表模式:使用 TABLES 參數指定,在表模式下,只卸載一組表、分區以及它們所依賴的對象
- 4)表空間模式:使用 TABLESPACES參數指定。在表空間模式下,僅卸載指定的一組表空間中所包含的表;如果一個表被卸載,那么它所依賴的對象也被卸載;對象的元數據和數據都被卸載。特權用戶獲取所有表,非特權用戶只能獲取在自己 schema 中的表
四、導出命令行模式下可用的參數
指定導出參數
- 對於可以指定多個值的參數,可以使用逗號或空格分隔這些值,例如:
TABLES=employees, jobs
或TABLES=employees jobs
- 對於輸入的每一個參數來說,必須指定等號(=)和值,例如,在下面的命令行中,即使 NOLOGFILE 是一個有效的參數,它也會被解釋為 DUMPFILE 參數的另一個 dump 文件名
expdp DIRECTORY=dpumpdir DUMPFILE=test.dmp NOLOGFILE TABLES=employees
- 該命令會生成兩個 dump 文件:test.dmp 和 nologfile.dmp
- 為了避免該現象,指定 NOLOGFILE=YES 或 NOLOGFILE=NO
在數據泵命令行上使用引號
- 某些操作系統會將引號作為特殊字符處理,因此不會將它們傳遞給應用程序,除非它們前面帶有轉義字符,例如反斜杠(\)。在命令行和參數文件中都是如此。一些操作系統可能需要在包含特殊字符的整個參數值的命令行上附加一組單引號或雙引號
- 假設在參數文件中指定 TABLES 參數,如下所示:
TABLES = \"MixedCaseTableName \"
- 如果要在命令行中指定,某些操作系統將要求將其使用單引號括起來,如下所示:
TABLES =' \"MixedCaseTableName \" '
- 為了避免在命令行上提供額外的引號,Oracle 建議使用參數文件。另外請注意,如果使用參數文件,並且指定的參數值沒有引號作為字符串中的第一個字符(例如TABLES=scott."EmP"),則在某些系統上可能不需要使用轉義字符
ACCESS_METHOD
- 默認: AUTOMATIC
- 目的:指示導出使用特定的方法卸載數據
ACCESS_METHOD = [AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE]
- 如果默認的方法不適用,可以使用該參數指定其他方式。Oracle 建議盡可能使用默認選項(AUTOMATIC),因為它允許 Data Pump 自動選擇最有效的方法
- 限制:如果還指定了 NETWORK_LINK 參數,則不支持直接路徑模式
expdp hr DIRECTORY = dpump_dir1 DUMPFILE = expdat.dmp SCHEMAS = hr ACCESS_METHOD = EXTERNAL_TABLE
ATTACH
- 默認值:當前在用戶 schema 中的作業,如果只用一個
- 目的:連接到現有導出作業的客戶端會話並自動將您置於交互式命令界面。導出會顯示所連接的作業的描述,並顯示
"Export" 提示
ATTACH [= [ schema_name. ] job_name ]
- schema_name 是可選的。要指定除自己以外的 schema,您必須具有該DATAPUMP_EXP_FULL_DATABASE角色
- job_name 是可選的, 如果 schema 中只有一個導出作業,並且該作業是 active 的
- 要連接到已停止的作業,必須提供作業名稱。要查看數據泵作業名稱列表,可以查詢 DBA_DATAPUMP_JOBS 或 USER_DATAPUMP_JOBS 視圖
- 限制
- 指定 ATTACH 參數時,可以在命令行中指定的唯一數據泵參數是ENCRYPTION_PASSWORD
- 如果附加到的作業最初是使用加密密碼初啟動的,則在附加到作業時,必須再次在命令行中輸入 ENCRYPTION_PASSWORD 參數以重新指定該密碼。唯一的例外是如果作業最初是用 ENCRYPTION=ENCRYPTED_COLUMNS_ONLY 參數啟動的。在這種情況下,附加到作業時不需要加密密碼
- 除非已經在運行,否則您無法附加到另一個 schema 中的作業
- 如果作業的 dump 文件集或主表已被刪除,則附加操作會失敗
- 以任何方式更改主表都將導致不可預測的結果
- 示例:它假定該作業 hr.export_job 已經存在
expdp hr ATTACH = hr.export_job
CONTENT
- 默認: ALL
- 目的:指定導出操作要過濾什么數據:僅數據、僅元數據、或都有
CONTENT = [ALL | DATA_ONLY | METADATA_ONLY]
- ALL 卸載數據和元數據。這是默認值
- DATA_ONLY 僅卸載表行數據,沒有數據庫對象定義被卸載
- METADATA_ONLY 僅卸載數據庫對象定義, 沒有表行數據被卸載。請注意,如果指定 CONTENT=METADATA_ONLY,那么隨后導入 dump 文件時,導入后從 dump 文件導入的索引或表的統計信息將被鎖定
- 限制:該 CONTENT=METADATA_ONLY 參數不能與TRANSPORT_TABLESPACES(可傳輸表空間模式)參數或 QUERY 參數一起使用
- 示例:
> expdp hr DIRECTORY = dpump_dir1 DUMPFILE = hr.dmp CONTENT = METADATA_ONLY
此命令將執行 schema 模式導出,僅卸載與 hr 用戶關聯的元數據
DIRECTORY
- 默認: DATA_PUMP_DIR
- 目的:指定導出可以寫入 dump 文件集和日志文件的默認位置
DIRECTORY = directory_object
- directory_object 是數據庫目錄對象的名稱(而不是實際目錄的文件路徑)
- 安裝數據庫后,特權用戶可以訪問名為 DATA_PUMP_DIR 的默認目錄對象。具有訪問默認目錄對象的用戶根本不需要使用 DIRECTORY參數
- 在 DUMPFILE 或 LOGFILE 參數上指定的目錄對象將覆蓋為 DIRECTORY 參數指定的對象
- 示例:
expdp hr DIRECTORY = dpump_dir1 DUMPFILE = employees.dmp CONTENT = METADATA_ONLY
employees.dmp 文件將被寫入與 dpump_dir1 目錄對象相關聯的路徑
DUMPFILE
- 默認值:expdat.dmp
- 目的:指定 dump 文件的名稱、目錄對象
DUMPFILE = [ directory_object:] file_name [ , ...]
- directory_object 是可選的,如果已經使用 DIRECTORY 參數建立了一個。如果在此處提供一個值,那么它必須是已經存在並且可以訪問的目錄對象
- 可以提供多個 file_name,使用逗號分隔,或者使用多個 DUMPFILE 參數。如果文件名沒有擴展名,則導出會使用默認文件擴展名 .dmp。文件名可以包含一個替換變量(%U),這意味着可能會生成多個文件。替換變量在結果文件名中擴展為從 01 開始並以 99 結尾的2位固定寬度遞增整數。如果文件名中包含兩個替換變量,則兩者都將同時遞增。例如,exp%Uaa%U.dmp 將解析為 exp01aa01.dmp,exp02aa02.dmp,等等
- 如果指定了 FILESIZE 參數,那么每個 dump 文件的最大值將不會超過此大小並且不能擴展。如果 dump 文件集需要更多空間,並且提供了帶有替換變量(%U)的模板,如果設備上有空間,則會自動創建一個新的 dump 文件,該參數大小由參數 FILESIZE指定
- 限制:任何與已存在的 dump 文件名匹配的 dump 文件名將會生成錯誤,並且已存在的文件將不會被覆蓋;可以通過指定導出參數 REUSE_DUMPFILES=YES 來覆蓋此行為
- 示例:
expdp hr SCHEMAS = hr DIRECTORY = dpump_dir1 DUMPFILE = dpump_dir2:exp1.dmp, exp2%U.dmp PARALLEL = 3
- exp1.dmp 文件將被寫入與 dpump_dir2 相關聯的路徑,因為 dpump_dir2被指定為轉儲文件名的一部分,因此覆蓋了使用DIRECTORY 參數指定的目錄對象。因為三個並行進程將給予給這項作業,轉儲文件命名為 exp201.dmp,並 會根據指定的替代變量 exp2%U.dmp 來創建 exp202.dmp 。因為沒有為它們指定目錄,所以它們將被寫入DIRECTORY參數指定的目錄對象 dpump_dir1 所關聯的路徑
ESTIMATE
- 默認: BLOCKS
- 目的:指定將用於估算導出作業中的每個表將占用多少磁盤空間(以字節為單位)的方法。估計值會打印在日志文件中,並顯示在客戶端的標准輸出設備上。估計僅用於表行數據,它不包括元數據
ESTIMATE = [BLOCKS | STATISTICS]
- BLOCKS 通過將源對象使用的數據庫塊的數量乘以適當的塊大小來計算估計值
- STATISTICS 使用每個表的統計量計算估計。為了使這種方法盡可能准確,所有的表都應該被分析了(可以使用 ANALYZE 語句或 DBMS_STATS 包進行表分析)
- 限制:
- 如果數據泵導出作業涉及壓縮表,則當使用 ESTIMATE=BLOCKS 時,估計的壓縮表大小是不准確的。這是因為大小估計不會映射以壓縮形式存儲的數據。要獲得壓縮表的更准確的大小估計,請使用 ESTIMATE=STATISTICS
- 如果使用 QUERY或REMAP_DATA參數,估計可能也不准確
- 示例:
expdp hr TABLES = employees ESTIMATE = STATISTICS DIRECTORY = dpump_dir1 DUMPFILE = estimate_stat.dmp
ESTIMATE_ONLY
- 默認: NO
- 目的:估計導出作業將消耗的空間,而不實際執行導出操作
ESTIMATE_ONLY = [YES | NO]
- 如果 ESTIMATE_ONLY= YES,則估計將被消耗的空間,但並不實際執行導出操作而退出
- 限制:該參數不能與QUERY參數結合使用
- 示例:使用該參數確定導出 HR 用戶需要多少空間
expdp hr ESTIMATE_ONLY = YES NOLOGFILE = YES SCHEMAS = HR
FILESIZE
- 默認值:(0 相當於最大大小為16 TB)
- 目的:指定每個轉儲文件的最大大小。如果轉儲文件集的任何成員達到大小,那么該文件將被關閉,並嘗試創建一個新文件,如果文件名中包含一個替換變量,或者已將其他轉儲文件添加到作業中
FILESIZE = integer [B | KB | MB | GB | TB]
- 字節是默認值。生成的文件的實際大小可能略微向下舍入,以匹配轉儲文件中使用的內部塊的大小
- 限制:文件的最小值是默認數據泵塊大小的十倍,為4千字節;文件的最大值為16 TB
- 示例:將轉儲文件的大小設置為3兆字節
expdp hr DIRECTORY = dpump_dir1 DUMPFILE = hr_3m.dmp FILESIZE = 3MB
- 如果3兆字節不足以容納所有導出的數據,則會顯示以下錯誤,並且該作業將停止:
ORA-39095: Dump file space has been exhausted: Unable to allocate 217088 bytes
- 無法分配的實際字節數可能會有所不同。此外,此數字並不表示完成整個導出操作所需的空間量。它只表示當作業用完轉儲文件空間時,當前正在導出的對象的大小。可以通過附加到停止的作業,使用 ADD_FILE 命令添加一個或多個文件,然后重新啟動操作來糾正此情況
交互式命令模式下可用的命令
- 在交互式命令模式下,當前作業將繼續運行,但登錄終端已暫停,並顯示導出提示符(Export>)
- 要啟動交互式命令模式,請執行以下操作之一:
- 從連接的客戶端,按Ctrl + C
- 從正在運行作業的終端以外的終端,使用 ATTACH 參數附加到作業
ADD_FILE
- 目的:添加文件或替代變量到 dump文件集
ADD_FILE = [ directory_object:] file_name [ , ...]
- 每個文件名可以有一個不同的目錄對象。如果沒有指定目錄對象,則使用默認的
- file_name 不得包含任何目錄路徑信息。但是,它可以包括一個替換變量,%U它表示可以按照給定的文件名模板生成多個文件
- 要添加的文件的大小由 FILESIZE 參數決定
- 示例:將兩個轉儲文件添加到轉儲文件集。沒有為 hr2.dmp 指定目錄對象,因此使用默認目錄對象。為名為 hr3.dmp 的轉儲文件指定了目錄對象 dpump_dir2
Export > ADD_FILE = hr2.dmp,dpump_dir2:hr3.dmp
CONTINUE_CLIENT
- 目的: 從交互式命令模式到日志記錄模式
CONTINUE_CLIENT
- 在記錄模式下,狀態會持續輸出到終端。如果該作業目前已停止,則CONTINUE_CLIENT 還會使客戶端嘗試啟動該作業
- 示例
Export> CONTINUE_CLIENT
EXIT_CLIENT
- 目的:停止導出客戶端會話,退出 Export,並停止日志記錄到終端,但使當前作業運行
- 因為 EXIT_CLIENT 使作業運行,之后可以附加到該作業。要查看作業的狀態,可以監控作業的日志文件,也可以查詢 USER_DATAPUMP_JOBS、V$SESSION_LONGOPS視圖
- 示例
Export> EXIT_CLIENT
FILE_SIZE
- 目的:重新定義后續轉儲文件的最大大小
- 其他介紹同 命令模式
HELP
- 顯示有關交互式命令模式下可用命令的信息
- 示例
Export> HELP
KILL_JOB
- 目的:分離所有當前連接的客戶端會話,然后終止當前作業。它退出 Export 並返回到終端提示符
- 使用 KILL_JOB 終止的作業無法重新啟動。所有連接的客戶端(包括發出KILL_JOB 命令的客戶端)都會收到警告,指示該作業正在被當前用戶終止,然后被分離。所有客戶端被分離后,作業的進程結構將停止,主表和轉儲文件將被刪除,日志文件不被刪除
- 示例
Export> KILL_JOB
PARALLEL
- 目的:增加或減少當前作業的活躍進程(工作和並行 slaves)的數量
PARALLEL = integer
- PARALLEL 可用作命令行參數和交互命令模式參數。你可以根據需要設置並行進程數。如果有足夠的文件和資源,增加將立即生效。在現有進程完成當前任務之前,減少不會生效。如果值降低,則工作進程將空閑,但不會刪除,直到作業退出
START_JOB
- 目的:啟動 ATTACH 到的當前作業
- START_JOB 命令重新啟動附加到的當前作業(該作業當前無法執行)。在意外故障或發出STOP_JOB命令后,重新啟動作業,而沒有數據丟失或損壞,前提是轉儲文件集和主表沒有以任何方式進行更改
- 以可傳輸表空間模式完成的導出不可重新啟動
STATUS
- 目的:顯示作業的累積狀態,當前操作的描述以及預估的完成百分比。它還允許你重置日志記錄模式下狀態的顯示間隔
STATUS [= integer ]
- 可以選擇指定在日志記錄模式下狀態的顯示頻率(以秒為單位)。如果沒有輸入值,或者使用默認值0,則周期狀態顯示被關閉,狀態只顯示一次
- 此狀態信息僅寫入到標准輸出設備,而不是日志文件
- 示例:顯示當前作業狀態,並將日志記錄模式的顯示間隔更改為五分鍾(300秒)
Export> STATUS = 300
STOP_JOB
- 目的:立即停止當前作業,或在有序關閉后停止作業,退出 Export 提示界面
STOP_JOB [= IMMEDIATE]
- 如果主表和轉儲文件集在 STOP_JOB 命令發出時或發出后不受干擾,則之后可以附加到該作業並使用 START_JOB 重新啟動
- 要執行有序的關閉,使用 STOP_JOB(不帶任何關聯值),將發出需要確認的警告。在工作進程完成當前任務之后,有序關閉會停止該作業
- 要執行立即關閉,指定 STOP_JOB= IMMEDIATE,將發出需要確認的警告。所有連接的客戶端,包括發出 STOP_JOB 命令的客戶端都會收到一條警告,指示該作業正被當前用戶停止,並且它們將被分離。所有客戶端分離后,該作業的進程結構會立即停止運行。也就是說,主進程不會等待工作進程完成當前的任務。指定STOP_JOB=IMMEDIATE ,不存在損壞或丟失數據的風險。但是,某些在關機時未完成的任務可能在重啟動時需要重做
使用交互模式停止並重新連接到作業
- 1)執行全庫導出
expdp hr FULL=YES DUMPFILE=dpump_dir1:full1%U.dmp, dpump_dir2:full2%U.dmp FILESIZE=2G PARALLEL=3 LOGFILE=dpump_dir1:expfull.log JOB_NAME=expfull
- 2)導出正在運行時,按 Ctrl + C,這將啟動數據泵導出的交互模式;在 Export 提示符下,發出以下命令停止作業:作業處於停止狀態並退出客戶端
Export> STOP_JOB=IMMEDIATE
Are you sure you wish to stop this job ([y]/n): y
- 3)輸入以下命令重新連接剛剛停止的作業
Export> expdp hr ATTACH = EXPFULL
- 顯示作業狀態后,可以發出 CONTINUE_CLIENT 命令恢復日志記錄模式並重新啟動 expfull 作業
Export> CONTINUE_CLIENT
- 消息顯示該作業已重新打開,並將處理狀態輸出到客戶端