日常工作总需要经常用到oracle备份程序,其中rman管理器需要先关闭数据库并开启归档日志才能备份,如果操作频繁的话很容易把空间撑满,所以选择了相对简单的expdp备份程序。
oracle中提供了exp和expdp两种导出文件的方法,也相对应的提供了imp和impdp两种导入文件的方法。
其中exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。
exp导出的文件只能用于imp导入,expdp导出的文件只能用户impdp导入。
备份步骤:
一、创建逻辑目录
sqlplus执行如下:
--只会逻辑创建,服务器上目录需手动创建,如果服务器上没有该目录备份时会报错
create or replace directory backupdir as '/ora_backup';
可通过如下sql查询是否创建成功:
select * from dba_directories;
二、赋予用户读写权限
sqlplus执行如下:
grant read,write on directory backupdir to bakuser;
--或者赋予所有权限
--grant all on directory backupdir to backuser;
三、导出数据
注:导入导出均在命令行执行
1)按用户导
expdp bakuser/test@orcl schemas=bakuser directory=backupdir dumpfile=expdp.dmp;
2)并行进程parallel
--会根据并行数量导出对应数量的dmp文件,其中%U从01开始递增数
expdp bakuser/test@orcl directory=backupdir dumpfile=expdp_%U.dmp parallel=8 job_name=bakuser01;
3)按表名导
expdp bakuser/test@orcl TABLES=emp,dept directory=backupdir dumpfile=expdp.dmp;
4)按查询条件导
expdp bakuser/test@orcl directory=backupdir dumpfile=expdp.dmp tales=emp query='WHERE deptno=01';
5)按表空间导
expdp bakuser/test@orcl directory=backupdir dumpfile=tablespace.dmp TABLESPACES=temp,example;
6)导整个数据库
expdp system/manager directory=backupdir dumpfile=full.dmp FULL=y;
PS:还有一个参数为ESTIMATE_ONLY表示只估算,可以事先估算一下需要多大空间,如下:
expdp bakuser/test@orcl SCHEMAS=bakuser nologfile=y ESTIMATE_ONLY=y PARALLEL=8
四、导入数据
1)导到指定用户下
impdp bakuser/test@orcl directory=backupdir dumpfile=expdp.dmp SCHEMAS=bakuser;
2)改变表的owner
impdp bakuser/test@orcl directory=backupdir dumpfile=expdp.dmp TABLES=bakuser.dept REMAP_SCHEMA=bakuser:system;
3)导入表空间
impdp bakuser/test@orcl directory=backupdir dumpfile=tablespace.dmp TABLESPACES=example;
4)导入数据库
impdb system/manager@orcl directory=backupdir dumpfile=full.dmp FULL=y;
5)追加数据
impdp system/manager directory=backupdir dumpfile=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION
注:如果当前数据库用户已经有了导出文件中的对象,应先删除数据库中的对象,不然会导入失败。
写入shell脚本方便执行:
#!/bin/bash
if [ -f /home/oracle/.bash_profile ];
then
source /home/oracle/.bash_profile
fi
sizeuse()
{
if [ -f /home/oracle/.bash_profile ];
then
source /home/oracle/.bash_profile
fi
echo "Start calculator space used..."
expdp bakuser/test@orcl SCHEMAS=bakuser nologfile=y ESTIMATE_ONLY=y PARALLEL=4
}
backup()
{
if [ -f /home/oracle/.bash_profile ];
then
source /home/oracle/.bash_profile
fi
time=`date +%Y%m%d`
dmpfile=dbbackup_$time
echo "Start expdp $dmpfile loading..."
expdp bakuser/test@orcl directory=backupdir dumpfile=$dmpfile\_%U.dmp SCHEMAS=bakuser logfile=expdp$time\.log PARALLEL=4
find /ora_backup -name "*.dmp" -ctime +31 -exec rm -f {} \;
}
case "$1" in
0|sizeuse) sizeuse;
;;
1|backup) backup;
;;
*)echo "Usage :";
echo " $0 <0|sizeuse> to calculate space used in statistics.";
echo " $0 <1|backup> to start backup.";
;;
esac