Linux平台下如何实现RMAN 全备和增量备份shell脚本

68次阅读
没有评论

共计 10568 个字符,预计需要花费 27 分钟才能阅读完成。

这篇文章主要介绍了 Linux 平台下如何实现 RMAN 全备和增量备份 shell 脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

全备脚本

以  nocatalog  模式为例:

Shell  脚本:

########################################################################

## hot_database_backup.sh ##

## created by Tianlesoftware ##

## 2010-7-16 ##

#########################################################################

#!/bin/sh 

# ————————————————————————— 

# Determine the user which is executing this script. 

# ————————————————————————— 

CUSER=`id |cut -d ( -f2 | cut -d )  -f1` 

# ————————————————————————— 

# Put output in  this file name .out. Change as desired. 

# Note: output directory requires write permission. 

# ————————————————————————— 

RMAN_LOG_FILE=${0}.out 

# ————————————————————————— 

# You may want to delete the output file so that backup information does 

# not accumulate. If not, delete the following lines. 

# ————————————————————————— 

if [ -f  $RMAN_LOG_FILE  ] 

then 

rm -f  $RMAN_LOG_FILE  

fi 

# —————————————————————– 

# Initialize the log file. 

# —————————————————————– 

echo   $RMAN_LOG_FILE 

chmod 666 $RMAN_LOG_FILE 

# ————————————————————————— 

# Log the start of this script. 

# ————————————————————————— 

echo Script $0   $RMAN_LOG_FILE 

echo ==== started on `date` ====   $RMAN_LOG_FILE 

echo   $RMAN_LOG_FILE 

# ————————————————————————— 

# Oracle home path. 

# ————————————————————————— 

ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1 

export ORACLE_HOME 

# ————————————————————————— 

# the Oracle SID of the target database. 

# ————————————————————————— 

ORACLE_SID=orcl 

export ORACLE_SID 

# ————————————————————————— 

# The Oracle DBA user id (account). 

# ————————————————————————— 

ORACLE_USER=oracle 

export ORACLE_USER 

# ————————————————————————— 

# Set the Oracle Recovery Manager name. 

# ————————————————————————— 

RMAN=$ORACLE_HOME/bin/rman 

# ————————————————————————— 

# Print out the value of the variables set by this script. 

# ————————————————————————— 

echo   $RMAN_LOG_FILE 

echo  RMAN: $RMAN    $RMAN_LOG_FILE 

echo  ORACLE_SID: $ORACLE_SID    $RMAN_LOG_FILE 

echo  ORACLE_USER: $ORACLE_USER    $RMAN_LOG_FILE 

echo  ORACLE_HOME: $ORACLE_HOME    $RMAN_LOG_FILE 

# ————————————————————————— 

# Print out the value of the variables set by bphdb. 

# ————————————————————————— 

#echo   $RMAN_LOG_FILE 

#echo  NB_ORA_FULL: $NB_ORA_FULL    $RMAN_LOG_FILE 

#echo  NB_ORA_INCR: $NB_ORA_INCR    $RMAN_LOG_FILE 

#echo  NB_ORA_CINC: $NB_ORA_CINC    $RMAN_LOG_FILE 

#echo  NB_ORA_SERV: $NB_ORA_SERV    $RMAN_LOG_FILE 

#echo  NB_ORA_POLICY: $NB_ORA_POLICY    $RMAN_LOG_FILE 

# ————————————————————————— 

# NOTE: This script assumes that the database is properly opened. If desired, 

# this would be the place to verify that. 

# ————————————————————————— 

echo   $RMAN_LOG_FILE 

# ————————————————————————— 

# ————————————————————————— 

# Call Recovery Manager to initiate the backup. 

# ————————————————————————— 

CMD_STR=  

ORACLE_HOME=$ORACLE_HOME 

export ORACLE_HOME 

ORACLE_SID=$ORACLE_SID 

export ORACLE_SID 

$RMAN nocatalog target sys/admin msglog $RMAN_LOG_FILE append   EOF 

RUN { 

allocate channel c1 type disk;

allocate channel c2 type disk;

BACKUP FORMAT  /u01/backup/orcl_%U_%T  skip inaccessible filesperset 5 DATABASE TAG orcl_hot_db_bk; 

sql  alter system archive log current

BACKUP FORMAT  /u01/backup/arch_%U_%T  skip inaccessible filesperset 5 ARCHIVELOG ALL DELETE INPUT; 

backup current controlfile tag= bak_ctlfile  format= /u01/backup/ctl_file_%U_%T

backup spfile tag= spfile  format= /u01/backup/ORCL_spfile_%U_%T

release channel c2;

release channel c1;

}

report obsolete; 

delete noprompt obsolete; 

crosscheck backup; 

delete noprompt expired backup;

list backup summary; 

#EOF 

 

# Initiate the command string 

if [  $CUSER  =  root  ] 

then 

 echo  Root Command String: $CMD_STR    $RMAN_LOG_FILE 

 su – $ORACLE_USER -c  $CMD_STR    $RMAN_LOG_FILE 

 RSTAT=$? 

else 

 echo  User Command String: $CMD_STR    $RMAN_LOG_FILE 

 /bin/sh -c  $CMD_STR    $RMAN_LOG_FILE 

 RSTAT=$? 

fi 

# ————————————————————————— 

# Log the completion of this script. 

# ————————————————————————— 

if [  $RSTAT  =  0  ] 

then 

 LOGMSG= ended successfully  

else 

 LOGMSG= ended in error  

fi 

echo   $RMAN_LOG_FILE 

echo Script $0   $RMAN_LOG_FILE 

echo ==== $LOGMSG on `date` ====   $RMAN_LOG_FILE 

echo   $RMAN_LOG_FILE 

/bin/mailx -s  RMAN Backup SID   daimm@sf-express.com   $RMAN_LOG_FILE 

exit $RSTAT 

三.  增量备份

以 catalog 模式为例:

在存放 catalog 的实例上创建 catalog  目录:

1. 创建 Catalog 所需要的表空间

SQL create tablespace catalog_ts datafile  D:/APP/ADMINISTRATOR/ORADATA/ORCL/catalog_ts1.dbf  size 20M;

2. 创建 RMAN 用户并授权

SQL create user catalog identified by catalog default tablespace catalog_ts;

SQL grant recovery_catalog_owner to catalog; 

查看角色所拥有的权限: 

select * from dba_sys_privs where grantee= RECOVERY_CATALOG_OWNER

3. 创建恢复目录

[oracle@db1 scripts]$ rman target / catalog catalog/catalog@catalog1;

Recovery Manager: Release 10.2.0.1.0 – Production on Thu Jul 15 12:03:16 2010

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: ORCL (DBID=1248423599)

connected to recovery catalog database

RMAN  create catalog tablespace catalog_ts;

recovery catalog created

如果此处报错:

ORACLE error from recovery catalog database: ORA-00955: name is already used by an existing object

可以用命令删除 catalog,在创建:

RMAN  drop catalog;

recovery catalog owner is CATALOG

enter DROP CATALOG command again to confirm catalog removal

RMAN  drop catalog

recovery catalog dropped

RMAN  register database;

database registered in recovery catalog

starting full resync of recovery catalog

full resync complete

RMAN

差异备份有 3 个级别: 

0 级:相当于全备,不同的是 0 级可用于增量备份,全备不行。

1 级:备份自上次 0 级备份以来的数据

2 级:备份自上次备份依赖的数据

脚本的增量备份策略:  周日 0 级备份,周四 1 级备份,其他 2 级备份

Shell  脚本:

########################################################################

## incremental_hot_database_backup.sh ##

## created by Tianlesoftware ##

## 2010-7-16 ##

#########################################################################

#!/bin/ksh 

export LANG=en_US

BACKUP_DATE=`date +%d`

RMAN_LOG_FILE=${0}.out

TODAY=`date`

USER=`id|cut -d  ( -f2|cut -d )  -f1`

echo  —————–$TODAY——————- $RMAN_LOG_FILE

ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1

export ORACLE_HOME

RMAN=$ORACLE_HOME/bin/rman

export RMAN

ORACLE_SID=orcl

export ORACLE_SID

ORACLE_USER=oracle

export ORACLE_USER

echo  ORACLE_SID: $ORACLE_SID $RMAN_LOG_FILE

echo  ORACLE_HOME:$ORACLE_HOME $RMAN_LOG_FILE

echo  ORACLE_USER:$ORACLE_USER $RMAN_LOG_FILE

echo  ========================================== $RMAN_LOG_FILE

echo  BACKUP DATABASE BEGIN…… $RMAN_LOG_FILE

echo    $RMAN_LOG_FILE

chmod 666 $RMAN_LOG_FILE

WEEK_DAILY=`date +%a`

case  $WEEK_DAILY  in

  Mon )

 BAK_LEVEL=2

 ;;

  Tue )

 BAK_LEVEL=2

 ;;

  Wed )

 BAK_LEVEL=2

 ;;

  Thu )

 BAK_LEVEL=1

 ;;

  Fri )

 BAK_LEVEL=2

 ;;

  Sat )

 BAK_LEVEL=2

 ;;

  Sun )

 BAK_LEVEL=0

 ;;

  * )

 BAK_LEVEL=error

esac

export BAK_LEVEL=$BAK_LEVEL 

echo  Today is : $WEEK_DAILY incremental level= $BAK_LEVEL $RMAN_LOG_FILE

RUN_STR=

BAK_LEVEL=$BAK_LEVEL

export BAK_LEVEL

ORACLE_HOME=$ORACLE_HOME

export ORACLE_HOME

ORACLE_SID=$ORACLE_SID

export ORACLE_SID

$RMAN TARGET sys/admin CATALOG catalog/catalog@catalog1 msglog $RMAN_LOG_FILE append  EOF

run

{

allocate channel c1 type disk;

allocate channel c2 type disk;

backup incremental level= $BAK_LEVEL skip inaccessible filesperset 5 Database format= /u01/backup/orcl_lev $BAK_LEVEL _%U_%T  tag= orcl_lev $BAK_LEVEL  ;

sql  alter system archive log current

backup archivelog all tag= arc_bak  format= /u01/backup/arch_%U_%T  skip inaccessible filesperset 5 not backed up 1 times delete input;

backup current controlfile tag= bak_ctlfile  format= /u01/backup/ctl_file_%U_%T

backup spfile tag= spfile  format= /u01/backup/ORCL_spfile_%U_%T

release channel c2;

release channel c1;

}

report obsolete; 

delete noprompt obsolete; 

crosscheck backup; 

delete noprompt expired backup;

list backup summary; 

resync catalog;

EOF

 # Initiate the command string 

if [  $CUSER  =  root  ] 

then 

 echo  Root Command String: $RUN_STR    $RMAN_LOG_FILE 

 su – $ORACLE_USER -c  $RUN_STR    $RMAN_LOG_FILE 

 RSTAT=$? 

else 

 echo  User Command String: $RUN_STR    $RMAN_LOG_FILE 

 /bin/sh -c  $RUN_STR    $RMAN_LOG_FILE 

 RSTAT=$? 

fi 

# ————————————————————————— 

# Log the completion of this script. 

# ————————————————————————— 

if [  $RSTAT  =  0  ] 

then 

 LOGMSG= ended successfully  

else 

 LOGMSG= ended in error  

fi 

echo   $RMAN_LOG_FILE 

echo Script $0   $RMAN_LOG_FILE 

echo ==== $LOGMSG on `date` ====   $RMAN_LOG_FILE 

echo   $RMAN_LOG_FILE 

/bin/mailx -s  RMAN Backup SID   daimm@sf-express.com   $RMAN_LOG_FILE 

exit $RSTAT 

将该备份脚本添加到 crontab,  然后定时执行:

[oracle@db1 u01]$ crontab -l

00 1 * * * /u01/scripts/incremental_hotbackup.sh

Unix crontab  命令详解

http://blog.csdn.net/tianlesoftware/archive/2010/02/22/5315039.aspx

在测试的时候,我们可以手工的修改,然后查看脚本的执行情况即可:

[root@db1 ~]# date –set  2010-7-16 11:11:11

——————————2010 年 8 月 23 日补充 ————————–

  用这个脚本的时候发现一个问题,备份集可以通过设定保存粗略定期删除,但是备份的归档文件无法删除。

  所以还需要定期的删除备份的归档文件。一般保存 15 天。shell 脚本如下。添加到 crontab 里定时执行就可以了。

del_archive_backup.sh

#!/bin/ksh
# ##################################################################
#
# delete archvivelog backup file.sh
#  tianlesoftware
#
# ##################################################################
PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin
export PATH
find /u01/incremental_hotbackup -mtime +15 -name arch_* -exec rm {} /;

说明,这里的路径写你自己的就可以了。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“Linux 平台下如何实现 RMAN 全备和增量备份 shell 脚本”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计10568字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)