oracle定时备份,用expdp的跨服务器备份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle定时备份,用expdp的跨服务器备份相关的知识,希望对你有一定的参考价值。

oracle数据库,先将服务器A导出用户a,生成一个.dmp文件,再将这个文件复制到服务器B的指定文件夹下,求大神指导

参考技术A 1、按照你所说的思路,你可以写个shell脚本:设个定时任务
第一步,先生成个dmp文件,规定命名格式
第二步,调用ftp,scp之类工具,将该dmp文件上传到你指定的远程服务器上面。

2、根据你的需求,你可以考虑使用expdp的一个特性。
expdp/impdp有个network_link选项。
比如expdp,使用该选项可以直接在本地进行远程库的备份,并且将备份文件放在在本地。
也就是,在你的b服务器上面直接对a服务器上的数据库进行expdp操作,会在b服务器上面生成dmp文件。
具体关于network_link的用法,还需你自己加以学习。追问

上面是我写的根据时间命名生成的dmp和logs;

这是我写的计划任务,现在就差一个将服务器A备份的文件复制到服务器B的指定文件夹下,你能帮我看看么

追答

你执行完expdp操作后,然用net use登陆到远程服务器,再执行下xcopy命令咯。
类似:
net use //192.168.1.111/ipc$ 112233 /user:admin
xcopy c:/backupsql/*.* //192.168.1.111/数据备份 /D /E /Y /H /K
net use //192.168.1.111/ipc$ /delete

追问

比如从服务器A(192.168.1.211)备份的dmp和log文件,备份到服务器B(192.168.1.117)的指定文件夹(F:\importFile)下,需要怎么写命令?

本回答被提问者和网友采纳

Linux下Oracle定时自动备份方案

公司业务系统数据库是Oracle 11g,以前用的备份方案是用imp,但是这个方案的速度相对比较慢,最近经过研究,打算将备份方案改写为expdp形式,记录一下操作过程

服务器关系

两台服务器用作备份,包含正式环境服务器跟备份服务器,正式环境每天凌晨3点定时通过expdp导出全库,再用scp传输至备份服务器存档

实现scp免密码传输

直接运行scp传输命令,会提示输入密码,要实现无人值守定时运行,就需要让两台服务器的交互能够自动免密,在此通过建立ssh信任关系的方法来实现
在正式服务器上执行ssh证书生成命令

ssh-keygen -t rsa

遇到提示一路回车

运行完毕后,在/root/.ssh目录下会生成id_rsa,id_rsa.pub两个文件

登录备份服务器,在用户对应.ssh目录(如/root/.ssh)下新建authorized_keys文件,将正式服务器id_rsa.pub文件的内容追加进去

在正式服务器上随意新建一个文件,测试scp传输

scp ./aaa root@192.168.x.x:/root/

现在已经不需要输入密码了,scp免密码传输已经成功

Oracle数据库新建虚拟目录

新建临时备份文件存储目录

mkdir /home/oradp

修改临时备份文件目录权限,让oracle具有写入权限

chown oracle:oinstall /home/oradp

登录sqlplus

su - oracle
sqlplus /nolog

新建虚拟目录供expdp使用

conn / as sysdba
create directory dpdata as '/shell';

查看目录是否创建成功

select * from dba_directories;

用sys管理员给指定用户赋予在该目录的操作权限

grant read,write on directory dpdata to cmsxx;

Oracle数据库虚拟目录创建成功

编写自动备份脚本

编写自动备份的shell脚本供定时任务使用,在正式服务器下新建脚本存储目录

mkdir /shell

在shell目录下新建backup_oracle.sh自动备份脚本,内容如下

#!/bin/sh
#自动备份oracle数据库并压缩

#定时任务示例
#凌晨1点备份
#0 1 * * * nohup /bin/sh /shell/backup_oracle.sh >> /shell/backup_oracle.log &

#数据库用户
db_user="cmsxx";
#数据库密码
db_password="*";
#数据库服务器,需要在本地客户端tnsnames中定义好
db_server="cmsxx";
#本地客户端执行程序目录
oracle_bin_dir="/home/oracle/xx/bin";
#oracle虚拟目录名
oracle_directory="dpdata";
#备份服务器地址
backup_server="192.168.x.x";
#备份服务器用户
backup_user="root";
#本地备份目录,存放dump文件与临时压缩文件
local_backup_dir="/home/oradp";
#远程备份目录,对应备份服务器存放位置,需要提前挂载
remote_backup_dir="/xx/xx/oracle_backup";

#获取当前日期
date_now=$(date +%Y%m%d);
#备份当天的数据库
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自动备份数据库并压缩开始 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库备份开始 --------------------------------------------------------";
echo "su oracle -lc "${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log"";
su oracle -lc "${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库备份结束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库压缩开始 --------------------------------------------------------";
echo "cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log";
cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 数据库压缩结束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 传输备份文件开始 --------------------------------------------------------";
echo "scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir}";
scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir};
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 传输备份文件结束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份原始文件开始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份原始文件结束 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份压缩文件开始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 删除当前备份压缩文件结束 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自动备份数据库并压缩结束 ----------------------------------------------";

给自动备份脚本增加执行权限

chmod +x /shell/backup_oracle.sh

将自动备份脚本加入定时任务

crontab -e
#凌晨1点备份
0 1 * * * nohup /usr/bin/sh /shell/backup_oracle.sh >> /shell/backup_oracle.log &

整个Oracle数据备份编写到此结束

以上是关于oracle定时备份,用expdp的跨服务器备份的主要内容,如果未能解决你的问题,请参考以下文章

linux平台的oracle11201借用expdp定时备份数据库-1225

window下oracle数据库expdp定时备份

oracle用expdp方式备份脚本

expdp+dblink 实现远程备份,特别实用

用EXPDP如何设置自动备份了,请大家帮忙! 是用ORACLE R12. 第一次发贴,不是很会写,在线等... 那位大侠帮忙

oracle 11g expdp 备份解决空表无法备份