Creates a backup directory if required, works out the ASM SID, renames the previous entry, then loops round backing up the metadata data for each diskgroup. It also lists each file backed up which is quite helpful.
Finally it creates error checking and a log and error file outputs
[grid@rac1 ~]$ cat asm_metadata_bk.sh
#!/bin/sh
#
# Date Version Author Comments
# 09/06/09 1.1 Initial Version by James Hardaker
# 10/06/09 1.2 Added Error Handling by John Hallas
# 04/22/13 1.3 Modify md_backup options by Anbob Weejar
#
#
# Description
# Queries ASM for a list of disk groups and backs up the metadata of each to /app/oracle/backups
# Should be run as the ASM owner user, eg. grid
# Tunables
###
BACKUPDIR=/u01/app/backup
###
##########
# Start of functions
#
# asm_metadata - backup the asm metadata
asm_metadata()
{
export ORACLE_SID=`cat /etc/oratab | grep ^+ASM | awk 'BEGIN{FS=":"} {print $1} ' `
export ORACLE_HOME=`cat /etc/oratab | grep ^+ASM | awk 'BEGIN{FS=":"} {print $2} ' `
for DG in `asmcmd ls + | sed 's/\///'`
do
echo "INFO: Backup of '$DG' diskgroup started at `date`"
if [ -f ${BACKUPDIR}/asm_metadata_$DG.bkp ]
then
echo "INFO: Moving the file ${BACKUPDIR}/asm_metadata_$DG.bkp to ${BACKUPDIR}/asm_metadata_$DG.old"
cp ${BACKUPDIR}/asm_metadata_$DG.bkp ${BACKUPDIR}/asm_metadata_$DG.old 2>/dev/null
if [ $? -ne 0 ]
then
echo "WARN: Unable to backup ${BACKUPDIR}/asm_metadata_$DG.bkp, will overwrite it anyway"
fi
rm -f ${BACKUPDIR}/asm_metadata_$DG.bkp 2>/dev/null
fi
echo "INFO: Backing up the $DG diskgroup to ${BACKUPDIR}/asm_metadata_$DG.bkp"
rm ${BACKUPDIR}/asm_metadata_$DG.err 2>/dev/null
${ORACLE_HOME}/bin/asmcmd md_backup ${BACKUPDIR}/asm_metadata_$DG.bkp -G $DG 2>${BACKUPDIR}/asm_metadata_$DG.err
if [ -s ${BACKUPDIR}/asm_metadata_$DG.err ]
then
echo ""
echo "WARN: Unable to backup the $DG diskgroup to ${BACKUPDIR}/asm_metadata_$DG.bkp"
cat ${BACKUPDIR}/asm_metadata_$DG.err
echo ""
ERR=98
else
echo "INFO: Backup of $DG diskgroup completed at `date`"
fi
echo ""
done
}
##########
# End of functions
### Main Program
echo "INFO: ASM Metadata backup started at `date`"
echo ""
echo "INFO: This script is being run as user `/usr/bin/id -un`"
echo ""
# create the backup directory if it does not exist
#
if [ ! -d ${BACKUPDIR} ]
then
mkdir ${BACKUPDIR} 2>/dev/null
echo "INFO: Created the directory ${BACKUPDIR} as it did not exist"
echo ""
if [ $? -ne 0 ]
then
echo "ERROR: Unable to create the directory ${BACKUPDIR}"
exit 99
fi
fi
# backup the asm metadata
#
ERR=0
asm_metadata
#Finish
#
if [ ${ERR} != 0 ]
then
echo "ERROR: An error occurred backing up one or more disk groups, see above"
exit 98
else
echo "INFO: ASM Metadata backup completed at `date`"
fi
exit
It’s worked in oracle 11r2 on linux
take an example:
sys@ANBOB>select group_number,state,substr(library,1,28) lib,path,failgroup from v$asm_disk;
GROUP_NUMBER STATE LIB PATH FAILGROUP
------------ -------- ---------------------------- ------------------------------ ------------------------------
1 NORMAL ASM Library - Generic Linux, ORCL:DATA1 DATA1
1 NORMAL ASM Library - Generic Linux, ORCL:DATA2 DATA2
1 NORMAL ASM Library - Generic Linux, ORCL:DATA3 DATA3
sys@ANBOB>select GROUP_NUMBER,name,type,state,total_MB from v$asm_diskgroup;
GROUP_NUMBER NAME TYPE STATE TOTAL_MB
------------ ------------------------------ ------ ----------- ----------
1 DATA NORMAL CONNECTED 9201
[grid@rac1 ~]$ ./asm_metadata_bk.sh
INFO: ASM Metadata backup started at Mon Apr 22 02:11:54 PDT 2013
INFO: This script is being run as user grid
INFO: Backup of 'DATA' diskgroup started at Mon Apr 22 02:11:55 PDT 2013
INFO: Backing up the DATA diskgroup to /u01/app/backup/asm_metadata_DATA.bkp
Disk group metadata to be backed up: DATA
Current alias directory path: ANBOB/ARCHIVELOG/2012_09_11
Current alias directory path: ANBOB/TEMPFILE
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_20
Current alias directory path: ASM/ARCHIVELOG
Current alias directory path: ANBOB/BACKUPSET/2012_09_11
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_21
Current alias directory path: ASM
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_19
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_16
Current alias directory path: ANBOB/ONLINELOG
Current alias directory path: ANBOB
Current alias directory path: ANBOB/ARCHIVELOG
Current alias directory path: ANBOB/ARCHIVELOG/2012_09_13
Current alias directory path: ASM/ASMPARAMETERFILE
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_17
Current alias directory path: ANBOB/ARCHIVELOG/2013_04_18
Current alias directory path: ANBOB/PARAMETERFILE
Current alias directory path: ANBOB/DATAFILE
Current alias directory path: ANBOB/BACKUPSET
Current alias directory path: ANBOB/ARCHIVELOG/2012_09_10
Current alias directory path: ANBOB/CONTROLFILE
INFO: Backup of DATA diskgroup completed at Mon Apr 22 02:11:57 PDT 2013
INFO: ASM Metadata backup completed at Mon Apr 22 02:11:57 PDT 2013
[grid@rac1 ~]$ ll /u01/app/backup/
total 36
-rw-r--r-- 1 grid oinstall 26545 Apr 22 02:11 asm_metadata_DATA.bkp
-rw-r--r-- 1 grid oinstall 0 Apr 22 02:11 asm_metadata_DATA.err
[grid@rac1 backup]$ vi asm_metadata_DATA.bkp
@diskgroup_set = (
{
‘ATTRINFO’ => {
‘TEMPLATE.PARAMETERFILE.MIRROR_REGION’ => ‘0’,
‘TEMPLATE.TEMPFILE.REDUNDANCY’ => ’18’,
‘TEMPLATE.OCRBACKUP.REDUNDANCY’ => ’18’,
‘TEMPLATE.TEMPFILE.MIRROR_REGION’ => ‘0’,
‘TEMPLATE.PARAMETERFILE.REDUNDANCY’ => ’18’,
‘SECTOR_SIZE’ => ‘512’,
‘TEMPLATE.DATAGUARDCONFIG.REDUNDANCY’ => ’18’,
‘ACCESS_CONTROL.UMASK’ => ‘066’,
‘TEMPLATE.ASM_STALE.STRIPE’ => ‘0’,
‘TEMPLATE.ARCHIVELOG.STRIPE’ => ‘0’,
‘TEMPLATE.DATAGUARDCONFIG.PRIMARY_REGION’ => ‘0’,
‘TEMPLATE.OCRBACKUP.STRIPE’ => ‘0’,
‘TEMPLATE.DATAFILE.STRIPE’ => ‘0’,
‘AU_SIZE’ => ‘1048576’,
‘TEMPLATE.ASMPARAMETERFILE.STRIPE’ => ‘0’,
‘TEMPLATE.CHANGETRACKING.PRIMARY_REGION’ => ‘0’,
‘TEMPLATE.CONTROLFILE.REDUNDANCY’ => ’19’,
‘TEMPLATE.FLASHFILE.STRIPE’ => ‘0’,
‘TEMPLATE.BACKUPSET.PRIMARY_REGION’ => ‘0’,
‘TEMPLATE.ARCHIVELOG.PRIMARY_REGION’ => ‘0’,
‘TEMPLATE.CHANGETRACKING.STRIPE’ => ‘0’,
‘TEMPLATE.ONLINELOG.PRIMARY_REGION’ => ‘0’,
‘TEMPLATE.CHANGETRACKING.REDUNDANCY’ => ’18’,
‘TEMPLATE.BACKUPSET.STRIPE’ => ‘0’,
‘TEMPLATE.OCRFILE.MIRROR_REGION’ => ‘0’,
‘DISK_REPAIR_TIME’ => ‘3.6h’,
‘TEMPLATE.FLASHBACK.MIRROR_REGION’ => ‘0’,
….
md_restore -S option can only generate restore script does not perform recovery actions :
ASMCMD> md_restore -S create_oradg.sql asm_metadata_DATA.bkp Current Diskgroup metadata being restored: DATA ASMCMD> exit [grid@rac1 backup]$ ll total 84 -rw-r--r-- 1 grid oinstall 26545 Apr 22 02:13 asm_metadata_DATA.bkp -rw-r--r-- 1 grid oinstall 0 Apr 22 02:13 asm_metadata_DATA.err -rw-r--r-- 1 grid oinstall 26545 Apr 22 02:13 asm_metadata_DATA.old -rw-r--r-- 1 grid oinstall 11105 Apr 22 02:18 create_oradg.sql [grid@rac1 backup]$ vi create_oradg.sql create diskgroup DATA NORMAL redundancy failgroup DATA3 disk 'ORCL:DATA3' name DATA3 size 3067M failgroup DATA2 disk 'ORCL:DATA2' name DATA2 size 3067M fail group DATA1 disk 'ORCL:DATA1' name DATA1 size 3067M attribute 'compatible.asm' = '11.2.0.0.0' , 'compatible.rdbms' = '10.1.0.0.0' , 'au_size' = '1048576', ' sector_size' = '512', 'cell.smart_scan_capable' = 'FALSE'; alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'TEMPLATE.OCRBACKUP.REDUNDANCY' = '18'; alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'TEMPLATE.TEMPFILE.REDUNDANCY' = '18'; alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'TEMPLATE.PARAMETERFILE.MIRROR_REGION' = '0'; alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'TEMPLATE.TEMPFILE.MIRROR_REGION' = '0'; alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'TEMPLATE.PARAMETERFILE.REDUNDANCY' = '18'; ...