一、需求
定时将服务器A的oracle数据库中某个database定时生成dmp,备份到服务器B中(保存10天)
二、配置数据库定时备份
- 在服务器A上创建备份目录,并赋予权限
[root@localhost /]# mkdir -p /home/oraclebak
#新建oracle备份目录
[root@localhost /]# chown -R oracle:oinstall /home/oraclebak -R
#设置目录权限为oinstall用户组的oracle用户
- 在服务器B上创建备份目录,并赋予权限
[root@localhost /]# mkdir -p /home/oraclebak
#新建oracle备份目录
[root@localhost /]# chmod 777 /home/oraclebak
- 检查psopuser_bak.sh(见文末)中数据库服务器IP、端口、SID等是否正确,将psopuser_bak.sh文件放到服务器A中 /home/oraclebak 目录下
- 给psopuser_bak.sh赋权限
[root@localhost /]# chmod 777 /home/oraclebak/psopuser_bak.sh
- 更改psopuser_bak.sh编码
[root@localhost /]# vi /home/oraclebak/psopuser_bak.sh
:set ff=unix #设置编码
:wq #保存退出
- 服务器A添加定时任务
[root@localhost /]# crontab -e
#插入下面语句(每天凌晨一点备份一次)
00 1 * * * /home/oraclebak/psopuser_bak.sh
- 查看任务
[root@localhost ~]# crontab -l
三、配置无密传输
- 使用xSell或shh连接工具连接数据库服务器(服务器A),运行 ssh-keygen -t rsa ,一路回车,进入 /root/.ssh ,可以看到 id_rsa 和 id_rsa_pub 两个文件
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #这里一直回车
[root@localhost .ssh]# cd /root/.ssh
[root@localhost .ssh]# ll
total 8
-rw------- 1 root root 1675 Mar 29 16:31 id_rsa
-rw-r--r-- 1 root root 408 Mar 29 16:31 id_rsa.pub
[root@localhost .ssh]# cp id_rsa.pub id_rsa.pub.dbbak
- 在远程服务器(服务器B)上运行命令
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #这里一直回车
- 在服务器A上运行命令
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服务器B_IP:/root/.ssh
The authenticity of host '10.3.100.16 (10.3.100.16)' can't be established.
RSA key fingerprint is 17:a3:ae:64:08:b0:42:fd:35:2d:e0:99:a5:8a:59:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.3.100.16' (RSA) to the list of known hosts.
root@10.3.100.16's password:
id_rsa.pub.dbbak 100% 408 0.4KB/s 00:00
- 在远程服务器(服务器B)上运行命令
[root@localhost ~]# cd /root/.ssh/
[root@localhost .ssh]# cat id_rsa.pub.dbbak >> authorized_keys
- 在服务器A上运行脚本,测试是否无需输入密码执行成功
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服务器B_IP:/root/.ssh
id_rsa.pub.dbbak 100% 408 0.4KB/s 00:00
四、配置远程服务器(服务器B)定时删除N天前dmp
- 连接服务器B,将psopuser_remote_bak.sh(见文末)脚本放到 /home/oraclebak目录下,并赋权限
[root@localhost ~]# chmod 777 /home/oraclebak/psopuser_remote_bak.sh
- 更改psopuser_remote_bak.sh编码
[root@localhost /]# vi /home/oraclebak/psopuser_remote_bak.sh
:set ff=unix #设置编码
:wq #保存退出
- 添加定时任务
[root@localhost /]# crontab -e
#插入下面语句(每天凌晨一点删除一次)
00 1 * * * /home/oraclebak/psopuser_remote_bak.sh
- 查看任务
[root@localhost ~]# crontab -l
附脚本文件:
psopuser_bak.sh
#这里采用 数据库名称_bak.sh 来命名,为了区分备份的具体数据库
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
echo "begin export psopuser dmp file..."
#设置环境变量
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
export ORACLE_SID=MEDB #SID
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LANG=en_US.UTF-8
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
date=$(date +%Y%m%d) #当前时间
days=10 #设置删除10天前的数据
orsid='10.3.100.15:1521/MEDB' #要备份的Oracle数据库IP、端口、SID
orowner=PSOPUSER #要备份的数据库的用户名
bakuser=PSOPUSER #使用此用户来导出dmp
bakpass=123456789 #用户密码
bakdir=/home/oraclebak #备份文件路径
bakdata=$orowner"_"$date.dmp #备份的dmp名称
baklog=$orowner"_"$date.log #备份时产生的log名称
ordatabak=$orowner"_"$date.tar.gz #将备份的dmp和log压缩后的文件名称
cd $bakdir
mkdir -p $orowner
cd $orowner
#导出dmp和log文件
exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog
tar -zcvf $ordatabak $bakdata $baklog #压缩dmp和log文件
find $bakdir/$orowner -type f -name "*.log" -exec rm {} \; #删除log文件
find $bakdir/$orowner -type f -name "*.dmp" -exec rm {} \; #删除dmp文件
find $bakdir/$orowner -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \; #删除10天前备份文件
psopuser_remote_bak.sh
bakdir=/home/oraclebak #备份文件路径
days=10 #设置删除10天前的数据
cd $bakdir
find $bakdir -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \; #删除10天前备份文件