0

i have a rman bash script which works when i execute it (./backup.sh). but when i use cronjob, it doesn't work. My scripts is as follows

backup.sh

rman target / @backup.rcv log=rman.log

backup.rcv

backup format '/backup/rman/backup/%U.arch.rman' filesperset 2 archivelog all delete input; backup format '/backup/rman/backup/%U.datafiles.rman' filesperset 2 incremental level 0 database; backup format '/backup/rman/backup/%U.arch.rman' filesperset 2 archivelog all delete input; backup format '/backup/rman/backup/%U.ctl.rman' current controlfile; delete noprompt obsolete;

my cronjob looks somthing like this

crontab -l

5 0 * * * /nas_backup/rman/svbo/backup/L0backup.sh >/dev/null 2>&1

i am very new to this rman and bash script so any help would be appreciated

nagixoj508
  • 25
  • 6
  • You might need to set Oracle environment in your script, such as ORACLE_HOME, ORACLE_SID, PATH, LD_LIBRARY_PATH. Or if you have oraenv setup - just execute oraenv in your script. – Pankaj Apr 04 '22 at 20:21
  • The environment in crontab is different from the env you have in your bash. In your crontab, replace `>/dev/null 2>&1` by `>/tmp/out.log 2>/tmp/err.log`. This will show you the error when it runs. Like @Pankaj said, its most probably some env variable missing, or the path for rman. – Nic3500 Apr 05 '22 at 01:08

2 Answers2

0

Step 01. Create a backup script with the following content (modified it as your desire)

#!/bin/sh 
#
# Run as: oracle
#
export ORACLE_SID=orcl
export ORACLE_HOME=/oradb/oraclebase/dbhome

rman target /  << EOI
  # Allocating channels (should equal number of physical CPU #lscpu)
  ALLOCATE CHANNEL CH1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL CH2 DEVICE TYPE DISK;

  # change into the highest rate compression - required license 
  CONFIGURE COMPRESSION ALGORITHM 'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE;

  # validate physical existence of backupset & copy
  CROSSCHECK BACKUPSET;
  CROSSCHECK COPY;
  
  # removing metadata of "EXPIRED" info from the catalog
  DELETE NOPROMPT EXPIRED BACKUPSET;
  DELETE NOPROMPT EXPIRED COPY;

  # Backup full database (incremental level 0) on Sunday
  BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0 DATABASE FORMAT '/backup/%d_full_level_0_%U.bak';
  #incremental level 1 on the other days not Sunday
  #enabling block change tracking if you want level 1 goes fast
  #BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 1 DATABASE FORMAT '/backup/%d_full_level_1_%U.bak';

  # Backup archivelog log
  BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL DELETE INPUT FORMAT '/backup/%_ARCHIVE_%U.bak';;

  # Clean obsolete backups depending on setting of retention policy 
  CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
  DELETE NOPROMPT OBSOLETE;

  # Allocated channel will release automatically ;)
  exit

EOI

exit

Step 02: Change owner & permission Step 03: Set crontab job for that script.

Duong
  • 465
  • 5
  • 13
0

inorder for this to be fixed replace the code in your "L0backup.sh" with

#!/bin/bash
#
export ORACLE_SID=your-sid
export ORACLE_HOME=your-oracle-home
$ORACLE_HOME/bin/rman target / nocatalog  <<EOF
backup format '/nas_backup/rman/backup/%U.arch.rman' filesperset 2 archivelog all delete input;
backup format '/nas_backup/rman/backup/%U.datafiles.rman' filesperset 2 incremental level 0 database;
backup format '/nas_backup/rman/backup/%U.arch.rman' filesperset 2 archivelog all delete input;
backup format '/nas_backup/rman/backup/%U.ctl.rman' current controlfile;
delete noprompt obsolete;
EOF

to get your ORACLE_SID and ORACLE_HOME you can echo it out like

#echo $ORACLE_SID
your-sid
# echo $ORACLE_HOME
your-oracle-home

next to set your crontab - lets say you want the above file to run every midnight (Crontab Guru)

#crontab -e

5 0 * * * /bin/bash /nas_backup/rman/backup/L0backup.sh  > /nas_backup/rman/backup/rman.log 2>&1

if you notice your output gets loged to "rman.log".

furthermore you can now delete your "backup.rcv" file as its no longer being used.

kunz
  • 1,063
  • 1
  • 11
  • 27