exp和imp现在已经基本被抛弃了,EXPDP和IMPDP处理起来相对好点。
EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。

EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。

IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。

一、expdp备份数据库步骤

1、切换到Oracle数据库的用户,使用system登录oracle

格式如下:

sqlplus 用户名/密码@实例名eg. sqlplus system/123456@orcl

也可以直接使用sysdba直接登陆

sqlplus/assysdba

2、创建备份逻辑目录

此目录不是真实的目录(单引号里面的内容是备份的目录),最好以system等管理员创建。

创建之前可以查看一下现有的目录:

SQL>select * from dba_directories;

创建逻辑目录:(expdpdir类似于别名,指向的备份文件夹是/java/db/oracle,该文件夹要事先在磁盘上创建好,本次使用的是Linux系统,并且目录也已经创建)

SQL>create or replace directory expdpdir as '/java/db/oracle’;

3、授权

给用户授予目录的相关操作权限,如果是用system或者sysdba操作,可以省略本步骤

以下操作二选一:

-- 给指定用户赋权grant read, write on directory expdpdir to Scott; -- 或者直接把目录的权限设置为公开grant read, write on directory expdpdir to public;

4、导出数据库备份

退出SQLPlus命令界面,Linux直接在命令窗口、Windows进入DOS命令行界面,执行下列命令导出数据库:

(1)导出指定用户空间下的数据

此处导出的是 spic_ebs 用户空间下的数据

expdp system/oracle directory=expdpdirdumpfile=spic_ebs_%U.dmpSCHEMAS=spic_ebslogfile=expdp_djnc_20190416.logparallel=4cluster=N

(2)导出数据

这里可以排除部分不需要的表,一些符号需要转义

expdp system/oracle directory=expdpdir dumpfile=spic_ebs_%U.dmp SCHEMAS=spic_ebs exclude=TABLE:\"IN\(\'SYS_LOG\',\'SYS_LOG1\',\'ITF_ERP\'\)\" logfile=expdp_djnc_20190530.log parallel=8 cluster=no

(3)单独导出指定表的数据

expdp system/oracle directory=expdpdir dumpfile=itf_erp_%U.dmptables=spic_ebs.ITF_ERPlogfile=expdp_itf_erp.log parallel=6 cluster=no

命令解释:

  • system/oracle:system的用户名和密码,这里也可以不写,直接输入命令,最后提示输入用户名的时候,直接输入 / as sysdba
  • directory:指定导出的目录,步骤2创建的逻辑目录
  • dumpfile:指定导出的文件名,存放于directory目录里
  • SCHEMAS:指定需要导出的数据库用户名
  • exclude:导出时排除特定的对象类型
  • tables:指定需要导出的表
  • logfile:指定日志文件名
  • parallel:指定并行导出线程的数量
  • cluster:是否采用多实例导出

二、还原数据库准备工作

导入的时候要确保有足够的表空间,不然导入的时候,总会卡在那里一直不动

1、删除表空间与用户(新的数据忽略此步骤)

// 删除表空间(可以不删除)drop tablespace SPIC_EBS including contents and datafiles;// 删除用户所有信息drop user SPIC_EBS cascade;

注意:
如果表空间包含物化视图或者物化视图的索引,删除表空间会出现错误 ORA-23515: materialized views and/or their indices exist in the tablespace

具体处理办法:
首先删掉该表空间下的的物化视图

SELECT'drop materialized view ' || OWNER || '.' || segment_name || ' ;'FROMdba_segmentsWHEREsegment_name in(SELECTmview_name FROM dba_mviews)AND tablespace_name = 'SPIC_EBS';

然后删除该表空间下的其他表空间下物化视图在本表空间下创建的索引

SELECT*FROMdba_segmentsWHEREtablespace_name = 'SPIC_EBS'AND segment_name in(SELECTindex_name FROM dba_indexesWHEREtable_name in(SELECTmview_name FROM dba_mviews));

2、创建表空间与用户

// 创建表空间,如果没删除就不用创建了,大小根据需要调整create tablespace SPIC_EBS datafile '/java/orcl/SPIC_EBS.DBF' size 50Gautoextend on;# 注:单引号里面的文件名与表空间名字相同// 创建用户create user spic_ebs identified by spic_ebs default tablespace SPIC_EBS temporary tablespace temp;

3、给用户授权

// 给用户授权,如果不是必须,可以去掉DBA权限grant resource,connect,dba,create any view to spic_ebs;

三、使用impdp还原数据库

最好先设置一下编码,避免导入数据库后中文乱码,具体自己百度,以下只是参考:

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

前三个步骤和上边的导出一样

1、切换到Oracle数据库的用户,使用system登录oracle

格式如下:

sqlplus 用户名/密码@实例名eg. sqlplus system/123456@orcl

也可以直接使用sysdba直接登陆

sqlplus/assysdba

2、创建还原逻辑目录,与导出时创建的逻辑目录相同。

在系统上创建/java/db/oracle目录,并将备份的数据库文件拷贝到该目录

SQL>create or replace directory expdpdir as '/java/db/oracle’;

3、给目标用户授权

以下操作二选一:

-- 给指定用户(Scott)赋权grant read, write on directory expdpdir to Scott; -- 或者直接把目录的权限设置为公开grant read, write on directory expdpdir to public;

4、导入备份文件

(1)导入全部数据

impdp system/oracle directory=expdpdir dumpfile=spic_ebs_%U.dmp SCHEMAS=spic_ebs logfile=20190531.logparallel=8 cluster=notransform=OID:Nremap_schema =spic_ebs:spic_ebs

注:remap_schema=spic_ebs:spic_ebs表示把左边的spic_ebs用户的数据,导入到右边的spic_ebs用户里面

(2)导入指定表的数据

impdp system/oracle directory=expdpdir dumpfile=itf_erp01.dmp tables=spic_ebs.ITF_ERPlogfile=impdp_itf_erp.log cluster=no

expdp和impdp挺强大的,如果有其他的需求,可以自行百度。