Skip to main content

Template batch file and RMAN script for Windows RMAN hosts

Druva provides a template batch file and an RMAN script for Windows RMAN hosts that you can use to backup databases. The scripts are:

  • oracle_rman_backup.bat: This batch file runs the RMAN script that backs up a database. You can modify this script to provide RMAN parameters that specify the type of backup and information related to backup like filesperset and channels for a backup.

  • rman_backup_windows.rman: This script runs the backup job on RMAN.

Druva provides the following scripts to enhance the backup performance and also provides extended recovery windows locally on PBS:

  • oracle_rman_data_full_merge_weekly_backup_windows: This script recovers and applies incremental backup set copies to the full image base copies of the backup. You can schedule this script to run on crontab based on the recovery window. For example, if the recovery window is set to 7 days, this script can be scheduled to run every week and the incremental backup pieces will be applied to the full image copies once every week.

  • oracle_rman_data_incremental_daily_backup_windows: This script backs up only incremental backups without performing recovery operations. You can schedule this script to run daily and ensure a recovery window from local PBS up to 7 days or based on the rman retention set for recovery window.


    📝 Note
    The recovery window resets once the full merge script is run and hence you cannot recover your database from PBS to older backups that were backed up in the previous week.


The following sections provide the contents of the batch file and the RMAN script. You can edit these scripts to suit your requirements.

oracle_rman_backup.bat

Use this script for Enterprise Workloads agent version 7.0.2-1003652 or later.

@echo off
setlocal enableDelayedExpansion enableextensions

if "%~1"=="" goto USAGE
if "%~2"=="" goto USAGE
if not "%~3" == "" goto USAGE
goto START

:USAGE
echo.
echo Usage: %~nx0 ^<backup_store_ip^> ^<backup_mount_name^>
echo.
echo ^<backup_store_ip^> : IP address of the Phoenix Backup Store
echo ^<backup_mount_name^> : Name of the backup mount configured in Phoenix, e.g. mount1
echo.
echo ORACLE_SID is taken from the environment if set, otherwise from HKLM\SOFTWARE\ORACLE.
echo If unset, the script continues and uses WIN for PBS API path and log naming.
echo.
exit /b 1

:START
set "BACKUP_STORE_IP=%~1"
set "BACKUP_MOUNT=%~2"

:: Prefer existing environment; otherwise read ORACLE_SID from registry (optional)
if "%ORACLE_SID%"=="" (
for /f "tokens=1,2*" %%A in ('reg query "HKLM\SOFTWARE\ORACLE" /s /v ORACLE_SID 2^>nul') do (
if /I "%%A"=="ORACLE_SID" if "!ORACLE_SID!"=="" set "ORACLE_SID=%%C"
)
)
if "%ORACLE_SID%"=="" (
echo ORACLE_SID not set; continuing without it
set "RMAN_DB_SID=WIN"
) else (
echo Using ORACLE_SID=%ORACLE_SID%
set "RMAN_DB_SID=%ORACLE_SID%"
)

:: --- INITIALIZE ENHANCED FAILURE NOTIFICATION DATA ---
set "RMAN_SCRIPT_STAGE=Initialization"
set "RMAN_SCRIPT_ERROR_MSG=Unexpected termination during initialization"
set "RMAN_SCRIPT_RESOLUTION_MSG=Check export service logs or contact Druva Support"
:: -----------------------------------------------------

set "RMAN_SCRIPT_STAGE=Validate Backup Request"
echo Validating backup request

for /F "tokens=*" %%I in ('curl -sS -X GET "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/1.2/backup" 2^>nul') do set "validate_resp=%%I"
if %ERRORLEVEL% NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Backup validation request failed with response: %validate_resp%"
goto FAILURE_ALERT
)

set "VALIDATE_JSON=%validate_resp%"
set "VALIDATE_JSON=%VALIDATE_JSON:~1,-1%"
set "VALIDATE_JSON=%VALIDATE_JSON:":=",%"

set /a vcount=0
for %%I in (%VALIDATE_JSON%) do (
if !vcount! == 1 (
if /I NOT "%%I" == "0" (
set "RMAN_SCRIPT_ERROR_MSG=Backup validation failed (error_code: %%I)"
echo Response from Phoenix Backup Store: %validate_resp%
goto FAILURE_ALERT
)
)
if !vcount! == 6 (
if /I "%%I" == "true" (
set "RMAN_SCRIPT_ERROR_MSG=Backup mount reached max snapshot limit"
set "RMAN_SCRIPT_RESOLUTION_MSG=Increase max snapshots limit or wait for pending uploads"
echo Response from Phoenix Backup Store: %validate_resp%
goto FAILURE_ALERT
)
)
set /a "vcount+=1"
)
echo Validation for phoenix backup succeeded

set "RMAN_SCRIPT_STAGE=Start Phoenix Backup"
echo Notifying Phoenix to start backup - Phoenix Backup Store=%BACKUP_STORE_IP% mount name=%BACKUP_MOUNT%

for /F "tokens=*" %%I in ('curl -sS -X POST "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/backup" 2^>nul') do set "res=%%I"
if %ERRORLEVEL% NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Failed to start Phoenix Backup session"
goto FAILURE_ALERT
)

set "JSON=%res%"
set "JSON=%JSON:~1,-1%"
set "JSON=%JSON:":=",%"

set /a count=0
set "mount_name="
set "mount_path="

for %%I in (%JSON%) do (
if !count! == 1 (
if /I NOT "%%I" == "0" (
set "RMAN_SCRIPT_ERROR_MSG=Phoenix Backup init failed (error_code: %%I)"
echo Response from Phoenix Backup Store: %res%
goto FAILURE_ALERT
)
)
if !count! == 6 set "mount_name=%%~I"
if !count! == 13 set "mount_path=%%~I"
set /a "count+=1"
)

:: Sanitize mount path strings and fix Linux to Windows backslash path mappings
set "mount_path=%mount_path:~,-2%"
set "mount_path=%mount_path:/=\%"
set "complete_mount=\\%BACKUP_STORE_IP%%mount_path%"

set "RMAN_SCRIPT_STAGE=Mount Phoenix Backup Store"
if not exist "%complete_mount%" (
set "RMAN_SCRIPT_ERROR_MSG=Backup mount path missing or unreachable"
set "RMAN_SCRIPT_RESOLUTION_MSG=Verify network path and share permissions"
goto FAILURE_ALERT
)

if not exist "%complete_mount%\full" (
echo Creating directory %complete_mount%\full
set "RMAN_SCRIPT_STAGE=Create Full Backup Directory"
mkdir "%complete_mount%\full"
if !ERRORLEVEL! NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Failed to create full backup directory"
set "RMAN_SCRIPT_RESOLUTION_MSG=Check directory permissions and writability"
goto FAILURE_ALERT
)
)

set "RMAN_SCRIPT_STAGE=Request RMAN Snapshot for Full Backup"
for /F "tokens=*" %%I in ('curl -sS -X POST "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/%RMAN_DB_SID%/full/rmanbackup" 2^>nul') do set "res_rmanbackup=%%I"
if %ERRORLEVEL% NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Failed to request RMAN snapshot"
set "RMAN_SCRIPT_RESOLUTION_MSG=Verify backup mount configuration"
goto FAILURE_ALERT
)

set "RMAN_JSON=%res_rmanbackup%"
set "RMAN_JSON=%RMAN_JSON:~1,-1%"
set "RMAN_JSON=%RMAN_JSON:":=",%"

set /a count=0
set "SNAP_NAME="
for %%I in (%RMAN_JSON%) do (
if !count! == 1 (
if /I NOT "%%I" == "0" (
set "RMAN_SCRIPT_ERROR_MSG=Failed to get snapshot name"
set "RMAN_SCRIPT_RESOLUTION_MSG=Verify backup mount configuration"
echo Response from Phoenix Backup Store: %res_rmanbackup%
goto FAILURE_ALERT
)
)
if !count! == 15 set "SNAP_NAME=%%~I"
set /a "count+=1"
)

set "SNAP_NAME=%SNAP_NAME:~,-2%"
if "%SNAP_NAME%" == "" (
set "RMAN_SCRIPT_ERROR_MSG=Failed to get snapshot name"
set "RMAN_SCRIPT_RESOLUTION_MSG=Verify backup mount configuration"
goto FAILURE_ALERT
)
echo Snapshot to be created %SNAP_NAME%

set "LOG_FILE_DIR=%complete_mount%\_workspace\RMAN_Logs"
if not exist "%LOG_FILE_DIR%" (
mkdir "%LOG_FILE_DIR%"
if !ERRORLEVEL! NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Failed to create RMAN log directory"
set "RMAN_SCRIPT_RESOLUTION_MSG=Check directory permissions and writability"
goto FAILURE_ALERT
)
)

set "RMAN_LOGFILE=%LOG_FILE_DIR%\rman_full_backup_%SNAP_NAME%_%RMAN_DB_SID%.log"
echo RMAN Logfile: %RMAN_LOGFILE%

set "RMAN_SCRIPT_STAGE=Run RMAN Backup"
rman log="%RMAN_LOGFILE%" @rman_backup_windows.rman using '%complete_mount%'
set "RMAN_EXIT_STATUS=!ERRORLEVEL!"
if !RMAN_EXIT_STATUS! NEQ 0 (
set "EXIT_CODE=!RMAN_EXIT_STATUS!"
set "RMAN_SCRIPT_ERROR_MSG=RMAN backup failed (exit_code: !RMAN_EXIT_STATUS!)"
set "RMAN_SCRIPT_RESOLUTION_MSG=Check RMAN logs and fix the issue"
goto FAILURE_ALERT
)
echo RMAN backup completed successfully

set "RMAN_SCRIPT_STAGE=Upload RMAN Logs"
echo Notifying Phoenix to upload RMAN Logs
for /F "tokens=*" %%I in ('curl -sS -X POST -H "Content-Type: multipart/form-data" -F "file=@%RMAN_LOGFILE%" -F "mountpoint=%complete_mount%" -F "platform=windows" "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/uploadlog" 2^>nul') do set "rman_uploadlog_res=%%I"
if %ERRORLEVEL% NEQ 0 (
echo [WARNING] Request to send RMAN Logs failed over network channel.
)

set "RMAN_SCRIPT_STAGE=End Backup"
echo Notifying Phoenix to end backup
for /F "tokens=*" %%I in ('curl -sS -X PUT "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/backup" 2^>nul') do set "final_res=%%I"
if %ERRORLEVEL% NEQ 0 (
set "RMAN_SCRIPT_ERROR_MSG=Failed to end Phoenix Backup with response: %final_res%"
set "RMAN_SCRIPT_RESOLUTION_MSG=Verify export service is reachable and check its logs"
goto FAILURE_ALERT
)

echo Response from Phoenix Backup Store : %final_res%
echo Exiting with successful status
exit /b 0


:: =====================================================================
:: --- CENTRALIZED ENHANCED FAILURE NOTIFICATION LOGIC ---
:: =====================================================================
:FAILURE_ALERT
:: Prefer EXIT_CODE set by the caller (e.g. RMAN_EXIT_STATUS); else use ERRORLEVEL.
if not defined EXIT_CODE set "EXIT_CODE=%ERRORLEVEL%"
if "%EXIT_CODE%"=="0" set "EXIT_CODE=1"

echo [ERROR] Script failed at stage: "%RMAN_SCRIPT_STAGE%"
echo [ERROR] Error Detail: "%RMAN_SCRIPT_ERROR_MSG%"
echo [ERROR] Resolution Action: "%RMAN_SCRIPT_RESOLUTION_MSG%"

:: Build JSON via PowerShell (proper escaping) and POST from file.
:: CMD cannot safely expand JSON in curl -d "..." — quotes/spaces break the body,
:: and PBS then logs defaults: exit_code=-1, empty stage/msg fields.
set "FA_JSON=%TEMP%\rman_fail_alert_%RANDOM%.json"
powershell -NoProfile -Command "$p=@{exit_code=[int]$env:EXIT_CODE;failure_stage=[string]$env:RMAN_SCRIPT_STAGE;db_sid=[string]$env:ORACLE_SID;error_msg=[string]$env:RMAN_SCRIPT_ERROR_MSG;resolution_msg=[string]$env:RMAN_SCRIPT_RESOLUTION_MSG}; $j=$p|ConvertTo-Json -Compress; $enc=New-Object System.Text.UTF8Encoding $false; [System.IO.File]::WriteAllText($env:FA_JSON,$j,$enc)"
if exist "%FA_JSON%" (
curl -sS --max-time 30 -X POST "http://%BACKUP_STORE_IP%:9090/druva-phoenix/v1/mounts/%BACKUP_MOUNT%/rmanbackup/failure-alert" -H "Content-Type: application/json" --data-binary "@%FA_JSON%" >nul 2>&1
del /F /Q "%FA_JSON%" >nul 2>&1
) else (
echo [WARNING] Failed to build failure alert JSON payload
)

exit /b %EXIT_CODE%

Use this script for Enterprise Workloads agent version 7.0.2-985623 or earlier.

echo off

if not "%~2"=="" if "%~3"=="" goto START
echo This script requires the next parameters:
echo - backup_store_ip mount_name
echo - backup_store_ip : IP of backup store
echo - mount_name : backup mount name as in CPortal
goto EOF

:START

echo Starting Backup

setlocal enableDelayedExpansion enableextensions

for /F "tokens=*" %%I in ('curl -X GET http://%1:9090/druva-phoenix/v1/mounts/%2/1.2/backup') do set validate_curl_output=%%I

set VALIDATE_JSON=%validate_curl_output%
set "VALIDATE_JSON=%VALIDATE_JSON:~1,-1%"
set "VALIDATE_JSON=%VALIDATE_JSON:":=",%"

set /a vcount = 0

REM Check for validate response
for %%I in (%VALIDATE_JSON%) do (
if !vcount! == 1 (
if /I NOT %%I == 0 (
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
) else (
echo Request to validate backup succeeded
)
)

REM is_max_snapshot_reached
if !vcount! == 6 (
if %%I == true (
echo Maximum Pending Snapshot limit on PBS is reached.
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
)
)

set /a "vcount+=1"
)

echo Validation Succeeded. Calling Start Backup

for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output=%%I

set JSON=%curl_output%

echo OUTPUT %curl_output%

set "JSON=%JSON:~1,-1%"
set "JSON=%JSON:":=",%"

set /a count = 0

for %%I in (%JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)

if !count! == 6 (
set mount_name=%%~I
)

if !count! == 13 (
set mount_path=%%~I
)

set /a "count+=1"
)

set mount_path=%mount_path:~,-2%
echo %mount_path%
set mount_path=!mount_path:/=\!
echo %mount_path%
set complete_mount=\\%1%mount_path%
echo %complete_mount%
echo Mount name %mount_name%
echo NFS mount path %complete_mount%

if not exist %complete_mount%\full (
echo Creating directory %complete_mount%\full
mkdir %complete_mount%\full
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %complete_mount%\full.. exiting
exit /b
)
)
REM Calling RMAN Backup on PBS
for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/WIN/full/rmanbackup') do set rman_curl_output=%%I

set RMAN_JSON=%rman_curl_output%

echo Response of rman backup: %RMAN_JSON%

set "RMAN_JSON=%RMAN_JSON:~1,-1%"
set "RMAN_JSON=%RMAN_JSON:":=",%"

set /a count = 0

for %%I in (%RMAN_JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %RMAN_JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)
if !count! == 15 (
echo Setting Snapshot Name: %%I
set SNAP_NAME=%%~I
)
set /a "count+=1"
)

set SNAP_NAME=%SNAP_NAME:~,-2%

echo Snapshot to be created: %SNAP_NAME%
REM set SNAP_NAME=""
if %SNAP_NAME% == "" (
echo "Empty Snapshot Name. Exiting."
exit /b
)

set LOG_FILE_DIR=%complete_mount%\_workspace\RMAN_Logs
echo LOG FILE DIR IS := %LOG_FILE_DIR%
if not exist %LOG_FILE_DIR% (
mkdir %LOG_FILE_DIR%
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %LOG_FILE_DIR.. exiting
exit /b
)
)

set RMAN_LOGFILE=%LOG_FILE_DIR%\rman_full_backup_%SNAP_NAME%_WIN.log

rman log=%RMAN_LOGFILE% @rman_backup_windows.rman using '%complete_mount%'
if !ERRORLEVEL! NEQ 0 (
echo RMAN backup failed. Check RMAN log %RMAN_LOGFILE% for the details
exit /b
)

echo RMAN backup completed

echo Notifying Phoenix to upload RMAN Logs
for /F %%I in ('curl -X POST -H "Content-Type: multipart/form-data" -F "file=@%RMAN_LOGFILE%" -F "mountpoint=%complete_mount%" -F "platform=windows" http://%1:9090/druva-phoenix/v1/mounts/%2/uploadlog') do set rman_upload_log_curl_output=%%I

echo Response from Phoenix Backup Store for upload RMAN Log: %rman_upload_log_curl_output%

echo Calling End Backup
for /F %%I in ('curl -X PUT http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output2=%%I

echo Response from Phoenix Backup Store : %curl_output2%

:EOF
exit /b

rman_backup_windows.rman

Use this script for Enterprise Workloads agent version 7.0.2-1003652 or later.

connect target /
set echo on;

configure backup optimization on;
configure controlfile autobackup on;
configure device type disk parallelism 1 BACKUP TYPE TO COPY;
configure datafile backup copies for device type disk to 1;
configure archivelog backup copies for device type disk to 1;
configure channel device type disk format '&1\full\full_bk_datafile_%U.rbk';
configure controlfile autobackup format for device type disk to '&1\full\full_bk_controlfile_%F';

run
{

backup incremental level 1 for recover of copy with tag 'phoenix_oracle_backup' database;
backup format '&1\full\full_bk_Archivelog_%d_%s_%t' archivelog all not backed up;
recover copy of database with tag 'phoenix_oracle_backup';

#Force is to ignore I/O errors
delete noprompt obsolete device type disk;
delete force NOPROMPT expired copy;
delete force NOPROMPT expired backup;

crosscheck backup;
crosscheck copy;
}

configure backup optimization clear;
configure controlfile autobackup clear;

exit

Use this script for Enterprise Workloads agent version 7.0.2-985623 or earlier.

connect target /
set echo on;

configure backup optimization on;
configure controlfile autobackup on;
configure device type disk parallelism 1 BACKUP TYPE TO COPY;
configure datafile backup copies for device type disk to 1;
configure archivelog backup copies for device type disk to 1;
configure channel device type disk format '&1\full\full_bk_datafile_%U.rbk';
configure controlfile autobackup format for device type disk to '&1\full\full_bk_controlfile_%F';


run
{

backup incremental level 1 for recover of copy with tag 'phoenix_oracle_backup' database;
backup format '&1\full\full_bk_Archivelog_%d_%s_%t' archivelog all not backed up;
recover copy of database with tag 'phoenix_oracle_backup';


#Force is to ignore I/O errors
delete noprompt obsolete device type disk;
delete force NOPROMPT expired copy;
delete force NOPROMPT expired backup;


crosscheck backup;
crosscheck copy;
}


configure backup optimization clear;
configure controlfile autobackup clear;


exit

oracle_rman_data_full_merge_weekly_backup_windows.bat

Click here to view script

echo off

if not "%~2"=="" if "%~3"=="" goto START
echo This script requires the next parameters:
echo - backup_store_ip mount_name
echo - backup_store_ip : IP of backup store
echo - mount_name : backup mount name as in CPortal
goto EOF

:START

echo Starting Backup

setlocal enableDelayedExpansion enableextensions

for /F "tokens=*" %%I in ('curl -X GET http://%1:9090/druva-phoenix/v1/mounts/%2/1.2/backup') do set validate_curl_output=%%I

set VALIDATE_JSON=%validate_curl_output%
set "VALIDATE_JSON=%VALIDATE_JSON:~1,-1%"
set "VALIDATE_JSON=%VALIDATE_JSON:":=",%"

set /a vcount = 0

REM Check for validate response
for %%I in (%VALIDATE_JSON%) do (
if !vcount! == 1 (
if /I NOT %%I == 0 (
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
) else (
echo Request to validate backup succeeded
)
)

REM is_max_snapshot_reached
if !vcount! == 6 (
if %%I == true (
echo Maximum Pending Snapshot limit on PBS is reached.
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
)
)

set /a "vcount+=1"
)

echo Validation Succeeded. Calling Start Backup

for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output=%%I

set JSON=%curl_output%

echo OUTPUT %curl_output%

set "JSON=%JSON:~1,-1%"
set "JSON=%JSON:":=",%"

set /a count = 0

for %%I in (%JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)

if !count! == 6 (
set mount_name=%%~I
)

if !count! == 13 (
set mount_path=%%~I
)

set /a "count+=1"
)

set mount_path=%mount_path:~,-2%
echo %mount_path%
set mount_path=!mount_path:/=\!
echo %mount_path%
set complete_mount=\\%1%mount_path%
echo %complete_mount%
echo Mount name %mount_name%
echo NFS mount path %complete_mount%

if not exist %complete_mount%\full (
echo Creating directory %complete_mount%\full
mkdir %complete_mount%\full
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %complete_mount%\full.. exiting
exit /b
)
)
REM Calling RMAN Backup on PBS
for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/WIN/full/rmanbackup') do set rman_curl_output=%%I

set RMAN_JSON=%rman_curl_output%

echo Response of rman backup: %RMAN_JSON%

set "RMAN_JSON=%RMAN_JSON:~1,-1%"
set "RMAN_JSON=%RMAN_JSON:":=",%"

set /a count = 0

for %%I in (%RMAN_JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %RMAN_JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)
if !count! == 15 (
echo Setting Snapshot Name: %%I
set SNAP_NAME=%%~I
)
set /a "count+=1"
)

set SNAP_NAME=%SNAP_NAME:~,-2%

echo Snapshot to be created: %SNAP_NAME%
REM set SNAP_NAME=""
if %SNAP_NAME% == "" (
echo "Empty Snapshot Name. Exiting."
exit /b
)

set LOG_FILE_DIR=%complete_mount%\_workspace\RMAN_Logs
echo LOG FILE DIR IS := %LOG_FILE_DIR%
if not exist %LOG_FILE_DIR% (
mkdir %LOG_FILE_DIR%
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %LOG_FILE_DIR.. exiting
exit /b
)
)

set RMAN_LOGFILE=%LOG_FILE_DIR%\rman_full_backup_%SNAP_NAME%_WIN.log

rman log=%RMAN_LOGFILE% @oracle_rman_data_full_merge_weekly_backup_windows.rman using '%complete_mount%'
if !ERRORLEVEL! NEQ 0 (
echo RMAN backup failed. Check RMAN log %RMAN_LOGFILE% for the details
exit /b
)

echo RMAN backup completed

echo Notifying Phoenix to upload RMAN Logs
for /F %%I in ('curl -X POST -H "Content-Type: multipart/form-data" -F "file=@%RMAN_LOGFILE%" -F "mountpoint=%complete_mount%" -F "platform=windows" http://%1:9090/druva-phoenix/v1/mounts/%2/uploadlog') do set rman_upload_log_curl_output=%%I

echo Response from Phoenix Backup Store for upload RMAN Log: %rman_upload_log_curl_output%

echo Calling End Backup
for /F %%I in ('curl -X PUT http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output2=%%I

echo Response from Phoenix Backup Store : %curl_output2%

:EOF
exit /b

oracle_rman_data_full_merge_weekly_backup_windows.rman

Click here to view script

connect target /
set echo on;

configure backup optimization on;
configure controlfile autobackup on;
configure device type disk parallelism 1 BACKUP TYPE TO COPY;
configure datafile backup copies for device type disk to 1;
configure archivelog backup copies for device type disk to 1;
configure channel device type disk format '&1\full\full_bk_datafile_%U.rbk';
configure controlfile autobackup format for device type disk to '&1\full\full_bk_controlfile_%F';

run
{
recover copy of database with tag 'phoenix_oracle_backup';
backup incremental level 1 for recover of copy with tag 'phoenix_oracle_backup' database;
backup format '&1\full\full_bk_Archivelog_%d_%s_%t' archivelog all not backed up;

#Force is to ignore I/O errors
delete noprompt obsolete device type disk;
delete force NOPROMPT expired copy;
delete force NOPROMPT expired backup;

crosscheck backup;
crosscheck copy;
}

configure backup optimization clear;
configure controlfile autobackup clear;

exit

oracle_rman_data_incremental_daily_backup_windows.bat

Click here to view script

echo off

if not "%~2"=="" if "%~3"=="" goto START
echo This script requires the next parameters:
echo - backup_store_ip mount_name
echo - backup_store_ip : IP of backup store
echo - mount_name : backup mount name as in CPortal
goto EOF

:START

echo Starting Backup

setlocal enableDelayedExpansion enableextensions

for /F "tokens=*" %%I in ('curl -X GET http://%1:9090/druva-phoenix/v1/mounts/%2/1.2/backup') do set validate_curl_output=%%I

set VALIDATE_JSON=%validate_curl_output%
set "VALIDATE_JSON=%VALIDATE_JSON:~1,-1%"
set "VALIDATE_JSON=%VALIDATE_JSON:":=",%"

set /a vcount = 0

REM Check for validate response
for %%I in (%VALIDATE_JSON%) do (
if !vcount! == 1 (
if /I NOT %%I == 0 (
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
) else (
echo Request to validate backup succeeded
)
)

REM is_max_snapshot_reached
if !vcount! == 6 (
if %%I == true (
echo Maximum Pending Snapshot limit on PBS is reached.
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
)
)

set /a "vcount+=1"
)

echo Validation Succeeded. Calling Start Backup

for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output=%%I

set JSON=%curl_output%

echo OUTPUT %curl_output%

set "JSON=%JSON:~1,-1%"
set "JSON=%JSON:":=",%"

set /a count = 0

for %%I in (%JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)

if !count! == 6 (
set mount_name=%%~I
)

if !count! == 13 (
set mount_path=%%~I
)

set /a "count+=1"
)

set mount_path=%mount_path:~,-2%
echo %mount_path%
set mount_path=!mount_path:/=\!
echo %mount_path%
set complete_mount=\\%1%mount_path%
echo %complete_mount%
echo Mount name %mount_name%
echo NFS mount path %complete_mount%

if not exist %complete_mount%\full (
echo Creating directory %complete_mount%\full
mkdir %complete_mount%\full
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %complete_mount%\full.. exiting
exit /b
)
)
REM Calling RMAN Backup on PBS
for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/WIN/full/rmanbackup') do set rman_curl_output=%%I

set RMAN_JSON=%rman_curl_output%

echo Response of rman backup: %RMAN_JSON%

set "RMAN_JSON=%RMAN_JSON:~1,-1%"
set "RMAN_JSON=%RMAN_JSON:":=",%"

set /a count = 0

for %%I in (%RMAN_JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %RMAN_JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)
if !count! == 15 (
echo Setting Snapshot Name: %%I
set SNAP_NAME=%%~I
)
set /a "count+=1"
)

set SNAP_NAME=%SNAP_NAME:~,-2%

echo Snapshot to be created: %SNAP_NAME%
REM set SNAP_NAME=""
if %SNAP_NAME% == "" (
echo "Empty Snapshot Name. Exiting."
exit /b
)

set LOG_FILE_DIR=%complete_mount%\_workspace\RMAN_Logs
echo LOG FILE DIR IS := %LOG_FILE_DIR%
if not exist %LOG_FILE_DIR% (
mkdir %LOG_FILE_DIR%
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %LOG_FILE_DIR.. exiting
exit /b
)
)

set RMAN_LOGFILE=%LOG_FILE_DIR%\rman_inc_backup_%SNAP_NAME%_WIN.log

rman log=%RMAN_LOGFILE% @oracle_rman_data_incremental_daily_backup_windows.rman using '%complete_mount%'
if !ERRORLEVEL! NEQ 0 (
echo RMAN backup failed. Check RMAN log %RMAN_LOGFILE% for the details
exit /b
)

echo RMAN backup completed

echo Notifying Phoenix to upload RMAN Logs
for /F %%I in ('curl -X POST -H "Content-Type: multipart/form-data" -F "file=@%RMAN_LOGFILE%" -F "mountpoint=%complete_mount%" -F "platform=windows" http://%1:9090/druva-phoenix/v1/mounts/%2/uploadlog') do set rman_upload_log_curl_output=%%I

echo Response from Phoenix Backup Store for upload RMAN Log: %rman_upload_log_curl_output%

echo Calling End Backup
for /F %%I in ('curl -X PUT http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output2=%%I

echo Response from Phoenix Backup Store : %curl_output2%

:EOF
exit /b

oracle_rman_data_incremental_daily_backup_windows.rman

Click here to view script

connect target /
set echo on;

configure backup optimization on;
configure controlfile autobackup on;
configure device type disk parallelism 1 BACKUP TYPE TO COPY;
configure datafile backup copies for device type disk to 1;
configure archivelog backup copies for device type disk to 1;
configure channel device type disk format '&1\full\full_bk_datafile_%U.rbk';
configure controlfile autobackup format for device type disk to '&1\full\full_bk_controlfile_%F';

run
{

backup incremental level 1 for recover of copy with tag 'phoenix_oracle_backup' database;
backup format '&1\full\inc_daily_bk_Archivelog_%d_%s_%t' archivelog all not backed up;

#Force is to ignore I/O errors
delete noprompt obsolete device type disk;
delete force NOPROMPT expired copy;
delete force NOPROMPT expired backup;

crosscheck backup;
crosscheck copy;
}

configure backup optimization clear;
configure controlfile autobackup clear;

exit

Template scripts for Phoenix Backup Store with version 4.9.0 or earlier


❗ Important


Druva requires you to use the following template scripts for Phoenix Backup Store with version 4.9.0 or earlier.


oracle_rman_backup.bat

echo off


if not "%~2"=="" if "%~3"=="" goto START
echo This script requires the next parameters:
echo - backup_store_ip mount_name
echo - backup_store_ip : IP of backup store
echo - mount_name : backup mount name as in CPortal
goto EOF

:START


echo Starting Backup



setlocal enableDelayedExpansion enableextensions



for /F "tokens=*" %%I in ('curl -X GET http://%1:9090/druva-phoenix/v1/mounts/%2/1.2/backup') do set validate_curl_output=%%I

set VALIDATE_JSON=%validate_curl_output%
set "VALIDATE_JSON=%VALIDATE_JSON:~1,-1%"
set "VALIDATE_JSON=%VALIDATE_JSON:":=",%"

set /a vcount = 0

REM Check for validate response
for %%I in (%VALIDATE_JSON%) do (
if !vcount! == 1 (
if /I NOT %%I == 0 (
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
) else (
echo Request to validate backup succeeded
)
)



REM is_max_snapshot_reached
if !vcount! == 6 (
if %%I == true (
echo Maximum Pending Snapshot limit on PBS is reached.
echo Request to validate backup failed, exiting
echo Response from Phoenix Backup Store %VALIDATE_JSON%
exit /b 1
)
)



set /a "vcount+=1"
)


echo Validation Succeeded. Calling Start Backup


for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output=%%I


set JSON=%curl_output%

echo OUTPUT %curl_output%

set "JSON=%JSON:~1,-1%"
set "JSON=%JSON:":=",%"

set /a count = 0



for %%I in (%JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)



if !count! == 6 (
set mount_name=%%~I
)



if !count! == 13 (
set mount_path=%%~I
)



set /a "count+=1"
)


set mount_path=%mount_path:~,-2%
echo %mount_path%
set mount_path=!mount_path:/=\!
echo %mount_path%
set complete_mount=\\%1%mount_path%
echo %complete_mount%
echo Mount name %mount_name%
echo NFS mount path %complete_mount%

if not exist %complete_mount%\full (
echo Creating directory %complete_mount%\full
mkdir %complete_mount%\full
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %complete_mount%\full.. exiting
exit /b
)
)
REM Calling RMAN Backup on PBS
for /F %%I in ('curl -X POST http://%1:9090/druva-phoenix/v1/mounts/%2/WIN/full/rmanbackup') do set rman_curl_output=%%I

set RMAN_JSON=%rman_curl_output%

echo Response of rman backup: %RMAN_JSON%


set "RMAN_JSON=%RMAN_JSON:~1,-1%"
set "RMAN_JSON=%RMAN_JSON:":=",%"


set /a count = 0


for %%I in (%RMAN_JSON%) do (
if !count! == 1 (
if /I NOT %%I == 0 (
echo Request to start backup failed, exiting
echo Response from Phoenix Backup Store %RMAN_JSON%
exit /b 1
) else (
echo Request to start backup succeeded
)
)
if !count! == 15 (
echo Setting Snapshot Name: %%I
set SNAP_NAME=%%~I
)
set /a "count+=1"
)

set SNAP_NAME=%SNAP_NAME:~,-2%


echo Snapshot to be created: %SNAP_NAME%
REM set SNAP_NAME=""
if %SNAP_NAME% == "" (
echo "Empty Snapshot Name. Exiting."
exit /b
)

set LOG_FILE_DIR=%complete_mount%\_workspace\RMAN_Logs
echo LOG FILE DIR IS := %LOG_FILE_DIR%
if not exist %LOG_FILE_DIR% (
mkdir %LOG_FILE_DIR%
if !ERRORLEVEL! NEQ 0 (
echo Unable to create directory %LOG_FILE_DIR.. exiting
exit /b
)
)


set RMAN_LOGFILE=%LOG_FILE_DIR%\rman_full_backup_%SNAP_NAME%_WIN.log


rman log=%RMAN_LOGFILE% @rman_backup_windows.rman using '%complete_mount%'
if !ERRORLEVEL! NEQ 0 (
echo RMAN backup failed. Check RMAN log %RMAN_LOGFILE% for the details
exit /b
)

echo RMAN backup completed


echo Notifying Phoenix to upload RMAN Logs
for /F %%I in ('curl -X POST -H "Content-Type: multipart/form-data" -F "file=@%RMAN_LOGFILE%" -F "mountpoint=%complete_mount%" -F "platform=windows" http://%1:9090/druva-phoenix/v1/mounts/%2/uploadlog') do set rman_upload_log_curl_output=%%I



echo Response from Phoenix Backup Store for upload RMAN Log: %rman_upload_log_curl_output%


echo Calling End Backup
for /F %%I in ('curl -X PUT http://%1:9090/druva-phoenix/v1/mounts/%2/backup') do set curl_output2=%%I

echo Response from Phoenix Backup Store : %curl_output2%


:EOF
exit /b

rman_backup_windows.rman

connect target /
set echo on;


configure backup optimization on;
configure controlfile autobackup on;
configure device type disk parallelism 1 BACKUP TYPE TO COPY;
configure datafile backup copies for device type disk to 1;
configure archivelog backup copies for device type disk to 1;
configure channel device type disk format '&1\full\full_bk_datafile_%U.rbk';
configure controlfile autobackup format for device type disk to '&1\full\full_bk_controlfile_%F';


run
{

backup incremental level 1 for recover of copy with tag 'phoenix_oracle_backup' database;
backup format '&1\full\full_bk_Archivelog_%d_%s_%t' archivelog all not backed up;
recover copy of database with tag 'phoenix_oracle_backup';


#Force is to ignore I/O errors
delete noprompt obsolete device type disk;
delete force NOPROMPT expired copy;
delete force NOPROMPT expired backup;

crosscheck backup;
crosscheck copy;
}

configure backup optimization clear;
configure controlfile autobackup clear;


exit


You can download the following zip file for the above scripts:

Did this answer your question?