ORACLE备份脚本
业务------
rman_bak0.sh
此脚本使用RMAN(Recovery Manager)自动化Oracle数据库的备份过程,包括创建备份目录、设置保留策略、删除过期的备份和归档日志等操作。
#************************************************************************
#*** rman_bak_L0.sh ***
#************************************************************************
#!/bin/bash
# 加载Oracle环境变量
source /home/oracle/.bash_profile
# 获取当前日期,格式为YYYYMMDD,用于备份目录命名
rq=`date +%Y%m%d`
# 定义基于当前日期的备份目录路径
bakdir=/back/rman_bak/rman_bak/${rq}
# 定义自动备份的目录路径
autobak=/back/rman_bak/rman_bak/autobackup
# 如果备份目录不存在,则创建它
if [ ! -d ${bakdir} ]; then
    mkdir -p ${bakdir}
fi
# 如果自动备份目录不存在,则创建它
if [ ! -d ${autobak} ]; then
    mkdir -p ${autobak}
fi
# 切换到RMAN二进制文件所在目录
cd $ORACLE_HOME/bin
# 执行RMAN命令,将输出记录到日志文件中
./rman log $bakdir/rman${rq}.log target / <<EOF
# 设置保留策略,保留恢复窗口为1天内的备份
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 1 DAYS;
# 开启自动控制文件备份
CONFIGURE CONTROLFILE AUTOBACKUP ON;
# 配置磁盘设备类型的自动控制文件备份格式
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F';
#crosscheck backup; # 注释掉的交叉检查所有备份,确认它们的有效性
# 删除过期的备份
delete noprompt expired backup;
# 交叉检查所有归档日志,确认它们的有效性
crosscheck archivelog all;
# 删除过期的归档日志
delete noprompt expired archivelog all;
# 开始备份操作
run {
# 执行增量级别0的压缩备份,包括当前的控制文件
backup incremental level=0 as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc';
}
# 删除在系统日期前1天完成的所有归档日志
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
# 删除由于保留策略而变得过时的磁盘设备类型的备份
delete noprompt obsolete device type disk;
# 退出RMAN
exit;
EOF
rman_bak1.sh
该脚本主要用于自动化数据库的增量备份,其中级别1的备份是在上次级别0或级别1的基础上进行的,仅备份自上次增量备份以来发生更改的数据块。这种备份策略可以节省存储空间并减少备份时间
#************************************************************************ #*** rman_bak_L1.sh *** #************************************************************************ #!/bin/bash # 加载Oracle用户的bash配置文件 source /home/oracle/.bash_profile # 获取当前日期并转换为YYYYMMDD格式 rq=`date +%Y%m%d` # 定义备份目录,根据当前日期 bakdir=/back/rman_bak/rman_bak/${rq} # 定义自动备份目录 autobak=/back/rman_bak/rman_bak/autobackup # 检查备份目录是否存在,如果不存在则创建 if [ ! -d ${bakdir} ]; then mkdir -p ${bakdir} fi # 检查自动备份目录是否存在,如果不存在则创建 if [ ! -d ${autobak} ]; then mkdir -p ${autobak} fi # 切换到Oracle的bin目录 cd $ORACLE_HOME/bin # 执行RMAN命令,同时记录日志 ./rman log $bakdir/rman${rq}.log target / <<EOF # 设置保留策略为3天的恢复窗口 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS; # 开启自动控制文件备份功能 CONFIGURE CONTROLFILE AUTOBACKUP ON; # 设置自动控制文件备份的格式和位置 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F'; #crosscheck backup; # 交叉检查备份集和镜像副本,确认其可用性(注释掉) # 删除过期的备份 delete noprompt expired backup; # 交叉检查所有归档日志,确认其可用性 crosscheck archivelog all; # 删除过期的归档日志 delete noprompt expired archivelog all; # 开始RMAN备份任务 run { # 执行增量级别1的累积备份,包括当前的控制文件 backup incremental level=1 cumulative as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc'; } # 删除在系统日期前1天完成的所有归档日志 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1'; # 删除过时的磁盘设备类型上的备份 delete noprompt obsolete device type disk; # 结束RMAN会话 exit; EOF
rman_bakfull.sh
下是带有中文注释的RMAN备份脚本。此脚本执行全量级别的0级备份,并包含多个通道分配以提高备份效率
上述脚本中分配了大量的通道(c1至c30),这通常是为了利用多核处理器的并行处理能力来加速备份过程。然而,在实际部署中,通道数量应根据系统资源和网络带宽合理调整
#************************************************************************ #*** rman_bak_L0.sh *** #************************************************************************ #!/bin/bash # 加载Oracle用户的bash环境配置文件 source /home/oracle/.bash_profile # 获取当前日期,格式为YYYYMMDD rq=`date +%Y%m%d` # 定义备份目录,包含当前日期 bakdir=/back/rman_bak/rman_bak/${rq} # 定义自动备份目录 autobak=/back/rman_bak/rman_bak/autobackup # 如果备份目录不存在,则创建 if [ ! -d ${bakdir} ]; then mkdir -p ${bakdir} fi # 如果自动备份目录不存在,则创建 if [ ! -d ${autobak} ]; then mkdir -p ${autobak} fi # 切换到Oracle的bin目录 cd $ORACLE_HOME/bin # 执行RMAN命令,将日志输出到指定文件 ./rman log $bakdir/rman${rq}.log target / <<EOF # 设置恢复窗口为1天的保留策略 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 1 DAYS; # 开启自动控制文件备份 CONFIGURE CONTROLFILE AUTOBACKUP ON; # 配置自动控制文件备份的格式和位置 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F'; # 以下行被注释,不执行备份的交叉检查 #crosscheck backup; # 以下行被注释,不执行过期备份的删除 #delete noprompt expired backup; # 交叉检查所有归档日志,确认它们的有效性 crosscheck archivelog all; # 删除过期的归档日志 delete noprompt expired archivelog all; # 开始RMAN运行块,进行数据库备份 run { # 分配多个通道以加快备份速度,这里分配了30个通道 allocate channel c1 type disk; allocate channel c2 type disk; ... allocate channel c30 type disk; # 执行增量级别0的压缩备份,包括当前控制文件和归档日志 backup incremental level=0 as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc '; # 释放所有之前分配的通道 release channel c1; release channel c2; ... release channel c30; } # 删除3天前完成的所有归档日志 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3'; # 删除过时的磁盘设备类型的备份 delete noprompt obsolete device type disk; # 退出RMAN会话 exit; EOF
您提到的三个脚本都使用RMAN(Recovery Manager)来备份Oracle数据库,但它们之间存在一些关键的区别,主要体现在备份策略、备份类型以及资源管理上。下面我将对比这三个脚本的主要差异:
第一个脚本: rman_bak_L0.sh
- 备份类型: 这个脚本执行的是一个增量级别0的备份,即完全备份,它会备份数据库中的所有数据块,无论这些数据块是否已发生变化。
 - 备份频率: 通常用于定期的完全备份,作为增量备份的基础。
 - 资源管理: 没有显式地分配或释放备份通道,可能会使用默认的单个备份通道进行备份,这可能影响备份的效率,尤其是在大数据库环境中。
 
第二个脚本: rman_bak_L1.sh
- 备份类型: 执行的是增量级别1的累积型备份,这意味着它只会备份自上次级别0或级别1备份以来发生变化的数据块,且累积所有变化直到下一次级别0备份。
 - 备份频率: 通常用于日常的增量备份,以便快速且高效地备份只有少量变化的数据块。
 - 资源管理: 同样没有显式地管理备份通道,可能使用默认配置。
 
第三个脚本: rman_bak_L0.sh (扩展版)
- 备份类型: 类似于第一个脚本,执行增量级别0的完全备份。
 - 资源管理: 显式地分配了多个备份通道(最多30个),这可以显著提高备份的效率,尤其是当数据库很大或者有多个数据文件分布在不同的磁盘上时。每个通道可以并行处理不同的数据文件,从而缩短总备份时间。
 - 备份频率: 虽然执行的是完全备份,但由于使用了多通道,因此可以在较短时间内完成,适合在资源丰富的环境下执行。
 
总结
- 备份类型和频率决定了哪些数据会被备份以及备份的周期。
 - 资源管理(如备份通道的分配)影响了备份的性能,特别是在大型数据库环境中,适当的资源管理可以显著提高备份效率。
 
在设计备份策略时,通常会结合使用完全备份和增量备份,以平衡备份的时间、存储需求和恢复的灵活性。
公式-----
这个脚本用于自动化Oracle数据库的完全备份过程,并利用RMAN的并行处理能力通过分配多个通道来提高备份效率。同时,脚本还包含了过期数据的清理和控制文件的自动备份配置
#************************************************************************ #*** rman_bak_L0.sh *** #************************************************************************ #!/bin/bash # 加载Oracle环境变量。 source /home/oracle/.bash_profile # 获取当前日期,格式为YYYYMMDD,用于备份目录命名。 rq=`date +%Y%m%d` # 定义包含当前日期的备份目录。 bakdir=/opt/rman_bak/${rq} # 定义自动备份目录。 autobak=/opt/rman_bak/autobackup # 检查备份目录是否存在,如果不存在,则创建。 if [ ! -d ${bakdir} ]; then mkdir -p ${bakdir} fi # 检查自动备份目录是否存在,如果不存在,则创建。 if [ ! -d ${autobak} ]; then mkdir -p ${autobak} fi # 切换目录到Oracle家目录下的bin目录。 cd $ORACLE_HOME/bin # 执行RMAN命令,将输出记录到文件中。 ./rman log $bakdir/rman${rq}.log target / <<EOF # 设置保留策略,保留3天内的备份。 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS; # 启用自动控制文件备份。 CONFIGURE CONTROLFILE AUTOBACKUP ON; # 设置控制文件自动备份的格式。 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F'; # Crosscheck all backups to verify their integrity. # 交叉检查所有备份,验证其完整性。 crosscheck backup; # 根据保留策略删除任何已过期的备份。 delete noprompt expired backup; # 交叉检查所有归档重做日志,确保它们仍然可访问。 crosscheck archivelog all; # 删除任何已过期的归档重做日志。 delete noprompt expired archivelog all; # 使用多个通道开始备份过程,以便并行处理。 run { allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; allocate channel c5 type disk; # 执行增量级别0的备份,压缩数据。 backup incremental level=0 as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc'; # 完成备份后释放分配的通道。 release channel c1; release channel c2; release channel c3; release channel c4; release channel c5; } # 删除3天前完成的所有归档重做日志。 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3'; # 删除由于保留策略现在变得过时的任何备份。 delete noprompt obsolete device type disk; # 退出RMAN。 exit; EOF
一张网协同----
#!/bin/bash #*************************************************** #**********自动备份数据库******************* #*************************************************** a=$(date '+%Y%m%d') echo topicis_$a #su - oracle export ORACLE_HOME=/opt/u01/app/oracle/product/11.2.0.3 export ORACLE_SID=orcl export PATH=$ORACLE_HOME/bin:$PATH
expdp user/passwd@orcl directory=BACK_DIR dumpfile=ldcss_$a.dmp logfile=ldcss_$a.log
汇总--
#!/bin/bash # 加载Oracle用户的环境变量,确保ORACLE_HOME等环境变量被正确设置 source /home/oracle/.bash_profile # 获取当前日期,格式为YYYYMMDD,用于作为备份目录名的一部分 rq=`date +%Y%m%d` # 设置备份文件存放的目录 bakdir=/opt/app/oracle/rman_bak/${rq} # 设置自动备份控制文件的目录 autobak=/opt/app/oracle/rman_bak/autobackup # 如果备份目录不存在,则创建之 if [ ! -d ${bakdir} ]; then mkdir -p ${bakdir} fi # 如果自动备份目录不存在,则创建之 if [ ! -d ${autobak} ]; then mkdir -p ${autobak} fi # 切换到Oracle的bin目录下,以便可以执行RMAN命令 cd $ORACLE_HOME/bin # 开始执行RMAN命令,输出日志到指定的文件 ./rman log $bakdir/rman${rq}.log target / <<EOF # 配置保留策略,保留3天内的数据恢复窗口 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS; # 开启自动备份控制文件 CONFIGURE CONTROLFILE AUTOBACKUP ON; # 设置自动备份控制文件的格式和位置 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F'; # 检查备份的有效性,标记已过期的备份 crosscheck backup; # 删除所有已过期的备份 delete noprompt expired backup; # 检查归档日志的有效性,标记已过期的日志 crosscheck archivelog all; # 删除所有已过期的归档日志 delete noprompt expired archivelog all; # 开始RMAN run块,执行备份任务 run { # 分配四个磁盘类型的通道用于备份 allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; # 执行增量级别0的压缩备份,包括当前的控制文件,同时备份归档日志 backup incremental level=0 as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc'; # 释放之前分配的所有通道 release channel c1; release channel c2; release channel c3; release channel c4; } # 删除超过3天前的归档日志 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3'; # 删除已经过时的备份(根据保留策略) delete noprompt obsolete device type disk; # 结束RMAN会话 exit; # RMAN命令结束标记 EOF
标准--
这个脚本用于自动化执行Oracle数据库的完全备份,其中包括控制文件的自动备份、清理过期的备份和归档日志,以及使用多个备份通道进行并行的数据库和归档日志备份
#************************************************************************ #*** rman_bak_L0.sh *** #************************************************************************ #!/bin/bash # 加载Oracle环境变量,确保ORACLE_HOME和ORACLE_SID等被正确设置 source /home/oracle/.bash_profile # 注释行,用于设定ORACLE_SID,但在实际脚本中并未使用 #export ORACLE_SID=topicis # 获取当前日期,格式为YYYYMMDD,用于构建备份目录名 rq=`date +%Y%m%d` # 设定备份目录,使用当前日期作为子目录名 bakdir=/opt/rman_bak/${rq} # 设定自动备份目录,用于保存控制文件的自动备份 autobak=/opt/rman_bak/autobackup # 如果备份目录不存在,则创建之 if [ ! -d ${bakdir} ]; then mkdir -p ${bakdir} fi # 如果自动备份目录不存在,则创建之 if [ ! -d ${autobak} ]; then mkdir -p ${autobak} fi # 切换到Oracle的bin目录,以便执行RMAN命令 cd $ORACLE_HOME/bin # 开始执行RMAN命令,将日志输出到指定文件 ./rman log $bakdir/rman${rq}.log target / <<EOF # 开启控制文件的自动备份 CONFIGURE CONTROLFILE AUTOBACKUP ON; # 设定控制文件自动备份的格式和位置 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F'; # 检查所有备份,确保其有效性 crosscheck backup; # 删除所有已过期的备份 delete noprompt expired backup; # 检查所有归档日志,确保其有效性 crosscheck archivelog all; # 删除所有已过期的归档日志 delete noprompt expired archivelog all; # 开始RMAN run块,执行备份任务 run { # 分配六个磁盘类型的通道用于并行备份 allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; allocate channel c5 type disk; allocate channel c6 type disk; # 执行增量级别0的压缩备份,包括当前的控制文件和归档日志 backup incremental level=0 as compressed backupset database include current controlfile format '${bakdir}/%U.bak' plus archivelog format '${bakdir}/%U.arc'; # 释放之前分配的所有通道 release channel c1; release channel c2; release channel c3; release channel c4; release channel c5; release channel c6; } # 删除两天前完成的所有归档日志 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-2'; # 删除所有已过时的磁盘设备类型的备份 delete noprompt obsolete device type disk; # 结束RMAN会话 exit; # EOF标记结束RMAN的输入 EOF
                    
                
                
            
        
浙公网安备 33010602011771号