數據泵:
數據泵可以高效備份,復制,保護和傳輸大量得數據和元數據。可以通過下列方式使用數據泵:
1.對整個數據庫或數據自己進行實時邏輯備份;
2.為測試或開發,復制整個數據庫或數據子集;
3.快速生成用於重建對象的DDL代碼;
4.通過舊版本導出數據,然后像新版本導入數據的方式,升級數據庫。
數據泵包含了 exp/imp實用程序的功能:
1.高效處理大量數據的功能, 可以高效導出和導入大量數據。
2.交互式命令行使用程序,使用它可以先斷開連接,然后恢復連接活動的數據泵作業。
3.在不創建數據泵文件的情況下,從遠程數據庫導出大量數據,並將這些數據直接導入本地數據庫。
4.通過導入和導出工作,在運行時更改方案,表空間,數據文件和存儲位置;
5.精細過濾對象和數據;
6.對目錄對象應用受控安全模式(通過數據庫);
7.高級功能,如壓縮和加密。
數據泵的結構 數據泵由以下組件構成:
1.expdp (數據泵導出實用程序);
2.impdp (數據泵導入實用程序);
3.DMBS_DATAPUMP軟件包(數據泵API);
4.DBMS_METADATA軟件包(數據泵元數據API);
在導出和導入數據和元數據時,expdp 和 impdp 實用程序會使用內置的DBMS_DATAPUMP DBMS_METADATA 軟件包。DBMS_DATAPUMP軟件包可以在不同的數據庫環境之間移動整個數據庫或數據子集。DBMS_MATEDATA軟件包可以導出和導入數據庫對象的信息。 當啟動數據泵導出和導入作業時,數據庫服務器上就會初始化一個OS主進程。這個主進程的名稱格式為 ora_dmNN_。在Linux和Unix系統中,可以使用ps命令查看進程。
ps -ef |grep ora_dm
因為數據泵使用其內部的PL/SQL代碼執行操作,所以需要使用共享池中的一些內存加載PL/SQL軟件。如果共享池中空間不足,系統會提示
ORA-04031:unable to allocate bytes of shared memory…
錯誤提示,並中斷數據泵。當出現該錯誤時,可以將數據庫參數SPARED_POOL_SIZE設置為50M以上。
執行導出操作[簡例]
在運行數據泵導出作業是需要進行環境配置:
1.創建指向OS目錄的數據庫目錄對象,這個OS目錄用於讀/寫數據泵文件;
2.為執行導出/導入操作的數據庫用戶賦予讀寫目錄對象的權限;
3.在OS命令提示符界面中運行expdp實用程序。
--創建數據庫目錄對象
create directory dp_dir as '/u02/dumpfile';
--查看目錄對象的細節
select owner,directory_name,directory_path from dba_directories;
--為用戶賦予訪問目錄對象的權限
grant read,write on directory dp_dir to scott;
--執行導出操作
create table inv(inv_id number);
insert into inv values (1);
--使用非SYS用戶導出這個表。
expdp scott/tiger directory=dp_dir tables=inv dumpfile=exp.dmp logfile=exp.log
導入表
導入處理過程和導出處理過程類似:
1.創建指向OS目錄的數據庫目錄對象,這個OS目錄用於寫/讀數據泵文件;
2.為執行導出/導入操作的數據庫用戶賦予讀寫目錄對象的權限;
3.在OS命令提示符界面中運行impdp實用程序。
--刪除INV表
drop table inv purge;
--通過導出的數據泵文件重建INV表;
impdp scott/tiger directory=dp_dir dumpfile=exp.dmp logfile=imp.log
--使用參數文件
創建 exp.par 參數文件
vi exp.par
userid=scott/tiger
directory=dp_dir
dumpfile=exp.dmp
logfile=exp.log
tables=inv
reuse_dumpfiles=y
使用PARFILE命令行選項引用參數文件,執行導出操作:
expdp parfile=exp.par
深入了解導出和導入操作
數據泵多種模式:
1.全數據庫級;
2.方案級;
3.表級;
4.表空間級;
5.可傳輸表空間級;
expdp/impdp命令常用參數
REMAP_SCHEMA
眾所周知:IMP工具的FROMUSER和TOUSER參數可以實現將一個用戶的的數據遷移到另外一個用戶。
impdp數據泵使用REMAP_SCHEMA
參數來實現不同用戶之間的數據遷移;語法:
REMAP_SCHEMA=source_schema:target_schema
impdp orcldev/oracle@orcl DIRECTORY=backup_path DUMPFILE=oracldev.dmp schemas=orcldev
REMAP_SCHEMA=orcldev:orcltwo
與REMAP_SCHEMA類似的參數選項,如:
REMAP_TABLESPACE
將源表空間的所有對象導入目標表空間。
REMAP_TABLE
參數將源表數據映射到不同的目標表中
impdp orcldev/oracle@orcl DIRECTORY=backup_path dumpfile=oracldev.dmp remap_table=TAB_TEST:TEST_TB
數據導入到TEST_TB表中,但是該表的索引等信息並沒有相應的創建,需要手工初始化。
DIRECTORY
指定轉儲文件和日志文件所在的目錄
DIRECTORY=directory_object
Directory_object用於指定目錄對象名稱.需要注意,目錄對象是使用CREATE DIRECTORY語句建立的對象,而不是OS目錄
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump
DUMPFILE
於指定轉儲文件的名稱,默認名稱為expdat.dmp
DUMPFILE=[directory_object:]file_name [,….]
Directory_object用於指定目錄對象名,file_name用於指定轉儲文件名.需要注意,如果不指定directory_object,導出工具會自動使用DIRECTORY選項指定的目錄對象
Expdp scott/tiger DIRECTORY=dump1 DUMPFILE=dump2:a.dmp
ESTIMATE_ONLY
指定是否只估算導出作業所占用的磁盤空間,默認值為N
EXTIMATE_ONLY={Y | N}
設置為Y時,導出作用只估算對象所占用的磁盤空間,而不會執行導出作業,為N時,不僅估算對象所占用的磁盤空間,還會執行導出操作.
Expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y
ESTIMATE
指定估算被導出表所占用磁盤空間分方法.默認值是BLOCKS
ESTIMATE={BLOCKS | STATISTICS}
設置為BLOCKS時,oracle會按照目標對象所占用的數據塊個數乘以數據塊尺寸估算對象占用的空間,設置為STATISTICS時,根據最近統計值估算對象占用空間
Expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
FLASHBACK_SCN
指定導出特定SCN時刻的表數據
FLASHBACK_SCN=scn_value
Scn_value用於標識SCN值.FLASHBACK_SCN和FLASHBACK_TIME不能同時使用
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523
FLASHBACK_TIME
指定導出特定時間點的表數據
FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME=“TO_TIMESTAMP(’25-08-2004 14:35:00’,’DD-MM-YYYY HH24:MI:SS’)”
FULL
指定數據庫模式導出,默認為N
FULL={Y | N}
為Y時,標識執行數據庫導出.
LOGFILE
指定導出日志文件文件的名稱,默認名稱為export.log
LOGFILE=[directory_object:]file_name
Directory_object用於指定目錄對象名稱,file_name用於指定導出日志文件名.如果不指定directory_object.導出作用會自動使用DIRECTORY的相應選項值.
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log
NETWORK_LINK
指定數據庫鏈名,如果要將遠程數據庫對象導出到本地例程的轉儲文件中,必須設置該選項.
如:
expdp gwm/gwm directory=dir_dp NETWORK_LINK=igisdb tables=p_street_area dumpfile =p_street_area.dmp logfile=p_street_area.log job_name=my_job
igisdb是目的數據庫與源數據的鏈接名,
dir_dp是目的數據庫上的目錄
而如果直接用使用連接字符串(@fgisdb),expdp屬於服務端工具,expdp生成的文件默認是存放在服務端的
PARALLEL
指定執行導出操作的並行進程個數,默認值為1
注:並行度設置不應該超過CPU數的2倍,如果cpu為2個,可將PARALLEL設為2,在導入時速度比PARALLEL為要快。而對於導出的文件,如果PARALLEL設為2,導出文件只有一個,導出速度提高不多,因為導出都是到同一個文件,會爭搶資源。所以可以設置導出文件為兩個,如下所示:
expdp gwm/gwm directory=d_test dumpfile=gwmfile1.dp,gwmfile2.dp parallel=2
PARFILE
指定導出參數文件的名稱
PARFILE=[directory_path] file_name
SCHEMAS
該方案用於指定執行方案模式導出,默認為當前用戶方案.
STATUS
指定顯示導出作用進程的詳細狀態,默認值為0
TABLES
指定表模式導出
TABLESPACES/TABLESPACE
指定要導出表空間或表空間列表
VERSION
指定被導出對象的數據庫版本,默認值為COMPATIBLE.
VERSION={COMPATIBLE | LATEST | version_string}
為COMPATIBLE時,會根據初始化參數COMPATIBLE生成對象元數據;為LATEST時,會根據數據庫的實際版本生成對象元數據.version_string用於指定數據庫版本字符串.調用EXPDP
特別注意:如果后續要導入的數據庫版本低,所有導出命令就需要在后面加一個version=指定版本。例如11g -> 10g,假設10g具體版本為10.2.0.1,那么就加一個版本的參數version=10.2.0.1
TABLE_EXISTS_ACTION={SKIP | APPEND | TRUNCATE | FRPLACE }
當設置該選項為SKIP
時,導入作業會跳過已存在表處理下一個對象;當設置為APPEND
時,會追加數據,為TRUNCATE
時,導入作業會截斷表,然后為其追加新數據;當設置為REPLACE
時,導入作業會刪除已存在表,重建表病追加數據,注意,TRUNCATE
選項不適用與簇表和NETWORK_LINK
選項;
REMAP_SCHEMA
該選項用於將源方案的所有對象裝載到目標方案中:REMAP_SCHEMA=source_schema:target_schema
REMAP_TABLESPACE
將源表空間的所有對象導入到目標表空間中:REMAP_TABLESPACE=source_tablespace:target:tablespace
REMAP_DATAFILE
該選項用於將源數據文件名轉變為目標數據文件名,在不同平台之間搬移表空間時可能需要該選項.
REMAP_DATAFIEL=source_datafie:target_datafile
CONTENT
該選項用於指定要導出的內容.默認值為ALL
CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
當設置CONTENT為ALL 時,將導出對象定義及其所有數據.為DATA_ONLY時,只導出對象數據,為METADATA_ONLY時,只導出對象定義
EXCLUDE
選項用於指定執行操作時釋放要排除對象類型或相關對象
EXCLUDE=object_type[:name_clause] [,….]
Object_type用於指定要排除的對象類型,name_clause用於指定要排除的具體對象.EXCLUDE和INCLUDE不能同時使用
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW
REUSE_DATAFILES【impdp】
該選項指定建立表空間時是否覆蓋已存在的數據文件.默認為N REUSE_DATAFIELS={Y | N}
SKIP_UNUSABLE_INDEXES 【impdp】
指定導入是是否跳過不可使用的索引,默認為N
TRANSPORT_DATAFILES【impdp】
該選項用於指定搬移空間時要被導入到目標數據庫的數據文件
TRANSPORT_DATAFILE=datafile_name
Datafile_name用於指定被復制到目標數據庫的數據文件
Impdp system/manager DIRECTORY=dump DUMPFILE=tts.dmp TRANSPORT_DATAFILES=’/user01/data/tbs1.dbf
幾種模式介紹
全數據庫導出
全庫導出信息由下列部分組成:
1.用於重建表空間,用戶,表,索引,約束,觸發器,序列,以存儲的PL/SQL腳本等元素的所有DDL語句;
2.所有表中的數據;(SYS用戶的表除外);
將FULL
參數設置為Y可以執行全庫導出操作,必須使用擁有DBA權限或者DATAPUMP_EXP_FULL_DATABASE角色的用戶才能執行該操作。
expdp scott/tiger directory=dp_dir dumpfile=full.dmp logfile=full.log full=y
全庫導出不會導出數據庫中的所有元素
1.SYS方案中的對象不會導出。如果考慮可以將SYS方案中對象從一個數據庫中導出,然后將他們導入另一個數據庫會出現怎樣的情況?SYS方案會覆蓋數據字典內部的表/視圖,因而 破壞數據庫。因此,數據泵不會導出SYS方案中的對象。
2.不會導出索引數據,更確切的說,不會導出用於重建索引的索引DDL代碼
impdp scott/tiger directory=dp_dir dumpfile=full.dmp logfile=fulllog.dmp full=y
1.導入作業會先嘗試重建所有表空間 。如果表空間已經存在,或者表空間依存的目錄路徑不存在,那么創建表空間的操作就會失敗,導入作業執行下一個任務。
2.導入作業會更改SYS和SYSTEM用戶賬號,使它們包含導出的密碼。因此,對產品系統執行了全庫導入操作后名為,為謹慎起見,應為新環境更改密碼。
3.導入作業會創建導出文件中的所有用戶。如果某個用戶已經存在,系統就會提示錯誤信息,而導入作業會執行下一個任務。
4.從數據庫導出的用戶會使用原來的密碼,你可以根據自己的安全標准,更改這些密碼。
5.表會被重建。如果表已經存在並含有數據,你必須設置導入作業處理該情況的方法。可以設置導入作業跳過,替換或截斷該表,也可以設置將數據附加到該表中。
6.當所有表都重建完並加載了數據后,導入作業會創建相關索引。
7.在能夠獲得統計數據的情況下,導入作業還會導入統計數據。而且,導入作業還會實例化對象權限。
方案級導入導出
方案級導出操作經常用於將一個或多個用戶從一個環境復制到另一個環境。
expdp scott/tiger directory=dp_dir dumpfile=scott.dmp logfile=scott.log
與僅導出運行導出作業的用戶不同,通過SCHEMAS參數可以導出多個用戶
expdp scott/tiger directory=dp_dir dumpfile=user.dmp logfile=user.log schemas=scott,cmrmapp;
引用方案級數據泵文件可以執行方案級導入操作:#這里需要原數據庫跟新數據庫環境用戶一樣
impdp scott/tiger directory=dp_dir dumpfile=scott.dmp logfile=scott.log
在執行方案級導入操作時,需要注意下列幾點:
1.方案級導出文件中不含有表空間,所以導入時需要創建對應的表空間
2.導入作業會重建數據泵文件含有的所有用戶。如果用戶已經存在,系統會顯示錯誤提示,而導入作業會繼續執行下一個任務。
3.導入作業會通過數據泵文件重置用戶的密碼。
4.用戶擁有的表會被導出並加載數據。如果表已經存在,則必須使用 TABLE_EXISTS_ACTION 參數設置數據泵處理該情況。
table_exists_action=replace
覆蓋數據參數
在使用全庫導出數據泵文件時,也可以執行方案級導入操作。要做到這一點,可以設置從全庫導出文件提取哪個用戶/方案
impdp scott/tiger directory=dp_dir dumpfile=full.dmp logfile=user.log schemas=scott,cmrmapp
表級
TABLES參數可以使用數據泵操作特定的表:
expdp scott/tiger directory=dp_dir dumpfile=tables.dmp logfile=tables.log tables=emp,test
impdp scott/tiger directory=dp_dir dumpfile=tables.dmp logfile=tables.log --導入時可有可無 tables=emp,test
在使用全庫導出或者方案級導出數據泵文件時,也可以執行表級導入操作。要做到這一點,應設置從全庫導出或者方案導出數據泵文件提取哪些表:
impdp scott/tiger directory=dp_dir dumpfile=full.dmp logfile=full.log tables=scott.emp
表空間級:
表空間級導出和導入作業可以操作特定表空間中的對象。
expdp scott/tiger directory=dp_dir dumpfile=users.dmp logfile=users.log tablespaces=users
利用表空間級導出文件,可以執行表空間級導入操作:
impdp scott/tiger directory=dp_dir dumpfile=users.dmp logfile=users.log --導入時可有可無 tablespaces=users
設置TABLESPACES參數可以使用全庫dmp導入文件,執行表空間級導出操作:
impdp scott/tiger directory=dp_dir dumpfile=full.dmp logfile=fullimp.log tablespaces=users
表空間級導入操作會創建表空間含有的所有表和索引,該操作不會重建表空間本身。所以需要在新建庫上做好表空間的創建,需要與備份時的表空間一致
數據傳輸
簡單示例:
需求:遷移oracle11g-01上的dbuser用戶的所有數據到oracle11g-02上的user用戶里,兩者使用的表空間名稱一致;
導出:
1.查詢或創建邏輯目錄
select * from dba_directories;
create directory <dir_name> as '/data/...';
2.為 oracle用戶授予訪問數據目錄的權限,輸入命令:
Grant read,write on directory data_dir to dbuser;
3.導入導出操作授權,輸入命令:
grant exp_full_database,imp_full_database to dbuser;
4.數據導出,執行命令:
expdp dbuser/123456@orcl schemas=dbuser dumpfile=expdp.dmp directory=data_dir logfile=expdp.log
expdp [為用戶名]/[密碼]@[服務名]
schemas=[為用戶名]
dumpfile=[導出數據庫文件(可自命名)]
directory=[目錄名]
logfile=[日志文件文件名(可自命名)]
導入:
5.創建邏輯目錄路徑:
create directory <dir_name> as '/data/...';
select * from dba_directories; #查詢邏輯目錄
6.為oracle用戶授予訪問數據目錄的權限,輸入命令:
Grant read,write on directory data_dir to user;
7.導入導出操作授權,輸入命令:
grant exp_full_database,imp_full_database to user;
8.數據導入:
impdp user/123456@orcl REMAP_SCHEMA=dbuser:user table_exists_action=replace directory=data_dir dumpfile=expdp.dmp logfile=impdp.log
impdp [用戶名]/[密碼]@[服務名]
REMAP_SCHEMA=[源用戶名1]:[目標用戶名2]
table_exists_action=replace /*存在的表動作(覆蓋)*/
directory=[目錄名]
dumpfile=[.dmp文件名]
logfile=[.log文件名]
9.其他情況
大多數情況下,不同數據庫不會使用相同的表空間來存儲數據,這時就需要使用一個參數:REMAP_TABLESPACE,使用方法與REMAP_SCHEMA一致:
impdp user/123456@orcl directory=jy schemas=dbuser REMAP_SCHEMA=dnuser:user REMAP_TABLESPACE=dbuser_tablespace:user_tablespace table_exists_action=replace dumpfile=expdp.dmp logfile=impdp.log
參考文檔:https://www.cnblogs.com/jyzhao/p/4522868.html 《Oracle簡單常用的數據泵導出導入(expdp/impdp)命令舉例(上)》
https://www.cnblogs.com/jyzhao/p/4530575.html#4.1 《Oracle簡單常用的數據泵導出導入(expdp/impdp)命令舉例(下)》
https://blog.csdn.net/weixin_34013044/article/details/91820125