暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

windows上oracle数据库rman备份脚本

原创 大柏树 2025-08-01
496

一.背景

需要部署一个windows上oracle数据库的rman备份脚本,有一个linux平台的rmann备份脚本,想着让deepseek根据linux的脚本改写为windows上可执行的脚本。

二.交流过程

把以下脚本改写为windows上oracle可以执行的脚本,windows上rman命令在E:\db_home\bin\rman.exe 需要指定才能执行
脚本位置 F:\rman_backup_scripts
备份文件位置 F:\rman_backup

[oracle@rac2 ~]$ cat /home/oracle/backup/scripts/backup_rman.sh #!/bin/bash source ~/.bash_profile export backup_date=`date +%Y%m%d` export backup_path=/home/oracle/backup/rman rman target / nocatalog << EOF1 crosscheck backup; crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt expired backup; delete noprompt expired backupset; delete noprompt obsolete; run { allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; backup (database format '$backup_path/${backup_date}_data_%s_%p' tag="full_data"); backup (archivelog all delete all input format '/$backup_path/${backup_date}_arc_%s_%p' tag="full_arc"); backup spfile format '/home/oracle/backup/rman/spfile_instance_%s_%d_%T_%u.bkp'; backup current controlfile format '/home/oracle/backup/rman/controlfile_instance_%s_%d_%T_%u.bkp'; release channel c1; release channel c2; release channel c3; release channel c4; } exit EOF1 [oracle@rac2 ~]$

第一次给出的脚本如下:

@echo off setlocal enabledelayedexpansion @echo off setlocal enabledelayedexpansion :: Oracle RMAN Backup Script for Windows :: Script Location: F:\rman_backup_scripts :: Backup Location: F:\rman_backup :: Oracle Home: E:\db_home :: Set Oracle environment set ORACLE_HOME=E:\db_home set PATH=%ORACLE_HOME%\bin;%PATH% :: Set backup date and paths for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a set backup_date=%datetime:~0,8% set script_path=F:\rman_backup_scripts set backup_path=F:\rman_backup set log_file=%script_path%\logs\rman_backup_%backup_date%.log set rman_cmdfile=%script_path%\temp_rman_cmd.txt :: Create necessary directories if not exist "%backup_path%" mkdir "%backup_path%" if not exist "%script_path%\logs" mkdir "%script_path%\logs" :: Create RMAN command file ( echo crosscheck backup; echo crosscheck archivelog all; echo delete noprompt expired archivelog all; echo delete noprompt expired backup; echo delete noprompt expired backupset; echo delete noprompt obsolete; echo run { echo allocate channel c1 type disk; echo allocate channel c2 type disk; echo allocate channel c3 type disk; echo allocate channel c4 type disk; echo backup database format '%backup_path%\%backup_date%_data_%%s_%%p.bkp' tag="full_data"; echo backup archivelog all delete all input format '%backup_path%\%backup_date%_arc_%%s_%%p.bkp' tag="full_arc"; echo backup spfile format '%backup_path%\spfile_instance_%%s_%%d_%%T_%%u.bkp'; echo backup current controlfile format '%backup_path%\controlfile_instance_%%s_%%d_%%T_%%u.bkp'; echo release channel c1; echo release channel c2; echo release channel c3; echo release channel c4; echo } echo exit; ) > "%rman_cmdfile%" :: Execute RMAN backup echo Starting RMAN backup at %date% %time% >> "%log_file%" %ORACLE_HOME%\bin\rman.exe target / nocatalog cmdfile="%rman_cmdfile%" log="%log_file%" append :: Check backup result if %errorlevel% equ 0 ( echo Backup completed successfully at %date% %time% >> "%log_file%" echo Backup files created in %backup_path%: dir "%backup_path%\%backup_date%*" /b >> "%log_file%" ) else ( echo Backup failed with error code %errorlevel% at %date% %time% >> "%log_file%" ) :: Clean up del "%rman_cmdfile%" endlocal exit /b %errorlevel% Save as F:\rman_backup_scripts\rman_backup.bat

测试发现不能执行,说是<< EOF1 有问题,第二次给出的脚本如下:

@echo off setlocal enabledelayedexpansion :: 配置部分 set ORACLE_HOME=E:\db_home set SCRIPT_DIR=F:\rman_backup_scripts set BACKUP_DIR=F:\rman_backup set LOG_DIR=%SCRIPT_DIR%\logs :: 获取精确时间戳 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a set backup_date=!datetime:~0,8! set backup_time=!datetime:~8,6! :: 创建目录结构 if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" :: 生成临时RMAN命令文件 set RMAN_CMD_FILE=%SCRIPT_DIR%\temp_!backup_date!_!backup_time!.rman ( echo crosscheck backup; echo crosscheck archivelog all; echo delete noprompt expired archivelog all; echo delete noprompt expired backup; echo delete noprompt obsolete; echo run { echo allocate channel c1 type disk; echo backup database format '%BACKUP_DIR%\!backup_date!_data_%%s_%%p.bkp' tag="full_data"; echo backup archivelog all delete all input format '%BACKUP_DIR%\!backup_date!_arc_%%s_%%p.bkp' tag="full_arc"; echo backup spfile format '%BACKUP_DIR%\spfile_%%d_!backup_date!.bkp'; echo backup current controlfile format '%BACKUP_DIR%\control_%%d_!backup_date!.bkp'; echo } echo exit; ) > "%RMAN_CMD_FILE%" :: 执行备份 %ORACLE_HOME%\bin\rman.exe target / nocatalog cmdfile="%RMAN_CMD_FILE%" log="%LOG_DIR%\backup_!backup_date!_!backup_time!.log" :: 检查结果并清理 if %errorlevel% equ 0 ( echo 备份成功完成 >> "%LOG_DIR%\backup_!backup_date!_!backup_time!.log" ) else ( echo 备份失败,错误代码: %errorlevel% >> "%LOG_DIR%\backup_!backup_date!_!backup_time!.log" ) del "%RMAN_CMD_FILE%" endlocal

第二次给的脚本测试可以备份。

三.测试结果

测试的时候我把F盘修改为D盘了,最后脚本如下:

@echo off setlocal enabledelayedexpansion :: 配置部分 set ORACLE_HOME=D:\windows.64_19300_db_home set SCRIPT_DIR=D:\rman_backup_scripts set BACKUP_DIR=D:\rman_backup set LOG_DIR=%SCRIPT_DIR%\logs :: 获取精确时间戳 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set datetime=%%a set backup_date=!datetime:~0,8! set backup_time=!datetime:~8,6! :: 创建目录结构 if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" :: 生成临时RMAN命令文件 set RMAN_CMD_FILE=%SCRIPT_DIR%\temp_!backup_date!_!backup_time!.rman ( echo crosscheck backup; echo crosscheck archivelog all; echo delete noprompt expired archivelog all; echo delete noprompt expired backup; echo delete noprompt obsolete; echo run { echo allocate channel c1 type disk; echo backup database format '%BACKUP_DIR%\!backup_date!_data_%%s_%%p.bkp' tag="full_data"; echo backup archivelog all delete all input format '%BACKUP_DIR%\!backup_date!_arc_%%s_%%p.bkp' tag="full_arc"; echo backup spfile format '%BACKUP_DIR%\spfile_%%d_!backup_date!.bkp'; echo backup current controlfile format '%BACKUP_DIR%\control_%%d_!backup_date!.bkp'; echo } echo exit; ) > "%RMAN_CMD_FILE%" :: 执行备份 %ORACLE_HOME%\bin\rman.exe target / nocatalog cmdfile="%RMAN_CMD_FILE%" log="%LOG_DIR%\backup_!backup_date!_!backup_time!.log" :: 检查结果并清理 if %errorlevel% equ 0 ( echo 备份成功完成 >> "%LOG_DIR%\backup_!backup_date!_!backup_time!.log" ) else ( echo 备份失败,错误代码: %errorlevel% >> "%LOG_DIR%\backup_!backup_date!_!backup_time!.log" ) del "%RMAN_CMD_FILE%" endlocal

备份结果:
image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论