Oracle 數據泵(expdp/impdp)導入導出方法教程
Oracle數據泵導入導出是日常工作中常用的基本技術之一,我們使用oracle數據庫數據泵導入(impdp)導出(expdp)進行數據庫備份,數據庫遷移等數據庫維護工作。本文主要說明oracle數據庫導入導出的命令。
天下英雄出我輩,一入江湖歲月催
我是愛生活的「無間行者」,努力把實踐過的解決方案分享給大家
如果這篇文章對你有用,一個贊、一個評論、一個關注,我都很開心,給點鼓勵吧,讓我知道你在看。
使用場景:
在工作中,涉及到的Oracle數據庫遷移,備份,還原等,可以使用本教程數據泵導入導出來解決。歡迎補充指導。
參與本教程的素材
- Oracle11g
- 可視化工具為Oracle SQL Developer
- windows命令行
Oracle表空間:
Oracle數據庫被划分成稱作為表空間的邏輯區域——形成Oracle數據庫的邏輯結構。
一個Oracle數據庫能夠有一個或多個表空間,而一個表空間則對應着一個或多個物理的數據庫文件。
表空間是Oracle數據庫恢復的最小單位,容納着許多數據庫實體,如表、視圖、索引、聚簇、回退段和臨時段等。
每個Oracle數據庫均有SYSTEM表空間,這是數據庫創建時自動創建的。
SYSTEM表空間必須總要保持聯機,因為其包含着數據庫運行所要求的基本信息(關於整個數據庫的數據字典、聯機求助機制、所有回退段、臨時段和自舉段、所有的用戶數據庫實體、其它Oracle軟件產品要求的表)。
數據泵導出(expdp):
准備工作
--准備工作EXPNC_DIR路徑創建
--查詢數據庫路徑表
select * from DBA_DIRECTORIES;
--查詢數據庫用戶表
select * from DBA_USERS;
--查詢數據庫表空間
select * from DBA_TABLESPACES;
--查詢數據庫數據文件信息表
select * from DBA_DATA_FILES;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
--創建邏輯路徑
create directory EXPNC_DIR as 'E:\oracletablespace\expnc';
--命令行執行 expdp操作
cmd->[導出語法]
- 1
- 2
- 3
- 4
- 5
導出語法
需要在命令行中執行
--1)按用戶導
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1
--2)並行進程parallel
expdp scott/tiger@orcl directory=dpdata1 dumpfile=scott3.dmp parallel=40 job_name=scott3
--3)按表名導
expdp scott/tiger@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=dpdata1
--4)按查詢條件導
expdp scott/tiger@orcl directory=dpdata1 dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20'
--5)按表空間導
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=temp,example
--6)導整個數據庫
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=full.dmp FULL=y
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
數據泵導入(impdp):
准備工作
--創建表空間
create tablespace "user_new"
DATAFILE 'd:\oracle_tablespace\user_new'
size 500M AUTOEXTEND on next 100M
maxsize unlimited logging extent
management local segment space management auto;
--是否提前創建用戶設置默認表空間
create user users2 IDENTIFIED BY 123 default tablespace "user_new";
grant connect,resource to users2;
--命令行執行 impdp操作
cmd->[導入語法]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
導入語法
需要在命令行中執行
--1)導到指定用戶下
impdp scott/tiger DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=scott;
--2)改變表的owner
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;
--3)導入表空間
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=example;
--4)導整個數據庫
impdb system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y;
--5)追加數據
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
實戰演練
針對數據庫用戶表的復制(改變表的owner)
我們一般使用Oracle是以用戶對象為單位的數據庫表空間。
本次實戰內容為
- 將users用戶下所有的表導出成dmp文件
- 使用此dmp文件將數據恢復到users2用戶下。
環境准備
用system管理員登錄,創建表空間
C:\Users\Administrator>sqlplus
SQL*Plus: Release 11.2.0.1.0 Production on 星期一 5月 6 13:08:55 2019
Copyright (c) 1982, 2010, Oracle. All rights reserved.
請輸入用戶名: system
輸入口令:
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create SMALLFILE tablespace "user"
2 DATAFILE 'E:\oracletablespace\user'
3 size 500M AUTOEXTEND on next 100M
4 maxsize unlimited logging extent
5 management local segment space management auto;
表空間已創建。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20

創建users用戶,設置表空間,並授權
SQL> create user users IDENTIFIED BY 123 default tablespace "user";
用戶已創建。
SQL> grant connect,resource to users;
授權成功。
- 1
- 2
- 3
- 4

退出並切換到users用戶

創建student表
SQL> create table student(
2 id varchar2(32 BYTE),
3 name varchar2(32 BYTE),
4 phone varchar2(16 BYTE),
5 email varchar2(64 BYTE)
6 );
表已創建。
SQL> insert into student values('1','趙大','123','123@qq.com');
已創建 1 行。
SQL> insert into student values('2','錢二','234','234@qq.com');
已創建 1 行。
SQL> insert into student values('3','李三','345','345@qq.com');
已創建 1 行。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14

導出(expdp)
EXPNC_DIR目錄創建
SQL> create directory EXPNC_DIR as 'E:\oracletablespace\expnc';
目錄已創建。
--如果是expdp users/123@orcl 這個用戶是普通用戶,需要讀寫授權
SQL> grant read,write on directory EXPNC_DIR to users;
授權成功。
- 1
- 2
- 3
- 4
- 5

執行 數據泵(expdp )導出
cmd> expdp system/password@orcl schemas=xhs dumpfile=expdp_users.dmp DIRECTORY=EXPNC_DIR
- 1

EXPNC_DIR目錄下文件已產生

此時我們再往users用戶的student表中再插入兩條數據,以此區別兩個用戶表中的數據
SQL>insert into student values('4','劉四','444','444@qq.com');
已創建 1 行。
SQL>insert into student values('5','王五','555','555@qq.com');
已創建 1 行。
- 1
- 2
- 3
- 4
導入(impdp)1
使用system管理員創建新的用戶users2

執行 數據泵(impdp )導入
cmd>impdp system/password@orcl DIRECTORY=EXPNC_DIR DUMPFILE=expdp_users.dmp REMAP_SCHEMA=users:users2
- 1
ORA-31684: 對象類型已存在
操作成功完成,但是出現了錯誤【ORA-31684: 對象類型已存在】這是因為impdp執行的時候會去主動創建一個users2用戶,而我們已經提前創建過用戶了

我們查看一下導入之后的結果,發現兩個用戶的student表是不同的

導入(impdp)2
刪除復制好的users2,此次導入不提前創建用戶來規避錯誤【ORA-31684: 對象類型已存在】
SQL> drop TABLESPACE "user_new" INCLUDING CONTENTS AND DATAFILES;
表空間已刪除
SQL> drop user users2 cascade;
用戶已刪除。
- 1
- 2
- 3
- 4
執行 數據泵(impdp )導入
cmd>impdp system/password@orcl DIRECTORY=EXPNC_DIR DUMPFILE=expdp_users.dmp REMAP_SCHEMA=users:users2
- 1
不再提示錯誤【ORA-31684: 對象類型已存在】


小結
導入1和導入2的區別:
- 導入1提前創建了目標用戶users2並指定了表空間"user_new",即用戶users的表空間是"user",用戶users2的表空間是"user_new"
- 導入2是由impdp命令默認創建了用戶users2,兩個用戶的表空間都是"user"。
這里要說一下,
一個數據庫可以有多個實例,
一個實例可以有多個用戶(不同實例下允許相同名字的用戶存在),
一個用戶只能分配一個表空間(不同用戶下允許相同名字的表存在),
一個表空間可以給 n 個用戶使用。
不理解oracle數據庫_實例_用戶_表空間之間的關系
可以參考
- http://www.bejson.com
- https://www.2cto.com/database/201801/712011.html
備注:該博客僅為學習交流之用,歡迎大家提出意見和建議,不得用於商業用途,如有轉載請標明出處,謝謝合作!
