1. Introduction  

It is possible to schedule your own pre- or post-processing script as part of the Dbvisit Standby execution. A good example of doing this is if you want to execute your own custom code to perform certain tasks before or after Dbvisit Standby sends or apply logs; or it can be used to execute a script after you have opened the standby database read-only to start reporting extracts or any other custom code you would want to execute.
This is the new recommended way where one script is used for both pre- and post-processing. This script when executed by Dbvisit Standby, will be called with two parameters indicating if it should execute pre or post tasks and what the Dbvisit Standby process is that is being called.


In Dbvisit Standby version 8 a Dbvisit Standby Configuration (DDC) parameter is available called: DBV_PRE_POST_PROC


This parameter is set in the Primary database DDC file and should point to the script you want to execute before or after Dbvisit Standby processing.


Example Linux:

DBV_PRE_POST_PROC=/usr/local/bin/dbv_pre_post_processing.sh


Example Windows:

DBV_PRE_POST_PROC=c:\bin\dbv_pre_post_processing.cmd



Dbvisit Standby does come with a sample script to get you started.
This script is located in: DBVISIT_BASE/standby/doc

  • Linux sample script: example_pre_post_processing.sh
  • Windows sample script: example_pre_post_processing.cmd

The samples can be found at the end of this section.


These sample scripts will take two parameters which are passed by Dbvisit Standby to it:

  • Parameter 1 can be one of two possible values: [pre|post]
  • Parameter 2 can be one number from 1 to 6: [1|2|3|4|5|6]


Usage examples:

Usage: ./pre-post-dbvisit.sh [pre|post] [1|2|3|4|5|6]



Example call on Linux to perform pre- or post-process tasks when sending logs (see number explanation below)

# ./pre-post-dbvisit.sh pre 1
# ./pre-post-dbvisit.sh post 5




Example call on Windows to perform pre- or post-process tasks when sending logs (see number explanation below)

# ./pre-post-dbvisit.cmd pre 1
# ./pre-post-dbvisit.cmd post 1


Pre- and Post-processing script input parameters:
When the script is executed the first parameter that will be passed to it will be "pre" or "post" indicating if the script is executed before (pre) or after (post) Dbvisit Processing:


pre = Pre Dbvisit Processing step
post = Post Dbvisit Processing step


The second parameter that is passed is in number format. The possible values are 1 through to the number 6.

The number indicates which step Dbvisit Standby is performing:


1 = Dbvisit is executed on primary and will be sending logs to standby
2 = Dbvisit is executed on standby and will be applying logs
3 = Dbvisit Graceful Switchover is executed on primary
4 = Dbvisit Graceful Switchover is executed on standby
5 = Dbvisit Activation is executed on standby
6 = Standby Database is opened read-only



2.  Linux - Sample Script


This section will provide you with an example script that can be located in DBVISIT_BASE/standby/doc folder.

Important - these are not complete scripts as they do not execute any specific tasks, you will need to modify them to your requirements.


#!/bin/bash
#
# Description:
# ===========
# This script is provided by Dbvisit Software Limited as an example
# pre/post processing script. This script can be used to perform 
# custom tasks (pre) before Dbvisit Standby execute, or (post) following
# a successful execution.
#
# NOTE: This script is a basic template and you will need to add custom code
# to this script to perform the required tasks you want to perform as 
# part of pre or post dbvisit processing. 
#
# This script should be added to the Dbvisit Database Configuration (DDC) file
# Example: PRE_POST_PROCESSING=/usr/local/bin/pre-post-dbvisit.sh
#
# Dbvisit STandby will pass two parameters to this script
# Parameter 1 can be one of two possible values: [pre|post]
# Parameter 2 can be one number from 1 to 6: [1|2|3|4|5|6]
# 
# Usage: ./pre-post-dbvisit.sh [pre|post] [1|2|3|4|5|6]
#
# Example: ./pre-post-dbvisit.sh pre 1
#
# Parameter explanation:
# =====================
# pre = Pre Dbvisit Processing step
# post = Post Dbvisit Processing step
# 1 = Dbvisit is executed on primary and will be sending logs to standby
# 2 = Dbvisit is executed on standby and will be applying logs
# 3 = Dbvisit Graceful Switchover is executed on primary 
# 4 = Dbvisit Graceful Switchover is executed on standby
# 5 = Dbvisit Activation is executed on standby
# 6 = Standby Database is opened read-only 
#
# 
# Note: This script is an example only and should be tested first before 
# it is used in a production environment.
#
# To enable debugging, uncomment following line:
# set -x
#
###########################################
# Function to echo usage
###########################################
usage ()
{
program=`basename $0`
cat <<EOF
Usage:
${program} [pre|post] [1|2|3|4|5|6]
[pre|post} - Specify if Pre or Post processing is being performed
[1|2|3|4|5|6] - Indicate Dbvisit operation being performed
-h - display the usage

pre = Pre Dbvisit Processing step
post = Post Dbvisit Processing step
1 = Dbvisit is executed on primary and will be sending logs to standby
2 = Dbvisit is executed on standby and will be applying logs
3 = Dbvisit Graceful Switchover is executed on primary 
4 = Dbvisit Graceful Switchover is executed on standby
5 = Dbvisit Activation is executed on standby
6 = Standby Database is opened read-only 
Example, to perform a task on the standby server following activation:
${program} post 5
EOF
exit 1
}
###########################################
# Function to setup parameter variables
# Description:
# Specify any global settings in this section
###########################################
setup_parameters ()
{
## Below are some example values
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
export NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS'
SERVER=`uname -n`
dbvisit_base=/usr/dbvisit
logfile=${dbvisit_base}/standby/log/pre-post-dbvisit.log
}
###########################################
# Function to change database environments
# Description:
# Use oraenv to set the environment if needed
# This is optional to set the environment
###########################################
set_env ()
{
export ORAENV_ASK=NO
export ORACLE_SID=$1
. oraenv >> /dev/null
export ORAENV_ASK=YES
}
###########################################
# Function to Add text to logfile
###########################################
addLog()
{
# comment 1st line below to remove echo back to user and to only write to log
echo "`date +%d-%h-%Y:%H:%M:%S` : ${1}" 
echo "`date +%d-%h-%Y:%H:%M:%S` : ${1}" >> ${logfile}
}
### Add your custom functions here
###
##########################
##########################
####
#### MAIN PROGRAM SECTION
####
##########################
##########################
## First call function to set the environment or specific global variables
setup_parameters
## Test input values, must be 2 values, if not exit
if test $# -ne 2
then
echo "Cannot execute, 2 values must be specified as input..."
usage
exit 99
fi
if [ ${1} = "pre" ] || [ ${1} = "post" ] 
then
if ! [[ $2 =~ '^[1-6]+$' ]]
then 
echo "2nd Parameter must be a number between 1 and 6"
usage
exit 97
fi
else
echo "1st Parameter must be \"pre\" or \"post\"";
usage
exit 98
fi
### Now that values are valid, execute required code block
case ${1} in
pre) 
addLog "Start Pre Processing"
case ${2} in
1) 
addLog "Primary Database Send"
## add custom code here or call custom function
;;
2)
addLog "Standby Database Apply"
## add custom code here or call custom function
;;
3)
addLog "Primary Server Graceful Switchover"
## add custom code here or call custom function
;;
4)
addLog "Standby Server Graceful Switchover"
## add custom code here or call custom function
;;
5)
addLog "Standby Database Activate"
## add custom code here or call custom function
;;
6)
addLog "Standby Database Read-Only"
## add custom code here or call custom function
;;
esac 
;;
post)
addLog "Start post Processing"
case ${2} in
1)
addLog "Primary Database Send"
## add custom code here or call custom function
;;
2)
addLog "Standby Database Apply"
## add custom code here or call custom function
;;
3)
addLog "Primary Server Graceful Switchover"
## add custom code here or call custom function
;;
4)
addLog "Standby Server Graceful Switchover"
## add custom code here or call custom function
;;
5)
addLog "Standby Database Activate"
## add custom code here or call custom function
;;
6)
addLog "Standby Database Read-Only"
## add custom code here or call custom function
;;
esac
;;
esac



3.  Windows - Sample Script


This section will provide you with an example script that can be located in DBVISIT_BASE\standby\doc folder.

Important - these are not complete scripts as they do not execute any specific tasks, you will need to modify them to your requirements.


@echo off

REM  Description:
REM  ===========
REM  This script is provided by Dbvisit Software Limited as an example
REM  pre/post processing script for windows.  This script can be used to perform 
REM  custom tasks (pre) before Dbvisit Standby execute, or (post) following
REM  a successful execution.  
REM  
REM  This script is just a template and you will need to add custom code
REM  to this script to perform the required tasks you want to perform as 
REM  part of pre or post dbvisit processing. 
REM  Look for lines marked as follow to place custom code:
REM        REM --- add custom code here 
REM 
REM  This script should be added to the Dbvisit Database Configuration (DDC) file
REM  Example: PRE_POST_PROCESSING=c:\Program Files\dbvisit\standby\pre-post-dbvisit.cm
REM 
REM  Dbvisit STandby will pass two parameters to this script
REM   Parameter 1 can be one of two possible values:  [pre|post]
REM   Parameter 2 can be one number from 1 to 6:  [1|2|3|4|5|6]
REM  
REM  Usage:  pre-post-dbvisit.bat [pre|post] [1|2|3|4|5|6]
REM 
REM  Example: pre-post-dbvisit.bat pre 1
REM 
REM  Parameter explanation:
REM  =====================
REM   pre  = Pre Dbvisit Processing step
REM   post = Post Dbvisit Processing step
REM   1	= Dbvisit is executed on primary and will be sending logs to standby
REM   2	= Dbvisit is executed on standby and will be applying logs
REM   3	= Dbvisit Graceful Switchover is executed on primary 
REM   4	= Dbvisit Graceful Switchover is executed on standby
REM   5	= Dbvisit Activation is executed on standby
REM   6 = Standby Database is opened read-only 
REM 
REM  Note: This script is an example only and should be tested first before 
REM        it is used in a production environment.
REM

REM -- BEGIN Main Section

setlocal
pushd

REM First test both input values are not null
if "%~1"=="" (
   echo First input value cannot be empty ...
   echo:
   call :HELP
 ) & (goto :EOF)
if "%~2"=="" (
   echo Second input value cannot be empty ...
   echo:
   call :HELP
 ) & (goto :EOF)

REM Test if Usage/Help should be displayed
if /i {%1}=={/?} (call :HELP) & (goto :EOF)

REM Check if first parameter is either pre or post if not show help and exit
for %%x in ("pre" "post") do if "%1" == %%x (goto :check1_good) else (set VAL1WRONG=1)
if %VAL1WRONG%==1 (
  echo First parameter should be either "pre" for "post"
  echo:
  goto :HELP) & (goto :EOF)
  
:check1_good
REM Now check if the second parameter is between 1 and 6 if not show help and exit
for %%y in ("1" "2" "3" "4" "5" "6") do if "%2" == %%y (goto :check2_good) else (set VAL2WRONG=1)
if %VAL2WRONG%==1 (
  echo Second parameter should be either a number between 1 and 6
  echo:
  goto :HELP) & (goto :EOF)

REM Checks are good, correct input parameters provided
:check2_good

set v_type=%1
set v_code=%2

goto :setEnvironment
:EndOfSetEnvironment

REM ===================================
REM Test Input values and execute windows code block depending on input
REM ===================================

if %v_type%==pre (
  echo Going to execute pre processing
  echo:
  if %v_code%==1 (goto :pre_1) & (got :EOF)   
  if %v_code%==2 (goto :pre_2) & (got :EOF) 
  if %v_code%==3 (goto :pre_3) & (got :EOF) 
  if %v_code%==4 (goto :pre_4) & (got :EOF) 
  if %v_code%==5 (goto :pre_5) & (got :EOF) 
  if %v_code%==6 (goto :pre_6) & (got :EOF)       
 ) else (
  echo Going to execute post processing 
  echo:
  if %v_code%==1 (goto :post_1) & (got :EOF)   
  if %v_code%==2 (goto :post_2) & (got :EOF) 
  if %v_code%==3 (goto :post_3) & (got :EOF) 
  if %v_code%==4 (goto :post_4) & (got :EOF) 
  if %v_code%==5 (goto :post_5) & (got :EOF) 
  if %v_code%==6 (goto :post_6) & (got :EOF)  
)


REM === End of Checks

popd
endlocal
goto :EXIT

REM -- END Main Section

REM ##########################################
REM   Function to set Environment values
REM ##########################################
:setEnvironment

 set DBVISIT_BASE="c:\Program Files\dbvisit"
 set ORACLE_HOME=c:\app\oracle\product\11.2.0
 set TNS_ADMIN=%ORACLE_HOME%\network\admin
 set ORACLE_SID=testdb
 set PATH=%ORACLE_HOME%\bin;%PATH%
 
 for /F "tokens=1,2,3,4 delims=/- "  %%a  in  ('date /t') do set CDATE=%%d%%c%%b
 for /F "tokens=1,2,3,4 delims=/: "  %%a  in  ('time /t') do set CTIME=%%a%%b%%c
 set LOGTIME=%CDATE%-%CTIME%
 echo %LOGTIME%

GOTO :EndOfSetEnvironment
REM ##########################################

REM ##############################################
REM ## Below are all the PRE Processing Functions
REM ##############################################

REM ####### pre_1 Function ###################
:pre_1
  echo Running Pre Processing steps on primary during normal dbvisit run
  REM --- add custom code here  
goto :EXIT

REM ####### pre_2 Function ###################
:pre_2
  echo Running Pre Processing steps on standby during normal dbvisit run
  REM --- add custom code here  
goto :EXIT

REM ####### pre_3 Function ###################
:pre_3
  echo Running Pre Processing steps on primary during Graceful Switchover
  REM --- add custom code here  
goto :EXIT

REM ####### pre_4 Function ###################
:pre_4
  echo Running Pre Processing steps on stadnby during Graceful Switchover
  REM --- add custom code here  
goto :EXIT

REM ####### pre_5 Function ###################
:pre_5
  echo Running Pre Processing steps on standby during Activation
  REM --- add custom code here  
goto :EXIT

REM ####### pre_6 Function ###################
:pre_6
  echo Running Pre Processing steps on standby during open Read-Only
  REM --- add custom code here  
goto :EXIT


REM ##############################################
REM ## Below are all the POST Processing Functions
REM ##############################################

REM ####### post_1 Function ###################
:post_1
  echo Running Post Processing steps on primary during normal dbvisit run
  REM --- add custom code here  
goto :EXIT

REM ####### post_2 Function ###################
:post_2
  echo Running Post Processing steps on standby during normal dbvisit run
  REM --- add custom code here  
goto :EXIT

REM ####### post_3 Function ###################
:post_3
  echo Running Post Processing steps on primary during Graceful Switchover
  REM --- add custom code here
goto :EXIT

REM ####### post_4 Function ###################
:post_4
  echo Running Post Processing steps on stadnby during Graceful Switchover
  REM --- add custom code here  
goto :EXIT

REM ####### post_5 Function ###################
:post_5
  echo Running Post Processing steps on standby during Activation
  REM --- add custom code here
goto :EXIT

REM ####### post_6 Function ###################
:post_6
  echo Running Post Processing steps on standby during open Read-Only
  REM --- add custom code here
goto :EXIT


:HELP
  echo USAGE:
  echo  dbv_pre_post_processing.bat [pre^|post] [1^|2^|3^|4^|5^|6]
  echo:
  echo      [pre^|post]    - Specify if Pre or Post processing is being performed
  echo      [1^|2^|3^|4^|5^|6] - Indicate Dbvisit operation being performed
  echo:      
  echo      pre  ^= Pre Dbvisit Processing step
  echo      post ^= Post Dbvisit Processing step
  echo      1 ^= Dbvisit is executed on primary and will be sending logs to standby
  echo      2 ^= Dbvisit is executed on standby and will be applying logs
  echo      3 ^= Dbvisit Graceful Switchover is executed on primary 
  echo      4 ^= Dbvisit Graceful Switchover is executed on standby
  echo      5 ^= Dbvisit Activation is executed on standby
  echo      6 ^= Standby Database is opened read-only 
  echo: 
  echo  Example, to perform a task on the standby server following activation:
  echo: 
  echo     dbv_pre_post_processing.bat  post 5
goto :EOF

:EXIT
popd
endlocal
REM echo EXIT %ERRORLEVEL%
goto :EOF


ASM Aliases


One of the changes included since the 8.0.16 release is that during CSD (at the end of it) a text file is created in the standby dbvisit LOGDIR.

This file contains a list of datafile details from the primary, which would include example the ASM alias names if they were used.

The file naming is DBVISIT_BASE/standby/log/dbv_<DDC>_csd_db_file_info.txt


The file text has the following format:

DATAFIILE_TYPE (DATA/TEMP), FILE_ID, FILE_NAME, TABLESPACE_NAME,CON_ID


Example:

DATA,1,+DATA2/DBVFOUR/DATAFILE/system.263.948382091,SYSTEM,0
DATA,2,+DATA2/DBVFOUR/DATAFILE/sysaux.264.948382097,SYSAUX,0
DATA,3,+DATA2/DBVFOUR/DATAFILE/undotbs1.265.948382101,UNDOTBS1,0
DATA,4,+DATA2/DBVFOUR/DATAFILE/undotbs2.267.948382111,UNDOTBS2,0
DATA,5,+DATA2/DBVFOUR/DATAFILE/users.268.948382115,USERS,0
DATA,6,+DATA2/DBVFOUR/DATAFILE/test02.dbf,TEST1,0
DATA,8,+DATA2/dbvfour/test401.dbf,TEST4,0
TEMP,1,+DATA2/DBVFOUR/TEMPFILE/temp.2097.950291191,TEMP,0


This file can be used as part of a post-processing script (sample is located in the DBVISIT_BASE/standby/doc) folder - at the end of CSD to run a small script to take this as input and create ASM aliases if you require that on the standby server.   

We do not recommend the use of ASM aliases but to rather use true OMF naming.  But if you do want to continue with ASM aliases, we now provide the above to help you create your own post-processing script to create them as required to your needs