rman备份到远程服务器磁盘
原因
业务数据量较大,数据库服务器上无足够地空间存放rman备份,磁盘扩容申请不批。无奈采取nfs远程备份
环境信息
ip | 操作系统 | 备份目录 | |
---|---|---|---|
远程备份服务器 | 192.168.3.130 | Centos7.9 | rmanbak |
数据库服务器 | 192.168.3.132:1521 | Centos7.9 | /remotermanbak |
配置过程
采用NFS共享盘的方式将远程磁盘映射到数据库服务器,然后RMAN将数据备份到映射磁盘以达到远程备份。
远程备份服务器启动NFS服务
#检查NFS服务所需包是否已安装
[root@top130:~]$ rpm -qa | grep nfs
nfs-utils-1.3.0-0.68.el7.x86_64 #返回说明已安装
[root@top130:~]$ rpm -qa | grep rpcbind
rpcbind-0.2.0-49.el7.x86_64 #返回说明已安装
#编辑访问权限
mkdir -p /rmanbak
echo '/rmanbak 192.168.3.132(rw,no_root_squash)' >> /etc/exports
#启动或重启服务
systemctl restart rpcbind
systemctl restart nfs
systemctl status nfs
systemctl status rpcbind
数据库服务器挂载远程目录
#创建目录
mkdir -p /remotermanbak
#挂载
echo '192.168.3.130:/rmanbak /remotermanbak nfs defaults 0 0 ' >> /etc/fstab
mount -a
注:/etc/fstab格式:远程备份服务器目录 数据库服务器本地目录 文件系统类型
#赋予权限
chown -R oracle:oinstall /remotermanbak
#验证/rmanbak目录下是否可创建文件
su - oracle
cd /remotermanbak/
touch test.txt
数据库服务器rman备份数据库
1.创建脚本存放目录, 如果有该目录则跳过进行下一步
mkdir -p /home/oracle/scripts
2.rman全备+增备脚本
cat /home/oracle/scripts/rmanbak.sh
#!/bin/bash
##引用环境变量
if [ -f $HOME/.bash_profile ]; then
. $HOME/.bash_profile
elif [ -f $HOME/.profile ]; then
. $HOME/.profile
fi
##全量备份时间,例如:周六
fulbakdatetime=(6)
##增量备份时间,例如:周日~周五
incbakdatetime=(0 1 2 3 4 5)
##冗余策略保留份数
quantity=2
datetime=`date +%w`
backtime=`date +"20%y%m%d%H%M%S"`
##备份目录,请指定到nfs共享目录
###################################################
orabakdir=/remotermanbak
##备份策略
rmanPolicy(){
rman target / log=${orabakdir}/level_policy_${backtime}.log<<EOF
run{
CONFIGURE RETENTION POLICY TO REDUNDANCY ${quantity};
CONFIGURE CONTROLFILE AUTOBACKUP ON;
}
EOF
}
#全量备份
fulBak(){
rman target / log=${orabakdir}/level0_backup_${backtime}.log<<EOF
sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
crosscheck backup;
crosscheck archivelog all;
sql"alter system archive log current";
delete noprompt expired backup;
delete noprompt obsolete device type disk;
backup incremental level 0 database include current controlfile format '${orabakdir}/backlv0_%d_%T_%t_%s_%p' plus archivelog delete all input format '${orabakdir}/arch_%d_%T_%t_%s_%p';
backup spfile format='${orabakdir}/spfile_%d_%T_%t_%s_%p';
release channel c1;
release channel c2;
}
EOF
}
#增量备份
incBak(){
rman target / log=${orabakdir}/level1_backup_${backtime}.log<<EOF
sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
crosscheck backup;
crosscheck archivelog all;
sql"alter system archive log current";
delete noprompt expired backup;
delete noprompt obsolete device type disk;
backup incremental level 1 database include current controlfile format '${orabakdir}/backlv1_%d_%T_%t_%s_%p' plus archivelog delete all input format '${orabakdir}/arch_%d_%T_%t_%s_%p';
release channel c1;
release channel c2;
}
EOF
}
for dbbaktime1 in ${fulbakdatetime[@]}
do
if [[ ${dbbaktime1} == ${datetime} ]];then
rmanPolicy
fulBak
break
fi
done
for dbbaktime2 in ${incbakdatetime[@]}
do
if [[ ${dbbaktime2} == ${datetime} ]];then
incBak
break
fi
done
find ${orabakdir} -name 'level*.log' -mtime +14 -exec rm -f {} \;
3.赋权,配置定时任务
su - root #
chown -R oracle:oinstall /home/oracle/scripts/rmanbak.sh #
chmod -R 775 /home/oracle/scripts/rmanbak.sh #
echo "00 02 * * * /home/oracle/scripts/rmanbak.sh >/dev/null 2>&1 &" >>/var/spool/cron/oracle #