Oracle RMAN全量+增量备份脚本--生产环境可用

  1. su - oracle
  2. mkdir /backup/rmanbak

1. 全量备份

如果要用RMAN做迁移,要打开块跟踪,可以提升增量备份的速度。打开和关闭块跟踪的方法见第五部分。

根据cpu核数,设置备份通道数。

  1. vi /backup/rmanbak/RMAN_L0_instance_bak.sh
  2. #! /bin/bash
  3. export NLS_LANG='american_america.AL32UTF8'
  4. source /home/oracle/.bash_profile
  5. current_day=`date +%Y%m%d`
  6. if [ ! -d /backup/rmanbak/$current_day ]
  7. then
  8. mkdir -p /backup/rmanbak/$current_day
  9. rman target / <<EOF
  10. run{
  11. allocate channel d1 type disk;
  12. allocate channel d2 type disk;
  13. allocate channel d3 type disk;
  14. allocate channel d4 type disk;
  15. allocate channel d5 type disk;
  16. allocate channel d6 type disk;
  17. allocate channel d7 type disk;
  18. allocate channel d8 type disk;
  19. backup as compressed backupset incremental level 0 database format '/backup/rmanbak/$current_day/ORCL_L0_instance_%s_%d_%T_%u.bkp';
  20. sql 'alter system archive log current';
  21. sql 'alter system archive log current';
  22. sql 'alter system archive log current';
  23. backup archivelog all format '/backup/rmanbak/$current_day/ORCL_arclog_instance_%s_%d_%T_%u.bkp' not backed up 1 times;
  24. backup spfile format '/backup/rmanbak/$current_day/ORCL_spfile_instance_%s_%d_%T_%u.bkp';
  25. backup current controlfile format '/backup/rmanbak/$current_day/ORCL_controlfile_instance_%s_%d_%T_%u.bkp';
  26. delete noprompt ARCHIVELOG until time 'SYSDATE-30';
  27. crosscheck archivelog all;
  28. delete noprompt expired archivelog all;
  29. crosscheck backup;
  30. delete expired backup;
  31. release channel d1;
  32. release channel d2;
  33. release channel d3;
  34. release channel d4;
  35. release channel d5;
  36. release channel d6;
  37. release channel d7;
  38. release channel d8;
  39. }
  40. EOF
  41. else
  42. echo "Database full backup on $current_day has been completed;"
  43. fi
  44. cd /backup/rmanbak
  45. tar -zcvf $current_day.tar.gz $current_day
  46. rm -rf $current_day

2. 增量备份

  1. vi /backup/rmanbak/RMAN_L1_instance_bak.sh
  2. #! /bin/bash
  3. export NLS_LANG='american_america.AL32UTF8'
  4. source /home/oracle/.bash_profile
  5. current_day=`date +%Y%m%d`
  6. if [ ! -d/backup/rmanbak/$current_day ]
  7. then
  8. mkdir -p/backup/rmanbak/$current_day
  9. fi
  10. rman target / <<EOF
  11. run{
  12. allocate channel d1 type disk;
  13. allocate channel d2 type disk;
  14. allocate channel d3 type disk;
  15. allocate channel d4 type disk;
  16. allocate channel d5 type disk;
  17. allocate channel d6 type disk;
  18. allocate channel d7 type disk;
  19. allocate channel d8 type disk;
  20. backup as compressed backupset incremental level 1 cumulative database format '/backup/rmanbak/$current_day/ORCL_L1_instance_%s_%d_%T_%u.bkp';
  21. sql 'alter system archive log current';
  22. sql 'alter system archive log current';
  23. sql 'alter system archive log current';
  24. backup archivelog all format '/backup/rmanbak/$current_day/ORCL_arclog_instance_%s_%d_%T_%u.bkp' not backed up 1 times;
  25. backup spfile format '/backup/rmanbak/$current_day/ORCL_spfile_instance_%s_%d_%T_%u.bkp';
  26. backup current controlfile format '/backup/rmanbak/$current_day/ORCL_controlfile_instance_%s_%d_%T_%u.bkp';
  27. delete noprompt ARCHIVELOG until time 'SYSDATE-30';
  28. crosscheck archivelog all;
  29. delete noprompt expired archivelog all;
  30. crosscheck backup;
  31. delete expired backup;
  32. release channel d1;
  33. release channel d2;
  34. release channel d3;
  35. release channel d4;
  36. release channel d5;
  37. release channel d6;
  38. release channel d7;
  39. release channel d8;
  40. }
  41. EOF
  42. else
  43. echo "Database incremental backup on $current_day has been completed;"
  44. fi
  45. cd /backup/rmanbak
  46. tar -zcvf $current_day.tar.gz $current_day
  47. rm -rf $current_day

3. 定期删除RMAN备份

  1. vi /backup/rmanbak/del_rman_instance_bak.sh
  2. #!/bin/bash
  3. removedir=/backup/rmanbak
  4. dt=`date +%Y%m%d -d "30 day ago"`
  5. Rdir=$removedir
  6. for subdir in `ls $Rdir`;
  7. do
  8. subdir=`echo ${subdir//.*/}`
  9. #subdir=`echo ${subdir}`
  10. if [ "${subdir}" -lt "${dt}" ];
  11. then
  12. rm -rf $Rdir/$subdir.tar.gz >/dev/null
  13. #echo "the directory $Rdir/$subdir has been removed."
  14. fi
  15. chmod 775 /backup/rmanbak/RMAN_L0_instance_bak.sh
  16. chmod 775 /backup/rmanbak/RMAN_L1_instance_bak.sh
  17. chmod 775 /backup/rmanbak/del_rman_instance_bak.sh

4. 设置自动备份任务

  1. crontab -e
  2. 10 0 * * 1 /backup/rmanbak/del_rman_instance_bak.sh >> /backup/rmanbak/del_rman_backup.log 2>&1
  3. 30 0 * * 0 /backup/rmanbak/RMAN_L0_instance_bak.sh >> /backup/rmanbak/rman_backup_L0.log 2>&1
  4. 30 0 * * 1,2,3,4,5,6 /backup/rmanbak/RMAN_L1_instance_bak.sh >> /backup/rmanbak/rman_backup_L1.log 2>&1

5. 相关ORACLE知识

Block Change Tracking(块跟踪)主要用于RMAN备份的增量备份,将自从上一次备份以来数据块的变化记录到block change tracking文件中,相关后台进程CTWR(Change Tracking Writer),

主要目的是改善增量备份性能,RMAN可以不再扫描整个文件以查找变更数据。第一个0级的增量备份扫描整个datafile。 随后的增量备份使用block changetracking file的信息,只扫描自上次备份以

来被标记为change 的block,RMAN 不会对该文件进行备份。。从10g开始提供此功能。

trace 记录保留

Oracle 会自动管理change tracking file的大小,只保留最近最近8次blockchange 的信息。 超过8次, 那么最前面的block bitmap 信息会被current change 覆盖。要考虑change tracking file

的8次限制与备份策略的关系。 如果我们在0级备份之后又进行了7次不同的增量备份,那么这时block change tracking 就包含了8个bitmaps信息。 如果我们在进行1级的增量备份,那么此时的增量

就不是最优的, 还会扫描整个data file。 因为我们之前0级的bitmap信息被我们当前的bitmap 信息覆盖掉了,这样就没有了参考的依据。所以,两次全量备份的时间间隔要控制在8天以内(包含)。

trace 文件存放

oracle 不建议使用RAWdevice来存放block tracking. 如果是RAC一定要放到共享存储上。

trace 文件重置

  • change tracking file 变为无效。
  • RMAN 进行恢复时。

    文件大小

  • 与数据库中的数据文件总大小相关,与数据量无关。每次递增10M,初始化文件时,300G 数据文件会配置10M ,600G 数据文件会配置20m .1T 及以上数据文件以32M 为标准。

  • 每个datafile,在tracking file里最少需要分配320k的空间,所以如果有大量的小data file, change tracking file 也会相对较大。

打开和关闭块跟踪

  1. RAC:
  2. #查看是否开启了块跟踪
  3. select * from v$block_change_tracking;
  4. #打开块跟踪
  5. alter database enable block change tracking using file '+DATA';
  6. #关闭块跟踪
  7. alter database disable block change tracking;
  8. RAC:
  9. #打开块跟踪
  10. alter database enable block change tracking using file '/backup/block.trc';
  11. #关闭块跟踪
  12. alter database disable block change tracking;

【如果提高RMAN备份速度】

  1. 1. 开启多通道
  2. 通道数据与cpu核数有关系
  3. 2. 设置块跟踪
  4. 用于提升增量备份的速度(因为备份时只检查修改过的块)
  5. 3. 设置压缩级别为medium
  6. 综合看,medium的备份和恢复速度比较好。
  7. CONFIGURE BACKUP OPTIMIZATION ON;
  8. CONFIGURE COMPRESSION ALGORITHM 'MEDIUM' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;

此处评论已关闭