Oracle RMAN自动恢复测试脚本

news2025/5/31 20:53:24

说明

此恢复测试脚本,基于rman备份脚本文章使用的fullbak.sh做的备份。

数据库将被恢复到RESTORE_LO参数设置的位置。
在恢复完成后,执行一个测试sql,确认数据库恢复完成,数据库备份是好的。恢复测试数据库的参数,比如SGA大小都没有优化,没有设置值。如果需要用于其他测试,可能需要适当调整。

主要步骤:
先建立一个init文件,只包含数据库名,版本号,和一个控制文件位置,用它启动到nomount, 从autobackup恢复控制文件。 用这个控制文件启动到mount,进行数据库恢复。在打开前,修改日志名字到RESTORE_LO指定位置。

1. 检查当前备份

ls /u02/rmanbackup

得到自动备份文件名如下图。记录其自动备份的编号,第一次备份是00.
在这里插入图片描述

查看备份日志,得到DBID.

*[oracle@testdb1 rmanbackup]$ grep DBID logs/rman_full_2025-05-29-1547.log
connected to target database: RISK (DBID=3842787173)
[oracle@testdb1 rmanbackup]$*

2. 修改恢复测试脚本

根据上述信息修改恢复脚本。

数据库ORACLE_SID, DBID,备份日期, 测试时数据库恢复使用的目录 /u02/testdata

如果目录不存在,先手动建立。

mkdir /u02/testdata

对于第一次运行,需要根据实际环境设置,以后基本不需要修改。
在这里插入图片描述

3 关闭数据库并mv当前的spfile(如果不是在同一个服务器恢复,此步可以忽略)

如果在当前服务器恢复(不建议这么做,建议在其他服务器测试)。需要先停止数据库。并且把当前使用的spfile改名(备份,并防止测试时用它)。

sqlplus / as sysdba
shut immediate;
cd $ORACLE_HOME/dbs
mv spfile${ORACLE_SID}.ora spfile${ORACLE_SID}.ora.def

输出

SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@testdb1 scripts]$ cd $ORACLE_HOME/dbs
[oracle@testdb1 dbs]$ ls -l *risk*
-rw-r----- 1 oracle oinstall 11681792 Apr 11 16:01 cntrlrisk.dbf
-rw-rw---- 1 oracle oinstall     1544 May 29 15:59 hc_risk.dat
-rw-r--r-- 1 oracle oinstall      376 Apr 12 22:00 initrisk.ora
-rw-r--r-- 1 oracle oinstall       83 Apr 12 21:59 initrisk.ora.0412
-rw-r----- 1 oracle oinstall     1536 Apr 22 09:50 orapwrisk
-rw-r----- 1 oracle oinstall 12369920 May 29 15:49 snapcf_risk.f
-rw-r----- 1 oracle oinstall     2560 May 29 05:45 spfilerisk.ora
[oracle@testdb1 dbs]$ mv spfilerisk.ora spfilerisk.ora.def
[oracle@testdb1 dbs]$ ls spfile*
spfilerisk.ora.def
[oracle@testdb1 dbs]$

4. 执行恢复

./auto_rman_test.sh
输出:

[oracle@testdb1 scripts]$ ps -ef|grep pmon
oracle    4181  2779  0 16:04 pts/0    00:00:00 grep --color=auto pmon
[oracle@testdb1 scripts]$ env|grep SID
ORACLE_SID=risk
[oracle@testdb1 scripts]$ vi auto_rman_test.sh
[oracle@testdb1 scripts]$ clear
[oracle@testdb1 scripts]$ cat auto_rman_test.sh
#!/bin/sh
#########################
# desc: test rman backup to be restored.
# set ORACLE_SID,ORACLE_HOME.
# RMANBAK_LOC: the rman backup is located. it must be same as primary db.
# RESTORE_LOC: the rmanbackup will be restored to.
# TESTSQL: the sql to be tested.
# DBID: the database ID.
# 2020.11.15. v0.1
# update: 2022.12.29 20:00
# update: 2023.01.03. 主库的在线日志目录要在备库上也创建.日志文件将在这个目录创建.并授予oracle读写权限.否则reset logs失败.
# update: 2023.02.11  增加了until的条件.可以设置时间或者sequence.
# update: 2025.05.17. 如果在原来服务器测试, 需要在测试前,把spfile文件改名。否则会覆盖以前的控制文件。
#############################  参数设置#################
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export ORACLE_SID=risk
export DBID="3842787173"

export RMANBAK_LOC="/u02/rmanbackup"  #主库rman备份目录, 必须和主库备份目录相同.
export RESTORE_LOC="/u02/testdata"  #恢复到指定目录
export BACKUP_DATE="20250529"  #数据库备份的时间,用来设置自动备份的控制文件名字,当天是`date +%Y%m%d`
export TESTSQL="select count(*) from dba_tables;"
#export TESTSQL="select * from settlement.t_systemstatus"
#export UNTILTIME="`date +%Y-%m-%d` 03:00:00"  #恢复的untiltime, 可以是主库开始备份的时间,或指定时间,如下
#export UNTILTIME="2023-12-29 17:43:00"
#export UNTILSEQ=851
#export UNTILTIME=""

#############局部变量
LOGFILE=/tmp/rman_recovery_`date +%Y%m%d-%H%M`.log
SQLLOG=/tmp/sqlplus_recovery_`date +%Y%m%d-%H%M`.log
MOUNTCMD=/tmp/mount.cmd
RECVCMD=/tmp/recv.cmd
#conrolfile控制文件名字格式, rman设置自动备份控制文件格式为 auto_%T_%F.%d
UPPER_SID=`echo $ORACLE_SID | tr '[:lower:]' '[:upper:]'`
CONTROLFILE=$RMANBAK_LOC/auto_${BACKUP_DATE}_c-$DBID-${BACKUP_DATE}-00.${UPPER_SID}
echo $CONTROLFILE

if [ ! -d ${RESTORE_LOC}/${ORACLE_SID} ]; then
    mkdir -p ${RESTORE_LOC}/${ORACLE_SID}
fi

cat >$ORACLE_HOME/dbs/init${ORACLE_SID}.ora<<EOF
db_name=${ORACLE_SID}
control_files=${RESTORE_LOC}/${ORACLE_SID}/contorl01.ctl
compatible='11.2.0.4.0'
EOF

#启动nomount
$ORACLE_HOME/bin/sqlplus -s / as sysdba <<EOF
startup force nomount;
exit;
EOF

#创建恢复控制文件脚本
cat > $MOUNTCMD <<EOF
run{
restore controlfile from "$CONTROLFILE";
sql 'alter database mount';
}
EOF

#恢复控制文件并mount
$ORACLE_HOME/bin/rman target / cmdfile $MOUNTCMD
if [ $? != 0 ]; then
  echo "error mount"
  exit 1;
fi

#设置until条件
echo -e "untiltime is : $UNTILTIME"

if [  ${#UNTILTIME} -gt 0 ]; then #没有指定恢复时间
  UNTIL_CON="set until time '$UNTILTIME';"
elif [ ${#UNTILSEQ} -gt 0 ]; then
  UNTIL_CON="set until sequence $UNTILSEQ;"
else
  UNTIL_CON=""
fi
echo $UNTIL_CON

cat > $RECVCMD <<EOF
run{
catalog  start with "$RMANBAK_LOC" noprompt;
crosscheck backup;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired archivelog all;
sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
$UNTIL_CON
set newname for database to '$RESTORE_LOC/$ORACLE_SID/%U';
restore database;
switch datafile all;
switch tempfile all;
recover database;
}
EOF

if [ ! -d /tmp/log ]; then
  mkdir /tmp/log
fi
mv /tmp/*.log /tmp/log
$ORACLE_HOME/bin/rman target / cmdfile $RECVCMD  >$LOGFILE

#change online redo log to new location

# 新的目标目录前缀
REDO_LOC="${RESTORE_LOC}/${ORACLE_SID}"

# 输出 SQL 文件
SQL_SCRIPT="rename_redo.sql"
> "$SQL_SCRIPT"  # 清空/新建文件

# 从数据库读取 redo 路径并生成 SQL
sqlplus -s / as sysdba <<EOF | grep "^/" | while read -r old_path
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SET TRIMSPOOL ON
SELECT MEMBER FROM V\$LOGFILE;
EXIT
EOF
do
  filename=$(basename "$old_path")
  new_path="${REDO_LOC}/${filename}"
  echo "ALTER DATABASE RENAME FILE '$old_path' TO '$new_path';" >> "$SQL_SCRIPT"
done

sqlplus -s / as sysdba <<EOF
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SPOOL clear_redo.sql

SELECT 'ALTER DATABASE CLEAR LOGFILE GROUP ' || GROUP# || ';'
FROM   V\$LOG
ORDER  BY GROUP#;

SPOOL OFF
EOF


$ORACLE_HOME/bin/sqlplus -s <<EOF >$SQLLOG
conn / as sysdba
start rename_redo.sql
start clear_redo.sql
alter database open resetlogs;
$TESTSQL
exit;
EOF

more $SQLLOG
[oracle@testdb1 scripts]$ ./auto_rman_test.sh
/u02/rmanbackup/auto_20250529_c-3842787173-20250529-00.RISK
ORACLE instance started.

Total System Global Area  229683200 bytes
Fixed Size                  2251936 bytes
Variable Size             171967328 bytes
Database Buffers           50331648 bytes
Redo Buffers                5132288 bytes

Recovery Manager: Release 11.2.0.4.0 - Production on Thu May 29 16:04:57 2025

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RISK (not mounted)

RMAN> run{
2> restore controlfile from "/u02/rmanbackup/auto_20250529_c-3842787173-20250529-00.RISK";
3> sql 'alter database mount';
4> }
5>
Starting restore at 29-MAY-25
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=170 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u02/testdata/risk/contorl01.ctl
Finished restore at 29-MAY-25

sql statement: alter database mount
released channel: ORA_DISK_1

Recovery Manager complete.
untiltime is :

mv: cannot move ‘/tmp/ntpdate.log’ to ‘/tmp/log/ntpdate.log’: Operation not permitted
ALTER DATABASE CLEAR LOGFILE GROUP 1;
ALTER DATABASE CLEAR LOGFILE GROUP 2;
ALTER DATABASE CLEAR LOGFILE GROUP 3;
ALTER DATABASE CLEAR LOGFILE GROUP 4;
ALTER DATABASE CLEAR LOGFILE GROUP 5;
ALTER DATABASE CLEAR LOGFILE GROUP 6;
ALTER DATABASE CLEAR LOGFILE GROUP 7;


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


Database altered.


  COUNT(*)
----------
      1322                        =》恢复成功,执行了测试sql

[oracle@testdb1 scripts]$ cd /u02/testdata/
[oracle@testdb1 testdata]$ ls -l
total 4
drwxr-xr-x 2 oracle oinstall 4096 May 29 16:08 risk
[oracle@testdb1 testdata]$ ls risk
contorl01.ctl                data_D-RISK_TS-SYSTEM_FNO-1     data_D-RISK_TS-UNDOTBS1_FNO-3  redo02.log  redo05.log
data_D-RISK_TS-SOE_FNO-6     data_D-RISK_TS-TBS_SPLEX_FNO-5  data_D-RISK_TS-USERS_FNO-4     redo03.log  redo06.log
data_D-RISK_TS-SYSAUX_FNO-2  data_D-RISK_TS-TEMP_FNO-1       redo01.log                     redo04.log  redo07.log
[oracle@testdb1 testdata]$

5 测试完成后清理

恢复测试完成后,测试sql执行正常,说明备份正常。
可以清理测试库。
把测试库关闭,删除测试库文件。

如果是在同一个服务器恢复测试,测试完成后,还需要把
spfile文件mv到原来的名字。

cd $ORACLE_HOME/dbs
mv spfile${ORACLE_SID}.ora.def spfile${ORACLE_SID}.ora

6. 排错

[oracle@testdb1 scripts]$ ./auto_rman_test.sh
/u02/rmanbackup/auto_20250517_c-4230975025-20250517-10.CTP
./auto_rman_test.sh: line 43: /u01/app/oracle/product/11.2.0/dbhome_1/dbs/initctp.ora: No such file or directory
./auto_rman_test.sh: line 50: /u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus: No such file or directory
./auto_rman_test.sh: line 64: /u01/app/oracle/product/11.2.0/dbhome_1/bin/rman: No such file or directory
error mount
[oracle@testdb1 scripts]$ env|grep HOME

ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
[oracle@testdb1 scripts]$

分析: auto_rman_test.sh中$ORACLE_HOME设置错误。修正后重新执行正常。

7 部署自动恢复测试

数据库服务器: crontab设置把rman备份上传到测试服务器,
测试服务器: crontab设置rman自动恢复。

这样可以自动测试当天备份,确认数据库备份是可用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础设计模式——结构型模式 - 代理模式

第三部分&#xff1a;结构型模式 - 代理模式 (Proxy Pattern) 在学习了享元模式如何通过共享对象来优化资源使用后&#xff0c;我们来探讨结构型模式的最后一个模式——代理模式。代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。 核心思想&#xff1a;为其…

架构意识与性能智慧的双重修炼

架构意识与性能智慧的双重修炼 ——现代软件架构师的核心能力建设指南 作者:蓝葛亮 🎯引言 在当今快速发展的技术环境中,软件架构师面临着前所未有的挑战。随着业务复杂度的不断增长和用户对性能要求的日益严苛,如何在架构设计中平衡功能实现与性能优化,已成为每个技术…

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent&#xff0c;此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(一)

一、引言 ** 在当今分布式系统大行其道的技术时代&#xff0c;消息队列作为分布式系统的关键组件&#xff0c;起着举足轻重的作用。它就像是一个可靠的信使&#xff0c;在不同的系统模块、服务之间传递信息&#xff0c;让各个部分能够高效、稳定地协同工作。消息队列能够实现系…

汽车EPS系统的核心:驱动芯片的精准控制原理

随着科技的飞速发展&#xff0c;电机及其驱动技术在现代工业、汽车电子、家用电器等领域扮演着越来越重要的角色。有刷马达因其结构简单、成本低廉、维护方便等优点&#xff0c;在市场上占据了一定的份额。然而&#xff0c;为了充分发挥有刷马达的性能&#xff0c;一款高效能、…

【Linux网络编程】传输层协议TCP,UDP

目录 一&#xff0c;UDP协议 1&#xff0c;UDP协议的格式 2&#xff0c;UDP的特点 3&#xff0c;面向数据报 4&#xff0c;UDP的缓冲区 5&#xff0c;UDP使用注意事项 6&#xff0c;基于UDP的应用层协议 二&#xff0c;对于报文的理解 三&#xff0c;TCP协议 1&…

基于Geotools的Worldpop世界人口tif解析-以中国2020年数据为例

目录 前言 一、Worldpop数据简介 1、数据来源 2、QGIS数据展示 3、元数据展示 二、GeoTools人口解析 1、Maven依赖引入 2、Tif人口计算 三、总结 前言 在当今数字化与信息化飞速发展的时代&#xff0c;地理空间数据的分析与应用已然成为诸多领域研究与决策的关键支撑。…

Unity3D仿星露谷物语开发55之保存游戏到文件

1、目标 将游戏保存到文件&#xff0c;并从文件中加载游戏。 Player在游戏中种植的Crop&#xff0c;我们希望保存到文件中&#xff0c;当游戏重新加载时Crop的GridProperty数据仍然存在。这次主要实现保存地面属性&#xff08;GridProperties&#xff09;信息。 我们要做的是…

【无标题】C++23新特性:支持打印volatile指针

文章目录 前言背景与问题C23的解决方案实现原理使用场景硬件开发多线程调试 总结 前言 在C开发中&#xff0c;volatile关键字常用于修饰变量&#xff0c;以确保编译器不会对这些变量进行优化&#xff0c;从而保证程序能够正确地与硬件交互或处理多线程环境下的特殊变量。然而&…

【第4章 图像与视频】4.2 图像的缩放

文章目录 前言示例-图像的缩放在 Canvas 边界之外绘制图像 前言 在上节中读者已经学会了如何使用 drawImage() 方法将一幅未经缩放的图像绘制到 canvas 之中。现在我们就来看看如何用该方法在绘制图像的时候进行缩放 示例-图像的缩放 未缩放的图像&#xff0c;显示图形原有大…

敏捷开发中如何避免迭代失控

在敏捷开发过程中避免迭代失控&#xff0c;需要实施合理规划迭代目标、明确职责分工、强化沟通机制、严格控制需求变更等措施&#xff0c;其中合理规划迭代目标尤为重要&#xff0c;它确保团队聚焦于关键任务&#xff0c;避免因目标不清晰而导致的迭代混乱和失控。 一、合理规划…

Python开发AI智能体(九)———构建RAG对话应用

前言 上篇文章我们介绍了如何在Langchain中构建代理 这篇文章我们将带领大家构建一个RAG对话应用 一、什么是RAG对话应用&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;技术通过从外部知识库检索相关信息&#xff0c;并将…

NW907NW918美光固态闪存NW920NW930

NW907NW918美光固态闪存NW920NW930 技术解析&#xff1a;美光NW系列固态闪存的核心突破 美光NW907、NW918、NW920、NW930四款固态闪存产品&#xff0c;代表了当前存储技术的顶尖水平。其核心创新在于G9 NAND架构的深度优化&#xff0c;采用更先进的5纳米制程工艺&#xff0c;…

【Deepseek 学网络互联】跨节点通信global 和节点内通信CLAN保序

Clan模式下的源端保序与Global类似&#xff0c;目的端保序则退化成通道保序&#xff0c;此时仅支持网络单路径保序。”这里的通道保序怎么理解&#xff1f; 用户可能正在阅读某种硬件架构文档&#xff08;比如NVIDIA的NVLink或InfiniBand规范&#xff09;&#xff0c;因为"…

9.5 Q1 | 北京协和医学院GBD发文 | 1990-2021 年全球、区域和国家心力衰竭负担及其根本原因

1.第一段-文章基本信息 文章题目&#xff1a;Global, regional, and national burden of heart failure and its underlying causes, 1990-2021: results from the global burden of disease study 2021 中文标题&#xff1a;1990-2021 年全球、区域和国家心力衰竭负担及其根本…

根据Cortex-M3(包括STM32F1)权威指南讲解MCU内存架构与如何查看编译器生成的地址具体位置

首先我们先查看官方对于Cortex-M3预定义的存储器映射 1.存储器映射 1.1 Cortex-M3架构的存储器结构 内部私有外设总线&#xff1a;即AHB总线&#xff0c;包括NVIC中断&#xff0c;ITM硬件调试&#xff0c;FPB, DWT。 外部私有外设总线&#xff1a;即APB总线&#xff0c;用于…

MCP入门实战(极简案例)

MCP简介 MCP(Model Context Protocol,模型上下文协议)2024年11月底由 Antbropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。 Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使AI模型与API无缝交互,而Al Agent是一个…

Cursor从入门到精通实战指南(一):开始使用Cursor

一、简介与核心优势 Cursor是一款基于VSCode开发的AI编程工具&#xff0c;集成了GPT-4、Claude 3.5等先进大语言模型&#xff0c;支持代码补全、生成、重构、调试等功能。其核心优势包括&#xff1a; 高效协作&#xff1a;通过自然语言对话实现代码开发&#xff0c;支持跨文件…

计算机组成原理——cache

3.4cache 出自up主Beokayy传送门 1.局部性原理 时间局部性&#xff1a; 在最近的未来要用到的信息&#xff0c;很可能是现在正在使用的信息&#xff0c;因为程序中存在循环。 空间局部性&#xff1a; 在最近的未来要用到的信息&#xff0c;很可能与现在正在使用的信息在存储…

EasyExcel使用导出模版后设置 CellStyle失效问题解决

EasyExcel使用导出模版后在CellWriteHandler的afterCellDispose方法设置 CellStyle失效问题解决方法 问题描述&#xff1a;excel 模版塞入数据后&#xff0c;需要设置单元格的个性化设置时失效&#xff0c;本文以设置数据格式为例&#xff08;设置列的数据展示时需要加上千分位…