Oracle - RMAN Backup Stratage with FRA and Tape
Now, we are planning to move our backup to AWS. The old backup strategy is not good for this situation.
Because we cannot just change DISK to SBT_TAPE, we also want to have a copy of backup on disk.
I decide:
- Use FRA to store backup locally for the recovery windows period.
- Backup FRA to AWS everyday after daily backup.
- For monthly / weekly backup, backup to AWS directly.
- Backup archivelog to AWS directly.
- Use FRA to obsolete local backup and archivelog.
- Using recovery window for obsolete of backup on disk.
- The recovery window is set to 7 days for Disk, and using 35 days in the script for Tape.
RMAN configuration:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; CONFIGURE BACKUP OPTIMIZATION ON; CONFIGURE DEFAULT DEVICE TYPE TO DISK; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO 'SBT_TAPE';
Never configure any default channel attribute for sbt_type, except for archivelog deletion policy.
It helps you to keep from mistake of delete all.
###########################################################
# backup_keep_to_tape.rman
###########################################################
# 1 DATE
# 2 MONTHLY/WEEKLY
# 3 KEEP PERIOD
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
backup
incremental level 0
as compressed backupset
filesperset=10
tag='&1_LEV0_&2'
database
keep until time 'sysdate+&3';
release channel ch01;
}
###########################################################
# backup_database_to_disk.rman
###########################################################
# 1 DATE
# 2 LEVEL 0/1/2
# 3 "CUMULATIVE"/""
run{
allocate channel ch01 device type disk;
backup
incremental level &2 &3
as compressed backupset
filesperset=10
tag='&1_LEV&2_DAILY'
database
include current controlfile;
release channel ch01;
}
###########################################################
# backup_fra_to_tape.rman
###########################################################
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
backup
filesperset=10
recovery area;
release channel ch01;
}
###########################################################
# backup_archive_to_tape.rman
###########################################################
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
backup
as compressed backupset
filesperset=10
archivelog all not backed up 1 times;
release channel ch01;
}
###########################################################
# backup_daily.rman
###########################################################
# 1 DATE
# 2 LEVEL 0/1/2
# 3 "CUMULATIVE"/""
@backup_archive_to_tape.rman
@backup_database_to_disk.rman &1 &2 "&3"
@backup_fra_to_tape.rman
@backup_archive_to_tape.rman
###########################################################
# backup_release_fra.rman
###########################################################
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
backup
filesperset=10
recovery area
delete input
;
release channel ch01;
}
###########################################################
# obsolete_fra.rman
###########################################################
run{
allocate channel ch01 device type DISK;
crosscheck backup DEVICE TYPE DISK;
crosscheck copy DEVICE TYPE DISK;
delete noprompt obsolete DEVICE TYPE DISK;
release channel ch01;
}
###########################################################
# obsolete_tape.rman
###########################################################
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
crosscheck backup DEVICE TYPE SBT_TAPE;
crosscheck copy DEVICE TYPE SBT_TAPE;
delete noprompt obsolete recovery window of 60 days DEVICE TYPE SBT_TAPE;
release channel ch01;
}
Due to RMAN backups to AWS as to a tape library by using OSB, and I am using OSB + mhvtl to verify my strategy.
Install mhvtl
# yum install mt-st mtx lsscsi sg3_utils lzo-minilzo # wget http://mirror.centos.org/centos/7/os/x86_64/Packages/lzo-devel-2.06-8.el7.x86_64.rpm # rpm -ivh lzo-devel-2.06-8.el7.x86_64.rpm # wget https://sites.google.com/site/linuxvtl2/mhvtl-2016-03-10.tgz?attredirects=0 --no-check-certificate # tar xvf mhvtl-2016-03-10.tgz # groupadd vtl # useradd -g vtl vtl # cd mhvtl-1.5 # make distclean # cd kernel # make # make install # cd .. # make # make install # chown -R vtl:vtl /opt/mhvtl/ # /etc/init.d/mhvtl start ## 2 libraries, 4 tape drive for each. # lsscsi -g [0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda /dev/sg0 [2:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0 /dev/sg1 [3:0:0:0] mediumx STK L700 0105 /dev/sch0 /dev/sg5 [3:0:1:0] tape IBM ULT3580-TD5 0105 /dev/st0 /dev/sg2 [3:0:2:0] tape IBM ULT3580-TD5 0105 /dev/st1 /dev/sg3 [3:0:3:0] tape IBM ULT3580-TD4 0105 /dev/st2 /dev/sg4 [3:0:4:0] tape IBM ULT3580-TD4 0105 /dev/st3 /dev/sg6 [3:0:8:0] mediumx STK L80 0105 /dev/sch1 /dev/sg11 [3:0:9:0] tape STK T10000B 0105 /dev/st4 /dev/sg7 [3:0:10:0] tape STK T10000B 0105 /dev/st5 /dev/sg8 [3:0:11:0] tape STK T10000B 0105 /dev/st6 /dev/sg9 [3:0:12:0] tape STK T10000B 0105 /dev/st7 /dev/sg10 ## mhvtl processes, 8 for tape drives and 2 for libraries. # ps -ef|grep vtl vtl 10813 1 0 22:59 ? 00:00:00 vtltape -q 11 -v vtl 10816 1 0 22:59 ? 00:00:00 vtltape -q 12 -v vtl 10832 1 0 22:59 ? 00:00:00 vtltape -q 13 -v vtl 10837 1 0 22:59 ? 00:00:00 vtltape -q 14 -v vtl 10840 1 0 22:59 ? 00:00:00 vtltape -q 31 -v vtl 10847 1 0 22:59 ? 00:00:00 vtltape -q 32 -v vtl 10850 1 0 22:59 ? 00:00:00 vtltape -q 33 -v vtl 10858 1 0 22:59 ? 00:00:00 vtltape -q 34 -v vtl 10863 1 0 22:59 ? 00:00:00 vtllibrary -q 10 -v vtl 10867 1 0 22:59 ? 00:00:00 vtllibrary -q 30 -v root 10965 8701 0 23:00 pts/4 00:00:00 grep --color=auto vtl
Configuration Files: /etc/mhvtl
Device Files: /opt/mhvtl
The size of tapes is 500MB in default. In order to change to, modify CAPACITY in /etc/mhvtl/mhvtl.conf, and then, delete all folder in /etc/mhvtl, restart mhvtl.
# pwd /opt/mhvtl # dump_tape -f G03037TA Media density code: 0x4a Media type code : 0x26 Media description : STK T10KA media Tape Capacity : 4294967296 (4096 MBytes) Media type : Normal data Media : read-write Remaining Tape Capacity : 4294967296 (4096 MBytes) Total num of filemarks: 0 Segmentation fault (core dumped)
Install Oracle Secure Backup
# mkdir -p /usr/local/oracle/backup
# cd /usr/local/oracle/backup
# /tmp/osb_12.2.0.1.0_linux.x64_release/setup
# obtool
Oracle Secure Backup 12.2.0.1.0
login: admin
Password: 12345678
# define the server also as mediaserver
ob> lshost
testenv admin,client (via OB) in service
ob> chhost --addrole mediaserver testenv
ob> lshost
testenv admin,mediaserver,client (via OB) in service
# create a user named oracle, which is the oracle user name, and allow rman and cmdline to login.
ob> lsuser
admin admin
ob> mkuser -p 12345678 -c oracle -U oracle -G dba -N no -e westzq@gmail.com -h *:*:*+rman+cmdline oracle
ob> lsuser
admin admin
oracle oracle
# create a media group
ob> mkmf -u -C -a rman-testenv
ob> lsmf -l rman-testenv
rman-testenv:
Keep volume set: content manages reuse
Appendable: yes
Volume ID used: unique to this media family
UUID: cc2f973a-23af-1037-ae7d-000c293757c5
# define library and driver
# lsscsi -g
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0 /dev/sg1
[2:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda /dev/sg0
[3:0:0:0] mediumx STK L700 0105 /dev/sch0 /dev/sg10
[3:0:1:0] tape IBM ULT3580-TD5 0105 /dev/st0 /dev/sg2
[3:0:2:0] tape IBM ULT3580-TD5 0105 /dev/st2 /dev/sg4
[3:0:3:0] tape IBM ULT3580-TD4 0105 /dev/st1 /dev/sg3
[3:0:4:0] tape IBM ULT3580-TD4 0105 /dev/st4 /dev/sg6
[3:0:8:0] mediumx STK L80 0105 /dev/sch1 /dev/sg11
[3:0:9:0] tape STK T10000B 0105 /dev/st3 /dev/sg5
[3:0:10:0] tape STK T10000B 0105 /dev/st5 /dev/sg7
[3:0:11:0] tape STK T10000B 0105 /dev/st6 /dev/sg8
[3:0:12:0] tape STK T10000B 0105 /dev/st7 /dev/sg9
ob> mkdev -t library -o -a testenv:/dev/sg10 lib01
ob> mkdev -t library -o -a testenv:/dev/sg11 lib02
ob> mkdev -t tape -o -a testenv:/dev/sg2 -l lib01 -d 1 tape01
ob> mkdev -t tape -o -a testenv:/dev/sg3 -l lib01 -d 2 tape02
ob> mkdev -t tape -o -a testenv:/dev/sg4 -l lib01 -d 3 tape03
ob> mkdev -t tape -o -a testenv:/dev/sg5 -l lib01 -d 4 tape04
ob> mkdev -t tape -o -a testenv:/dev/sg6 -l lib02 -d 1 tape05
ob> mkdev -t tape -o -a testenv:/dev/sg7 -l lib02 -d 2 tape06
ob> mkdev -t tape -o -a testenv:/dev/sg8 -l lib02 -d 3 tape07
ob> mkdev -t tape -o -a testenv:/dev/sg9 -l lib02 -d 4 tape08
# the device name may be changed, refer this article to change.
Oracle Secure Backup 12.1.0.1.0 - All Backup jobs to tape failing with Error message: Pending resource availability (Doc ID 2144552.1)
# after definition
ob> lsdev
library lib01 in service
drive 1 tape01 in service
drive 2 tape02 in service
drive 3 tape03 in service
drive 4 tape04 in service
library lib02 in service
drive 1 tape05 in service
drive 2 tape06 in service
drive 3 tape07 in service
drive 4 tape08 in service
ob> inventory -L lib01
ob> inventory -L lib02
# For testing
run{
allocate channel ch01 device type sbt parms 'ENV=(ob_media_family=rman-testenv)';
backup spfile;
}
# after backup, we can see our backup jobs and pieces
ob> lsvol -a
VOID OOID Seq Volume ID Barcode Family Created Attributes
173 173 1 rman-testenv-000001 G03001TA rman-testenv 03/07.23:13 never closes; content manages reuse
175 175 1 rman-testenv-000002 G03002TA rman-testenv 03/07.23:14 never closes; content manages reuse
ob> lspiece
POID Database Content Copy Created Host Piece name
100 o12201 full 0 03/07.23:13 testenv g8trsfk9_1_1
101 o12201 full 0 03/07.23:13 testenv c-766629926-20190307-00
102 o12201 full 0 03/07.23:14 testenv gbtrsfm9_1_1
103 o12201 full 0 03/07.23:14 testenv gatrsfm9_1_1
104 o12201 full 0 03/07.23:14 testenv gdtrsfnd_1_1
105 o12201 full 0 03/07.23:14 testenv gctrsfnd_1_1
106 o12201 full 0 03/07.23:15 testenv getrsfo6_1_1
107 o12201 full 0 03/07.23:15 testenv gftrsfo6_1_1
108 o12201 full 0 03/07.23:15 testenv c-766629926-20190307-01
After configuration, we can do testing now
RO="su - oracle -c "
RMAN="cd /home/oracle/rman; export ORACLE_SID=o12201; export ORAENV_ASK=NO; . oraenv; rman target / "
timedatectl set-ntp no
for YEAR in {2018..2018}
do
for MONTH in {1..7}
do
for DAY in {1..28}
do
for HOUR in {0,12}
do
echo $$
n=$(($DAY%7))
# echo $YEAR" "$MONTH" "$DAY" "$HOUR" "$n;
timedatectl set-time "$YEAR-$MONTH-$DAY $HOUR:00:00";
if [[ $n -eq 1 && $DAY -le 7 && HOUR -eq 0 ]]; then
echo "lev0 monthly backup"
$RO "$RMAN <<EOF
@backup_keep_to_tape.rman `date +%Y%m%d%H` \"MONTHLY\" 180
EOF
"
elif [[ $n -eq 1 && $DAY -ge 8 && HOUR -eq 0 ]]; then
echo "lev0 weekly backup"
$RO "$RMAN <<EOF
@backup_keep_to_tape.rman `date +%Y%m%d%H` \"WEEKLY\" 90
EOF
"
elif [[ $n -eq 2 && HOUR -eq 0 ]]; then
echo "lev0 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 0 \"\"
EOF
"
elif [[ $n -eq 3 && HOUR -eq 0 ]]; then
echo "lev2 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 2 \"\"
EOF
"
elif [[ $n -eq 4 && HOUR -eq 0 ]]; then
echo "lev1 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 1 \"\"
EOF
"
elif [[ $n -eq 5 && HOUR -eq 0 ]]; then
echo "lev1 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 1 \"CUMULATIVE\"
EOF
"
elif [[ $n -eq 6 && HOUR -eq 0 ]]; then
echo "lev2 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 2 \"\"
EOF
"
elif [[ $n -eq 7 && HOUR -eq 0 ]]; then
echo "lev1 daily backup"
$RO "$RMAN <<EOF
@backup_daily.rman `date +%Y%m%d%H` 1 \"\"
EOF
"
else
echo "archive log backup"
$RO "$RMAN <<EOF
@backup_archive_to_tape.rman
EOF
"
fi
done
done
done
done
With this configuration,
When you try to delete all obsolete with default recovery window:
RMAN> delete obsolete; RMAN retention policy will be applied to the command RMAN retention policy is set to recovery window of 7 days using channel ORA_DISK_1 Deleting the following obsolete backups and copies: Type Key Completion Time Filename/Handle -------------------- ------ ------------------ -------------------- Backup Set 4073 09-MAY-18 Backup Piece 4419 09-MAY-18 5it2dqhb_1_2 Backup Set 4074 09-MAY-18 Backup Piece 4420 09-MAY-18 5jt2dqk1_1_2 Backup Set 4078 09-MAY-18 Backup Piece 4424 09-MAY-18 5nt2dqp7_1_1 Backup Set 4080 09-MAY-18 Backup Piece 4426 09-MAY-18 5pt2f4m4_1_1 ... Archive Log 1582 01-JUN-18 /u01/app/oracle/fast_recovery_area/o12201/O12201/archivelog/2018_06_01/o1_mf_1_1583_fk1kf66j_.arc Archive Log 1583 01-JUN-18 /u01/app/oracle/fast_recovery_area/o12201/O12201/archivelog/2018_06_01/o1_mf_1_1584_fk2vd3n1_.arc Backup Set 4269 01-JUN-18 Backup Piece 4671 01-JUN-18 bnt4bpa4_1_1 Archive Log 1584 02-JUN-18 /u01/app/oracle/fast_recovery_area/o12201/O12201/archivelog/2018_06_02/o1_mf_1_1585_fk45l43g_.arc Backup Set 4271 02-JUN-18 Backup Piece 4673 02-JUN-18 bpt4d3g4_1_1 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of delete command at 06/09/2018 00:02:38 RMAN-06091: no channel allocated for maintenance (of an appropriate type)
There is no way to delete the backup pieces on tape because of mistake.
When you try to delete backup:
RMAN> delete backup; using channel ORA_DISK_1 List of Backup Pieces BP Key BS Key Pc# Cp# Status Device Type Piece Name ------- ------- --- --- ----------- ----------- ---------- 3694 3517 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_06/o1_mf_s_970012848_f9w8409t_.bkp 3721 3540 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_09/o1_mf_s_970272137_fb45bspw_.bkp 3736 3551 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_10/o1_mf_s_970358449_fb6sn1d8_.bkp 3751 3562 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_11/o1_mf_s_970444849_fb9g01h0_.bkp 3766 3573 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_12/o1_mf_s_970531247_fbcyvj2w_.bkp 3781 3584 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_13/o1_mf_s_970617648_fbgm7jv1_.bkp 3808 3607 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_16/o1_mf_s_970876935_fbpjg7l2_.bkp 3823 3618 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_03_17/o1_mf_s_970963242_fbs4qbt3_.bkp 4722 4308 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/backupset/2018_06_05/o1_mf_ncnn1_2018060500_LEV1_DAIL_fkd2qn0c_.bkp 4723 4309 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_06_05/o1_mf_s_977961655_fkd2qqk1_.bkp 4735 4317 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/backupset/2018_06_06/o1_mf_nnnd2_2018060600_LEV2_DAIL_fkgq3cxf_.bkp 4736 4318 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/7E60BE07B7D65699E053651010537F9B/backupset/2018_06_06/o1_mf_nnnd2_2018060600_LEV2_DAIL_fkgq3h4b_.bkp 4737 4319 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/backupset/2018_06_06/o1_mf_ncnn2_2018060600_LEV2_DAIL_fkgq3kcl_.bkp 4738 4320 1 1 AVAILABLE DISK /u01/app/oracle/fast_recovery_area/o12201/O12201/autobackup/2018_06_06/o1_mf_s_978048050_fkgq3lx3_.bkp Do you really want to delete the above objects (enter YES or NO)?
Only backup pieces on disk will be deleted. The backup pieces on tape are safe.
We don’t backup archive logs to disk, so even the all backup pieces on disk are deleted accidently, we never lose any archive log.
But “delete copy” accidently is unrecoverable. We need to archive redo logs to a remote node through TNS against this problem.
Without allocate channel explicitly, the recover will only conside the backupset on the disk.
This is what I want. If we want to also conside the backup on the tape, also allocate a channel to tape
run{
allocate channel ch01 device type SBT_TAPE parms 'ENV=(ob_media_family=rman-testenv)';
allocate channel ch02 device type disk;
restore database preview;
}
And there is a disvantage of using FRA with Tape together for READ ONLY tablespace or pluggable database.
Due to FRA will consider all the backupsets which have been copied to tape as removable, so, when there is no more space, some of backup pieces will be removed. Including the backup pieces of READ ONLY
When OPTIMITZATION set to ON, and read only tablespaces will never be backed up again, however, it is DEVICE TYPE specified.
If the backup pieces on FRA are deleted, RMAN will backup READ ONLY on next backup, and then, copy to TAPE
And the backup pieces of READ ONLY will never be obsoleted with recovery window retention policy.
So, we may have many copied of READ ONLY tablespaces.
In order to express, I removed the entries of WEEKLY and MONTHLY backup.
RMAN> list backup of pluggable database 'PDB$SEED' summary; List of Backups =============== Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag ------- -- -- - ----------- --------------- ------- ------- ---------- --- 2935 B 0 A SBT_TAPE 02-JAN-18 1 1 YES 2018010200_LEV0_DAILY 3740 B 0 A SBT_TAPE 02-APR-18 1 1 YES 2018040200_LEV0_DAILY 4472 B 0 A SBT_TAPE 23-JUN-18 1 1 YES 2018062300_LEV0_DAILY
I have three backups of PDB$SEED after obsolete.
The solution for this is that change pluggable database/tablespace to read write periodically.
After move to read write and then back to read only, them need to be backed up and again, and the old backup don’t need to restore database after out of recovery window.
For PDB$SEED, if we apply CPU/PSU patchset regularly, it will bring database out of read only mode internally.