使用数据泵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
以上是这次还原数据库的全部操作过程,备份花了一天一夜完成,还原花了二天才完成,后续在研究提高效率的问题。