linux下rman全备与增量脚本

简介:

一.一些准备知识

Oracle分归档和非归档模式。这两者的区别就是对redolog的处理。归档模式下,当一个redolog写满之后,就会把这个redolog里的内容写入归档文件,等写完之后,这个redolog就可以继续使用,如果是非归档模式下,redolog就直接覆盖了。恢复一般都需要归档文件,这里面记录了对数据库的操作,所以生产库一般都运行在归档模式下。关于归档模式和非归档模式的切换参考Blog

Oracle归档与非归档的切换

RMAN备份的存放位置也有2种选择,一种是直接备份到磁盘,另一种就是备份到磁带。现在的大公司,一般都使用SymnatecVeritasNetBackup软件来进行备份。这款软件扩展了RMAN的功能和优点,所有用起来比较方便。08年刚工作的时候就遇到了一个安装NetBackup的实战机会,可惜那时刚接触Oracle,连Oracle都不了解,更不提NetBackup了,转眼2年过去了,在也没有遇到这样的机会,不知道什么时候才能玩玩NetBackup。遗憾啊。

使用RMAN备份也分catalognocatalog,就是是否使用恢复目录,如果不使用恢复目录,那么就是用controlfile作为catalog,每一次备份都要往控制文件里面写好多备份信息,控制文件里面会有越来越多的备份信息。因此,当使用rmannocatalog方式备份时,备份controlfile是非常重要的。如果使用catalog模式,就需要句需要创建catalog目录。当库比较多时,使用catalog也是比较方便的。具体参考:

RMAN的备份也分两种,一种是全备,另一种增量备份。全备适用与数据库比较小的情况,如果库大的话就需要使用增量备份了,因为这样能减少备份的时间。Window下的备份脚本,参考Blog

修改控制文件的保存时间,从默认的7天改成14

SQL>showparametercontrol

SQL>altersystemsetcontrol_file_record_keep_time=14scope=both;

开启控制文件的自动备份,开启之后在数据库备份或者数据文件(比如添加数据文件)有修改的时候都会自动备份控制文件和spfile文件。

Configurecontrolfileautobackupon;

当数据库兼容性设置为大于等于10.0.0时,尽管在没有0级备份情况做1级的增量备份实际上是一个全备,但是这个全备也是1级的,不能用作1级积累增量备份的基础备份,这个是在设计备份策略的时候要注意的问题。

二.全备脚本

nocatalog模式为例:

Shell脚本:

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

##hot_database_backup.sh##

##createdbyTianlesoftware##

##2010-7-16##

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

#!/bin/sh

#---------------------------------------------------------------------------

#Determinetheuserwhichisexecutingthisscript.

#---------------------------------------------------------------------------

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

#---------------------------------------------------------------------------

#Putoutputin<thisfilename>.out.Changeasdesired.

#Note:outputdirectoryrequireswritepermission.

#---------------------------------------------------------------------------

RMAN_LOG_FILE=${0}.out

#---------------------------------------------------------------------------

#Youmaywanttodeletetheoutputfilesothatbackupinformationdoes

#notaccumulate.Ifnot,deletethefollowinglines.

#---------------------------------------------------------------------------

if[-f"$RMAN_LOG_FILE"]

then

rm-f"$RMAN_LOG_FILE"

fi

#-----------------------------------------------------------------

#Initializethelogfile.

#-----------------------------------------------------------------

echo>>$RMAN_LOG_FILE

chmod666$RMAN_LOG_FILE

#---------------------------------------------------------------------------

#Logthestartofthisscript.

#---------------------------------------------------------------------------

echoScript0>>RMAN_LOG_FILE

echo====startedon`date`====>>$RMAN_LOG_FILE

echo>>$RMAN_LOG_FILE

#---------------------------------------------------------------------------

#Oraclehomepath.

#---------------------------------------------------------------------------

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

exportORACLE_HOME

#---------------------------------------------------------------------------

#theOracleSIDofthetargetdatabase.

#---------------------------------------------------------------------------

ORACLE_SID=orcl

exportORACLE_SID

#---------------------------------------------------------------------------

#TheOracleDBAuserid(account).

#---------------------------------------------------------------------------

ORACLE_USER=oracle

exportORACLE_USER

#---------------------------------------------------------------------------

#SettheOracleRecoveryManagername.

#---------------------------------------------------------------------------

RMAN=$ORACLE_HOME/bin/rman

#---------------------------------------------------------------------------

#Printoutthevalueofthevariablessetbythisscript.

#---------------------------------------------------------------------------

echo>>$RMAN_LOG_FILE

echo"RMAN:RMAN">>RMAN_LOG_FILE

echo"ORACLE_SID:ORACLESID">>RMAN_LOG_FILE

echo"ORACLE_USER:ORACLEUSER">>RMAN_LOG_FILE

echo"ORACLE_HOME:ORACLEHOME">>RMAN_LOG_FILE

#---------------------------------------------------------------------------

#Printoutthevalueofthevariablessetbybphdb.

#---------------------------------------------------------------------------

#echo>>$RMAN_LOG_FILE

#echo"NB_ORA_FULL:NBORAFULL">>RMAN_LOG_FILE

#echo"NB_ORA_INCR:NBORAINCR">>RMAN_LOG_FILE

#echo"NB_ORA_CINC:NBORACINC">>RMAN_LOG_FILE

#echo"NB_ORA_SERV:NBORASERV">>RMAN_LOG_FILE

#echo"NB_ORA_POLICY:NBORAPOLICY">>RMAN_LOG_FILE

#---------------------------------------------------------------------------

#NOTE:Thisscriptassumesthatthedatabaseisproperlyopened.Ifdesired,

#thiswouldbetheplacetoverifythat.

#---------------------------------------------------------------------------

echo>>$RMAN_LOG_FILE

#---------------------------------------------------------------------------

#---------------------------------------------------------------------------

#CallRecoveryManagertoinitiatethebackup.

#---------------------------------------------------------------------------

CMD_STR="

ORACLE_HOME=$ORACLE_HOME

exportORACLE_HOME

ORACLE_SID=$ORACLE_SID

exportORACLE_SID

RMANnocatalogtargetsys/adminmsglogRMAN_LOG_FILEappend<<EOF

RUN{

allocatechannelc1typedisk;

allocatechannelc2typedisk;

BACKUPFORMAT'/u01/backup/orcl_%U_%T'skipinaccessiblefilesperset5DATABASETAGorcl_hot_db_bk;

sql'altersystemarchivelogcurrent';

BACKUPFORMAT'/u01/backup/arch_%U_%T'skipinaccessiblefilesperset5ARCHIVELOGALLDELETEINPUT;

backupcurrentcontrolfiletag='bak_ctlfile'format='/u01/backup/ctl_file_%U_%T';

backupspfiletag='spfile'format='/u01/backup/ORCL_spfile_%U_%T';

releasechannelc2;

releasechannelc1;

}

reportobsolete;

deletenopromptobsolete;

crosscheckbackup;

deletenopromptexpiredbackup;

listbackupsummary;

#EOF

"

#Initiatethecommandstring

if["$CUSER"="root"]

then

echo"RootCommandString:CMDSTR">>RMAN_LOG_FILE

su-ORACLEUSERc"CMD_STR">>$RMAN_LOG_FILE

RSTAT=$?

else

echo"UserCommandString:CMDSTR">>RMAN_LOG_FILE

/bin/sh-c"CMDSTR">>RMAN_LOG_FILE

RSTAT=$?

fi

#---------------------------------------------------------------------------

#Logthecompletionofthisscript.

#---------------------------------------------------------------------------

if["$RSTAT"="0"]

then

LOGMSG="endedsuccessfully"

else

LOGMSG="endedinerror"

fi

echo>>$RMAN_LOG_FILE

echoScript0>>RMAN_LOG_FILE

echo====LOGMSGondate====>>RMAN_LOG_FILE

echo>>$RMAN_LOG_FILE

/bin/mailx-s"RMANBackupSID"daimm@sf-express.com<$RMAN_LOG_FILE

exit$RSTAT

三.增量备份

catalog模式为例:

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

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

SQL>createtablespacecatalog_tsdatafile'D:/APP/ADMINISTRATOR/ORADATA/ORCL/catalog_ts1.dbf'size20M;

2.创建RMAN用户并授权

SQL>createusercatalogidentifiedbycatalogdefaulttablespacecatalog_ts;

SQL>grantrecovery_catalog_ownertocatalog;

查看角色所拥有的权限:

select*fromdba_sys_privswheregrantee='RECOVERY_CATALOG_OWNER';

3.创建恢复目录

[oracle@db1scripts]$rmantarget/catalogcatalog/catalog@catalog1;

RecoveryManager:Release10.2.0.1.0-ProductiononThuJul1512:03:162010

Copyright(c)1982,2005,Oracle.Allrightsreserved.

connectedtotargetdatabase:ORCL(DBID=1248423599)

connectedtorecoverycatalogdatabase

RMAN>createcatalogtablespacecatalog_ts;

recoverycatalogcreated

如果此处报错:

ORACLEerrorfromrecoverycatalogdatabase:ORA-00955:nameisalreadyusedbyanexistingobject

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

RMAN>dropcatalog;

recoverycatalogownerisCATALOG

enterDROPCATALOGcommandagaintoconfirmcatalogremoval

RMAN>dropcatalog

recoverycatalogdropped

RMAN>registerdatabase;

databaseregisteredinrecoverycatalog

startingfullresyncofrecoverycatalog

fullresynccomplete

RMAN>

差异备份有3个级别:

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

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

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

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

Shell脚本:

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

##incremental_hot_database_backup.sh##

##createdbyTianlesoftware##

##2010-7-16##

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

#!/bin/ksh

export

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

exportORACLE_HOME

RMAN=$ORACLE_HOME/bin/rman

exportRMAN

ORACLE_SID=orcl

exportORACLE_SID

ORACLE_USER=oracle

exportORACLE_USER

echo"ORACLE_SID:ORACLESID">>RMAN_LOG_FILE

echo"ORACLE_HOME:ORACLEHOME">>RMAN_LOG_FILE

echo"ORACLE_USER:ORACLEUSER">>RMAN_LOG_FILE

echo"==========================================">>$RMAN_LOG_FILE

echo"BACKUPDATABASEBEGIN......">>$RMAN_LOG_FILE

echo"">>$RMAN_LOG_FILE

chmod666$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

exportBAK_LEVEL=$BAK_LEVEL

echo"Todayis:WEEKDAILYincrementallevel=BAK_LEVEL">>$RMAN_LOG_FILE

RUN_STR="

BAK_LEVEL=$BAK_LEVEL

exportBAK_LEVEL

ORACLE_HOME=$ORACLE_HOME

exportORACLE_HOME

ORACLE_SID=$ORACLE_SID

exportORACLE_SID

$RMANTARGETsys/adminCATALOGcatalog/catalog@catalog1msglog$RMAN_LOG_FILEappend<<EOF

run

{

allocatechannelc1typedisk;

allocatechannelc2typedisk;

backupincrementallevel=BAKLEVELskipinaccessiblefilesperset5Databaseformat=/u01/backup/orcllev"BAK_LEVEL"_%U_%T'tag='orcl_lev"$BAK_LEVEL"';

sql'altersystemarchivelogcurrent';

backuparchivelogalltag='arc_bak'format='/u01/backup/arch_%U_%T'skipinaccessiblefilesperset5notbackedup1timesdeleteinput;

backupcurrentcontrolfiletag='bak_ctlfile'format='/u01/backup/ctl_file_%U_%T';

backupspfiletag='spfile'format='/u01/backup/ORCL_spfile_%U_%T';

releasechannelc2;

releasechannelc1;

}

reportobsolete;

deletenopromptobsolete;

crosscheckbackup;

deletenopromptexpiredbackup;

listbackupsummary;

resynccatalog;

EOF

"

#Initiatethecommandstring

if["$CUSER"="root"]

then

echo"RootCommandString:RUNSTR">>RMAN_LOG_FILE

su-ORACLEUSERc"RUN_STR">>$RMAN_LOG_FILE

RSTAT=$?

else

echo"UserCommandString:RUNSTR">>RMAN_LOG_FILE

/bin/sh-c"RUNSTR">>RMAN_LOG_FILE

RSTAT=$?

fi

#---------------------------------------------------------------------------

#Logthecompletionofthisscript.

#---------------------------------------------------------------------------

if["$RSTAT"="0"]

then

LOGMSG="endedsuccessfully"

else

LOGMSG="endedinerror"

fi

echo>>$RMAN_LOG_FILE

echoScript0>>RMAN_LOG_FILE

echo====LOGMSGondate====>>RMAN_LOG_FILE

echo>>$RMAN_LOG_FILE

/bin/mailx-s"RMANBackupSID"daimm@sf-express.com<$RMAN_LOG_FILE

exit$RSTAT

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

[oracle@db1u01]$crontab-l

001***/u01/scripts/incremental_hotbackup.sh

Unixcrontab命令详解

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

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

[root@db1~]#date--set"2010-7-1611:11:11"

------------------------------2010年8月23日补充--------------------------

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

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

del_archive_backup.sh

#!/bin/ksh
###################################################################
#
#deletearchvivelogbackupfile.sh
#tianlesoftware
#
###################################################################
PATH=/usr/bin:/usr/ucb:/etc:.:/usr/X/bin:/bin
exportPATH
find/u01/incremental_hotbackup-mtime+15-name"arch_*"-execrm{}/;















本文转自东方之子736651CTO博客,原文链接:http://blog.51cto.com/ecloud/1324085 ,如需转载请自行联系原作者



目录
打赏
0
0
0
0
143
分享
相关文章
|
5天前
|
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
57 25
|
14天前
|
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
114 28
|
3月前
|
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
154 32
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
141 34
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
Linux 下 Oracle 数据库RMAN备份 0级全备加1级增量备份
1、使用Linux Crontal 定时任务来定时对数据库做备份 每日19点开始0级全备,其他时段每小时做1级增量备份 crontab -l 0 19 * * * nohup /rmanbak/script/backup0-1.
2402 0
|
2月前
|
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
159 56
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
96 24