一.背景
需要部署一个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
备份结果:

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




