温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解数据泵与rman脚本

发布时间:2021-11-12 09:21:18 来源:亿速云 阅读:120 作者:柒染 栏目:关系型数据库

如何理解数据泵与rman脚本,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

脚本主要逻辑:全库备份读取到的实例的数据库,连同附属功能性文件(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文件中记录以上操作的结束时间,呼应开头统计开始时间

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI