使用数据泵expdp、impdp备份和还原oracle数据库

EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。

对于10g版本以上的服务器,使用exp通常不能导出0行数据的空表,而此时必须使用expdp导出。

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

数据泵导出包括导出表,导出方案,导出表空间,导出数据库4种方式.

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

一 备份:

1)通过WIN+R CMD登录sqlplus,输入数据库用户名和密码进入sql,可以使用sys账号,如sys as sysdba  回车后,再输入密码*******

2)创建逻辑目录(最重要的一步,不然会出现找不到目录)

创建备份逻辑目录,此目录不是真实的目录(单引号里面的内容是备份的目录,可以先查看一下所有的目录:select * from dba_directories;)

下面我们创建新的逻辑目录

SQL>create or replace directory backup as 'd:\oracle_20200901\tdw';
注意:'d:\oracle_20200901\tdw'; 引号里的目录,一定要手动创建好。用来存放oracle数据库备份文件。

目录创建成功,记得quit切回CMD目录下,否则不能成功进行EXP或者expdp的备份。

3)导出数据库

退出sqlplus命令,进入DOS命令行界面,执行下列命令导出数据库

expdp tdw_new/123456@tdw_new directory=backup schemas=tdw_new dumpfile=tdw_202009011001.dmp logfile=tdw_202009011001.log

格式 :expdp 用户名/密码@数据库 directory=指定逻辑目录 schemas=用户名 dumpfile=备份文件名 logfile=日志文件名

directory=backup 和步骤二建立的逻辑目录进行关联(逻辑目录名=backup)

schemas=tdw_new  导出当前用户的数据(用户名=tdw_new)

dumpfile=tdw_202009011001.dmp

logfile=tdw_202009011001.log    以上备份文件和日志文件都会存储在逻辑目录backup关联的真实路径下 d:\oracle_20200901\tdw

操作实例

  执行expdp和impdp命令需要拥有exp_full_database和imp_full_database权限,授权语句如下:

  eg:grant exp_full_database,imp_full_database to orcldev;

   1、导出orcldev这个schema的所用对象[schemas or full]

   eg:expdp orcldev/oracle@orcldev directory=backup_path dumpfile=orcldev_schema.dmp logfile=orcldev_schema_2013.log schemas=orcldev

   2、导出orcldev这个用户下的某些表[tables]

   eg:C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_table.dmp logfile=orcldev_table_2013.log tables=('TAB_TEST','TAB_A')

   3、只导出orcldev这个用户的元数据[content]

   eg:C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_meta.dmp logfile=orcldev_meta_2013.log     

      SCHEMAS=orcldev CONTENT=METADATA_ONLY

    4、只导出orcldev这个用户50%的抽样数据[sample]

   eg:C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_samp.dmp logfile=orcldev_samp_2013.log schemas=orcldev sample=50

    5、采用并行方式备份整库[parallel]

    parallel参数只有在oracle10g之后的版本(包含10g)有效。

    oracle_online:you can use the DUMPFILE parameter during export operations to specify multiple dump files, by using a substitution variable (%U) in the filename. This is called a dump file template. The new dump files are created as they are needed, beginning with 01 for %U, then using 02,03,and so on.

   eg:C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_parallel_%U.dmp logfile=orcldev_parallel_2013.log parallel=4

    "%U"表示自动生成递增的序列号。

  自己实操案例:

create or repalace direcotr backup as '/mnt/cddisk/cdtdw/';

expdp sys/123456@cdtdw directory='backup' dumpfile=cdtdw_parallel_%U.dmp logfile=cdtdw_parallel_2020112301.log tablespaces=USERS parallel=10

因为使用了sys账号,需执行上面语句后,重新输入用户名和密码:

#sys as sysdba

#password

   6、导出orcldev这个方案对象,但不包含索引[exclude]

   eg: --可以剔除的对象有:VIEW,PACKAGE,FUNCTION,index,constraints,table,schema,user等等

    1) C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_exclude.dmp logfile=orcldev_exclude.log SCHEMAS=orcldev EXCLUDE=index

    2) C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_exclude.dmp logfile=orcldev_exclude.log SCHEMAS=orcldev EXCLUDE=INDEX:"LIKE 'TEST%'"   --导出这个orcldev方案,剔除以TEST开头的索引

    3) C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_exclude.dmp logfile=orcldev_exclude.log EXCLUDE=SCHEMA:"='SCOTT'"

    C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_exclude.dmp logfile=orcldev_exclude.log EXCLUDE=USER:"='SCOTT'"

        --备份整库但剔除SCOTT这个用户的对象。  

   注意:include与exclude不能同时使用。

    7、PARFILE选项

    expdp命令可以调用parfile文件,在parfile里可以写备份脚本,可以使用query选项。

    Oracle highly recommends that you place QUERY specifications in a parameter file; otherwise, you might have to use operating system-specific escape characters on the command line before each quotation mark.

    如expdp.txt 内容如下:

        USERID=orcldev/oracle directory=dackup_path dumpfile=orcldev_parfile.dmp logfile=orcldev_parfile.log TABLES='TAB_TEST' QUERY="WHERE TRAN_DATE=TO_DATE('2013-08-31','YYYY-MM-DD')"

    执行方法:expdp parfile=expdp.txt 即可执行备份

    使用parfile好处是使用query选项是不用使用转义字符,如果将query参数放到外边的话,需要将""进行转义。

    eg:

    UNIX写法:

    expdp orcldev/oracle directory=backup_path dumpfile=2013.dmp logfile =2013.log schemas=orcldev INCLUDE=TABLE:\"IN \(\'TEST_A\',\'TEST_B\'\)\" --在Unix系统执行是需要将单引号进行转义操作,否则会报错。

    WINDOWS写法:

    expdp orcldev/oracle directory=backup_path dumpfile=2013.dmp logfile =2013.log schemas=orcldev INCLUDE=TABLE:"IN \('TEST_A','TEST_B')"

   8、TABLESPACE导出表空间

    eg:expdp orcldev/oracle directory=backup_path dumpfile=2013.dmp logfile =2013.log tablespaces=user,orcldev

     9、Version选项

    VERSION选项默认值是COMPATIBLE,即兼容模式。在我们备份的时候,可以指定版本号。

    eg:expdp orcldev/oracle directory=backup_path dumpfile=2013.dmp logfile =2013.log full=Y VERSION=10.2.0.4

   10、FLASHBACK_TIME选项

    指定导出特定时间点的表数据,可以联系一下FLASHBACK功能。

    eg:C:\>expdp orcldev/oracle directory=dackup_path dumpfile=orcldev_flash.dmp logfile=orcldev_flash.log SCHEMAS=orcldev   FLASHBACK_TIME="TO_TIMESTAMP('2013-09-28 14:30:00','DD-MM-YYYY HH24:MI:SS')"

参考地址:https://www.cnblogs.com/oracle-dba/p/3344230.html

二 备份还原前的准备

注:在本地或者另外一台电脑都可以进行还原

0)在原来库上查找有那些表空间和用户,然后先在新库中删除,再进行重新创建

select * from dba_tablespaces;

select * from dba_users;

这里可以看到原库中,使用了那些表空间和用户,用户一般就用原库登陆的用户,而表空间就得看除一些系统默认的外,都要帮忙创建,若没有创建就需在还原时做映射

1)删除表空间和用户

先用sqlplus登陆数据库,再用超级管理员身份登录 sys as sysdba,回车后,输入管理员密码

然后删除用户tdw_new和表空间tdw_new,tdw_new_temp

--删除用户
drop user tdw_new cascade;
--删除表空间
drop tablespace tdw_new including contents and datafiles cascade constraint;

--删除临时表空间
drop tablespace tdw_new_temp including contents and datafiles cascade constraint;

2)创建表空间和用户,并给创建的用户授权

注意:因为表空间默认文件只能有200个,若导入的数据库比较大,可以将表空间的文件数量增加多点,使用下面语句,因为这个要重启数据库实例,故要先执行

alter system set db_files=1000 scope =spfile;
shutdown immediate;
startup;
/*分为四步 */    
/*第1步:创建临时表空间  */    
CREATE TEMPORARY TABLESPACE tbs630_temp
TEMPFILE 'D:\tbs630_temp\01.DBF'    
SIZE 50M     
AUTOEXTEND ON     
NEXT 50M MAXSIZE UNLIMITED  
EXTENT MANAGEMENT LOCAL;   
 
/*第2步:创建数据表空间  */    
CREATE TABLESPACE tbs630 
LOGGING     
DATAFILE 'D:\tbs630\01.DBF'    
SIZE 50M     
AUTOEXTEND ON     
NEXT 50M MAXSIZE UNLIMITED  
EXTENT MANAGEMENT LOCAL;     

  
CREATE TABLESPACE idx_ebd 
LOGGING     
DATAFILE 'D:\tbs630_idx\01.DBF'    
SIZE 50M     
AUTOEXTEND ON     
NEXT 50M MAXSIZE UNLIMITED  
EXTENT MANAGEMENT LOCAL;     
     
/*第3步:创建用户并指定表空间  */    
CREATE USER tdw_new IDENTIFIED BY 123456     
DEFAULT TABLESPACE tbs630    
TEMPORARY TABLESPACE tbs630_temp;     
     
/*第4步:给用户授予权限  */    
GRANT CONNECT, RESOURCE, DBA TO tdw_new;    

/*第5步:create directory,这个路径是备份文件在新机器上的存放位置  */  
create or replace directory backup as 'F:\oraclebak_20200901';

上面我们建立了三个表空间,其中一个是临时表空间,一个是索引表空间,一个是数据表空间

备注:为了给表空间增加文件,可以使用以下语句,考虑我这次做的数据库有2T多,所以给数据一共增加了210个数据文件,给索引有20个文件,临时表空间增加了20个文件

以下截取一些做为例子做说明,每个库的操作示情况而定,索引表空间和数据表空间增加的文件类型是一样的,而临时表空间是不一样的,请留意。

给数据表空间增加文件

/*给数据表空间增加文件*/
alter
TABLESPACE tbs630 add datafile 'D:\tbs630\02.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630 add datafile 'D:\tbs630\03.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630 add datafile 'D:\tbs630\04.DBF' SIZE 50M AUTOEXTEND ON alter TABLESPACE tbs630 add datafile 'D:\tbs630\05.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630 add datafile 'D:\tbs630\06.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630 add datafile 'D:\tbs630\07.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;
/*给索引表空间增加数据文件*/
alter
TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\02.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\03.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\04.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\05.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\06.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE idx_ebd add datafile 'D:\tbs630_idx\07.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;
/*给临时表空间增加文件*/
alter
TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\02.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\03.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\04.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\05.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\06.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\07.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\08.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; alter TABLESPACE tbs630_temp add TEMPFILE 'D:\tbs630_temp\09.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

三 还原数据库

以上操作完成后,就退出sqlplus,回到windows的命令行模式

开始执行还原数据库

/*第6步:reback database  */  
impdp tdw_new/123456@tdw directory=backup dumpfile=tdw_202009031001.DMP logfile=tdw_202009031001.log 
remap_schema=tdw_new:tdw_new remap_tablespace=tbs_tdwnew:tbs630 remap_tablespace=tbs_630:tbs630

因为之前有多个表空间,可以都映射到新的表空间,使用命令

remap_tablespace=tbs_tdwnew:tbs630

用户之间也可以使用映射,使用命令:

remap_schema=tdw_new:tdw_new 

 以上是这次还原数据库的全部操作过程,备份花了一天一夜完成,还原花了二天才完成,后续在研究提高效率的问题。

 

posted @ 2020-09-03 15:22  aaron616  阅读(1115)  评论(0编辑  收藏  举报