1. 程式人生 > 其它 >ORACLE資料泵expdp匯出impdp匯入

ORACLE資料泵expdp匯出impdp匯入

Oracle 資料泵(expdp/impdp)匯入匯出方法教程

Oracle資料泵匯入匯出是日常工作中常用的基本技術之一,我們使用oracle資料庫資料泵匯入(impdp)匯出(expdp)進行資料庫備份,資料庫遷移等資料庫維護工作。本文主要說明oracle資料庫匯入匯出的命令。


天下英雄出我輩,一入江湖歲月催
我是愛生活的「無間行者」,努力把實踐過的解決方案分享給大家
如果這篇文章對你有用,一個贊、一個評論、一個關注,我都很開心,給點鼓勵吧,讓我知道你在看。

目錄

使用場景:

在工作中,涉及到的Oracle資料庫遷移,備份,還原等,可以使用本教程資料泵匯入匯出來解決。歡迎補充指導。


參與本教程的素材

  1. Oracle11g
  2. 視覺化工具為Oracle SQL Developer
  3. 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是以使用者物件為單位的資料庫表空間。
本次實戰內容為

  1. users使用者下所有的表匯出成dmp檔案
  2. 使用此dmp檔案將資料恢復到users2使用者下。

環境準備

system管理員登入,建立表空間

C:\Users\Administrator>sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on 星期一 56 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. 匯入1提前建立了目標使用者users2並指定了表空間"user_new",即使用者users的表空間是"user",使用者users2的表空間是"user_new"
  2. 匯入2是由impdp命令預設建立了使用者users2,兩個使用者的表空間都是"user"。

這裡要說一下,
一個數據庫可以有多個例項,
一個例項可以有多個使用者(不同例項下允許相同名字的使用者存在),
一個使用者只能分配一個表空間(不同使用者下允許相同名字的表存在),
一個表空間可以給 n 個使用者使用。

不理解oracle資料庫_例項_使用者_表空間之間的關係
可以參考

  1. http://www.bejson.com
  2. https://www.2cto.com/database/201801/712011.html

備註:該部落格僅為學習交流之用,歡迎大家提出意見和建議,不得用於商業用途,如有轉載請標明出處,謝謝合作!