共计 7087 个字符,预计需要花费 18 分钟才能阅读完成。
如何理解数据泵与 rman 脚本,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
脚本主要逻辑:全库备份读取到的实例的数据库,连同附属功能性文件(spfile,controlfile 控制文件,listener 监听文件,密码文件 orapw[instance_name])压缩后一并发送到远程服务器上。
(PS:脚本正文中以 #开头一行为注释,可直接拷贝以下代码使用,不影响运行)
一. 首先是数据泵 expdp/impdp 全库备份的:
#!/bin/bash
#backup oracle instances full databases with datapump(expdp)
#oracleDB_fullbackup_expdp.sh
#DATA_PUMP_DIR=/opt/ora11g/admin/${instance_name}/dpdump/
#created by dc at 2015-12-08
source /home/oracle/.bash_profile
# 读取用户 oracle 的环境变量,以便直接读取使用该文件内容所定义的有关变量
ORACLE_BIN_HOME=${ORACLE_HOME}/bin/
BACKUPTOOL_HOME=${ORACLE_BASE}/dba/OracleTools/
BACKUP_HOME=${BACKUPTOOL_HOME}DBbackup/
# 定义相关变量指向工作目录,ORACLE_BIN_HOME 是 oracle 工具(sqlplus,rman,dbca,emctl 等等)所在目录;BACKUPTOOL_HOME 是本脚本工具相关文件所在目录,BACKUP_HOME 是备份文件存放目录,ORACLE_HOME 和 ORACLE_BASE 是从.bash_profile 文件中所读取的环境变量,分别指 oracle 的家目录和 oracle 的根目录
echo full backup job start at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}fullbackup.result
# 在本地统计记录以下备份工作开始时间到文件 fullbackup.result,帮助确定定时任务所需时间
for instance_name in `cat ${BACKUPTOOL_HOME}instances_all`
#for 循环读取所有记录在 instances_all 文件里的实例名进行以下操作
do
DATA_PUMP_DIR=${ORACLE_BASE} /admin/ ${instance_name} /dpdump/
# 定义变量 DATA_PUMP_DIR 存放导出文件路径
expdp system/password@${instance_name} DIRECTORY=DATA_PUMP_DIR DUMPFILE=full_${instance_name}_$(date +%Y-%m-%d)_systemExpdp.dmp LOG=full_${instance_name}_$(date +%Y-%m-%d)_systemExpdp.log FULL=y;
# 使用 system 账号全库导出该实例的数据,使用的导出目录为 DATA_PUMP_DIR(可到后台 sqlplus 环境下查询具体对应的目录,注意此处该系统目录要真实存在),导出文件命名为选项”DUMPFILE=“之后名称所定义,同理导出过程记录日志在选项”LOG=“所定义,”FULL=y“意为全库导出。注意此处 @${instance_name} 指的是当前实例的 tnsname 即实例解析名,具体要查看 $ORACLE_HOME/network/admin/tnsname.ora 下的设置
mv ${DATA_PUMP_DIR} full_ ${instance_name}*.dmp ${BACKUP_HOME} tarfileDIR/ ${instance_name} /datafile/
mv ${DATA_PUMP_DIR} full_ ${instance_name}*.log ${BACKUP_HOME} tarfileDIR/ ${instance_name} /datafile/
# 转移上一步导出之后所得数据文件和日志文件到相应实例分类存放目录
cp ${ORACLE_HOME} /dbs/orapw ${instance_name} ${BACKUP_HOME} tarfileDIR/ ${instance_name} /passwdfile/
cp ${ORACLE_HOME}/network/admin/{listener.ora,tnsnames.ora,sqlnet.ora} ${BACKUP_HOME} tarfileDIR/ ${instance_name}/listenerfile/
# 拷贝数据库用户密码存放文件和监听相关文件到分类目录
done
cd ${BACKUP_HOME}
tar -zcpf full_$(date +%Y-%m-%d)_systemExpdp.tar.gz tarfileDIR
# 所有实例导出完毕后压缩打包
rm -rf ${BACKUP_HOME}tarfileDIR
# 删除已被打包的原文件以备下次备份使用
for instance_name in `cat ${BACKUPTOOL_HOME}instances_all`
do
mkdir -p ${BACKUP_HOME}tarfileDIR/${instance_name}/{datafile,listenerfile,passwdfile}
done
# 重新建立所有实例存放数据目录,以备下次使用
/usr/bin/expect EOF
spawn bash -c scp -P77 ${BACKUP_HOME}full_*_systemExpdp.tar.gz root@172.16.3.73:/opt/oracle72fullbackup/
expect password:
send @7043005ec611857\r
set timeout 10800
expect eof
EOF
# 插入使用 expect 脚本自动完成交互操作把数据库备份所得压缩包发送到远程服务器 172.16.3.73 的系统目录 /opt/oracle72fullbackup/ 下,定义 scp 发送超时时间为 10800 秒即三个小时,超时自动终止,该时间可以结合脚本开头和结尾所加时间统计功能确定
/usr/bin/expect EOF
spawn bash -c ssh -p77 root@172.16.3.73
expect password:
send @7043005ec611857\r
expect ]#
send chown -R oracle:oinstall /opt/oracle72fullbackup\r
expect ]#
send exit\r
expect eof
EOF
# 继续使用 expect 脚本更改远程服务器上数据备份目录的权限所属为 oracle:oinstall,方便管理,由于上一步中 scp 使用的用户是 root 故所发送文件权限也会被更改成 root:root
rm -f ${BACKUP_HOME}full_*_systemExpdp.tar.gz
# 导出数据压缩包转移完毕后删除原文件,节省空间
echo tlm,txmy s daily full backup job is done at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 写入日志,在本地记录执行脚本结束时间
二. 接着是 RMAN 全库备份脚本:
#!/bin/bash
#full backup oracle instances databases with RMAN
#oracleDB_fullbackup_rman.sh
#recovery directory is /opt/ora11g/dba/OracleTools/DBbackup/restoreDIR_daily/ ,it concerns about your backup level,put the DB backup tar file into the destination server s same directory then extracts it when you need to recover the database
#created by dc at 2015-12-08
# 脚本解释器 /bin/bash 声明和其他额外脚本说明补充,注意此处数据恢复路径是在 /opt/ora11g/dba/OracleTools/DBbackup/restoreDIR_daily 目录下的对应文件夹,下文有说明,由于是使用 RMAN 进行导入导出,所以导入导出目录请尽量保持一致,具体可参考我之前的文章:利用 rman 针对同平台下 oracle 的实例进行异机迁移。
source /home/oracle/.bash_profile
# 导入 /home/oracle/.bash_profile 文件里的环境变量
ORACLE_BIN_HOME=${ORACLE_HOME}/bin/
BACKUPTOOL_HOME=${ORACLE_BASE}/dba/OracleTools/
BACKUP_HOME=${BACKUPTOOL_HOME}DBbackup/
# 定义 oracle 自带工具所在目录变量 $ORACLE_BIN_HOME,备份脚本工具目录 $BACKUPTOOL_HOME 和备份导出文件存放目录 $BACKUP_HOME
echo tlm,txmy s daily full backup job start at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 记录以下脚本操作开始时间到 dailyfullbackup.result
for instance_name in `cat ${BACKUPTOOL_HOME}instances_daily`
do
export ORACLE_SID=$instance_name
# 使用 for 循环依次抽出记录在 instances_daily 文件中需要操作的实例名称并导入环境变量
${ORACLE_BIN_HOME} rman target / EOF
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup full tag dbfull format ${BACKUP_HOME}restoreDIR_daily/fullbackup/datafile/dbfull%u_%s_%p database plus archivelog delete all input;
backup current controlfile format ${BACKUP_HOME}restoreDIR_daily/fullbackup/controlfile/control.bak
backup spfile format ${BACKUP_HOME}restoreDIR_daily/fullbackup/spfile/spfile.bak
release channel c1;
release channel c2;
release channel c3;
}
quit;
EOF
#RMAN 全库备份段,datafile 目录存放数据导出文件,controlfile 目录存放控制文件,相应地 spfile 目录存放 spfile,等到还原时也创建相同目录摆放好各类数据文件以备恢复
cp ${ORACLE_HOME}/dbs/orapw${instance_name} ${BACKUP_HOME}restoreDIR_daily/fullbackup/passwdfile/
# 拷贝当前实例的的密码文件到 passwdfile 目录下
cp ${ORACLE_HOME}/network/admin/{listener.ora,tnsnames.ora,sqlnet.ora} ${BACKUP_HOME}restoreDIR_daily/fullbackup/listenerfile/
# 拷贝监听相关文件到 listenerfile 目录下
if [! -d ${BACKUP_HOME}tarfileDIR_daily/full/$instance_name ];then
mkdir -p ${BACKUP_HOME}tarfileDIR_daily/full/$instance_name;
fi
# 判断压缩包存放目录是否存在,否则创建
tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full/${instance_name}/full_${instance_name}_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}restoreDIR_daily/fullbackup
# 打包当前实例所有备份导出文件,加 - p 参数是保持文件原来属性,而 - P 参数是按照第二个变量中的路径进行压缩,解包出来之后也得到一个 ${BACKUP_HOME}restoreDIR_daily/fullbackup 的多重目录,这个在解包时需要注意当前目录,- P 的具体效果可以参考帮助文档
rm -rf ${BACKUP_HOME}restoreDIR_daily/fullbackup/*
# 打包完毕后删除当前导出文件
mkdir -p ${BACKUP_HOME}restoreDIR_daily/fullbackup/{controlfile,datafile,passwdfile,spfile,listenerfile}
# 由于上一步操作直接删除整个目录,所以重新创建各层级分类目录以备下次循环使用
done
echo The DB restore directory is ${BACKUP_HOME}restoreDIR_daily/fullbackup/ ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 记下 rman 所使用的还原路径到帮助文档 readme.txt
echo The DB base directory is ${ORACLE_BASE} ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 记下源数据库的根目录到帮助文档内容
echo Please extract the tar file with option -P , like tar -zxPf xxx.tar.gz ${BACKUP_HOME}tarfileDIR_daily/full/readme.txt
# 记录解压时注意使用 - P 参数到帮助文档内容
tar -zcPpf ${BACKUP_HOME}tarfileDIR_daily/full_all_$(date +%Y-%m-%d).tar.gz ${BACKUP_HOME}tarfileDIR_daily/full
# 打包所有实例所导出数据的压缩包,稍后一并发送到存放目的地
rm -rf ${BACKUP_HOME}tarfileDIR_daily/full
# 删除被打包文件节省空间
/usr/bin/expect EOF
spawn bash -c scp -P77 ${BACKUP_HOME}tarfileDIR_daily/full_*.tar.gz root@172.16.3.73:/opt/oracle72fullbackup/tlmtxmy_daily/
expect password:
send @7043005ec611857\r
expect ]$
set timeout 10800
expect eof
EOF
# 使用 expect 交互脚本发送上一步所打包的总压缩包到 172.16.3.73 服务器上的 /opt/oracle72fullbackup/tlmtxmy_daily 目录下,此处密码为明文,超时时间为 10800 秒即 3 小时,这个值需要根据实际网络带宽情况和文件压缩包大小作适当调整,单位为秒 s
/usr/bin/expect EOF
spawn bash -c ssh -p77 root@172.16.3.73
expect password:
send @7043005ec611857\r
expect ]#
send chown -R oracle:oinstall /opt/oracle72fullbackup\r
expect ]#
send exit\r
expect eof
EOF
# 同样地,改变 /opt/oracle72fullbackup 目录拥有者为 oracle,群组为 oinstall
rm -f ${BACKUP_HOME}tarfileDIR_daily/full_*.tar.gz
# 文件发送完毕后删除总压缩包,节省空间
echo tlm,txmy s daily full backup job is done at $(date +%Y-%m-%d_%T) ${BACKUPTOOL_HOME}dailyfullbackup.result
# 在本地的 dailyfullbackup.result 文件中记录以上操作的结束时间,呼应开头统计开始时间
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。