ORACLE資料泵expdp匯出impdp匯入
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','[email protected]');
已建立 1 行。
SQL> insert into student values('2','錢二','234','[email protected]');
已建立 1 行。
SQL> insert into student values('3','李三','345','[email protected]');
已建立 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','[email protected]');
已建立 1 行。
SQL>insert into student values('5','王五','555','[email protected]');
已建立 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
備註:該部落格僅為學習交流之用,歡迎大家提出意見和建議,不得用於商業用途,如有轉載請標明出處,謝謝合作!