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 星期一 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

ORACLE数据泵expdp导出impdp导入
创建users用户,设置表空间,并授权

SQL> create user users IDENTIFIED BY 123 default tablespace "user";
用户已创建。
SQL> grant connect,resource to users;
授权成功。
  • 1
  • 2
  • 3
  • 4

ORACLE数据泵expdp导出impdp导入

退出并切换到users用户
ORACLE数据泵expdp导出impdp导入
创建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

ORACLE数据泵expdp导出impdp导入

导出(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

ORACLE数据泵expdp导出impdp导入

执行 数据泵(expdp )导出

cmd> expdp system/password@orcl schemas=xhs dumpfile=expdp_users.dmp DIRECTORY=EXPNC_DIR
  • 1

ORACLE数据泵expdp导出impdp导入
EXPNC_DIR目录下文件已产生
ORACLE数据泵expdp导出impdp导入
此时我们再往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

ORACLE数据泵expdp导出impdp导入
执行 数据泵(impdp )导入

cmd>impdp system/password@orcl DIRECTORY=EXPNC_DIR DUMPFILE=expdp_users.dmp REMAP_SCHEMA=users:users2
  • 1

ORA-31684: 对象类型已存在

操作成功完成,但是出现了错误【ORA-31684: 对象类型已存在】这是因为impdp执行的时候会去主动创建一个users2用户,而我们已经提前创建过用户了

ORACLE数据泵expdp导出impdp导入

我们查看一下导入之后的结果,发现两个用户的student表是不同的
ORACLE数据泵expdp导出impdp导入

导入(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: 对象类型已存在
ORACLE数据泵expdp导出impdp导入

ORACLE数据泵expdp导出impdp导入

小结

导入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

备注:该博客仅为学习交流之用,欢迎大家提出意见和建议,不得用于商业用途,如有转载请标明出处,谢谢合作!

上一篇:Vue生成动态路由以及权限的分配(ant-design-vue框架)


下一篇:接口测试总结1