Oracle RMAN自動恢復測試腳本

說明

此恢復測試腳本,基于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 $CONTROLFILEif [ ! -d ${RESTORE_LOC}/${ORACLE_SID} ]; thenmkdir -p ${RESTORE_LOC}/${ORACLE_SID}
ficat >$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 ]; thenecho "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 ]; thenUNTIL_CON="set until sequence $UNTILSEQ;"
elseUNTIL_CON=""
fi
echo $UNTIL_CONcat > $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;
}
EOFif [ ! -d /tmp/log ]; thenmkdir /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
dofilename=$(basename "$old_path")new_path="${REDO_LOC}/${filename}"echo "ALTER DATABASE RENAME FILE '$old_path' TO '$new_path';" >> "$SQL_SCRIPT"
donesqlplus -s / as sysdba <<EOF
SET HEADING OFF
SET FEEDBACK OFF
SET PAGESIZE 0
SPOOL clear_redo.sqlSELECT '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;
EOFmore $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 bytesRecovery Manager: Release 11.2.0.4.0 - Production on Thu May 29 16:04:57 2025Copyright (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=DISKchannel 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-25sql statement: alter database mount
released channel: ORA_DISK_1Recovery 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 HOMEORACLE_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.pswp.cn/pingmian/83448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83448.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從Java的JDK源碼中學設計模式之裝飾器模式

裝飾器模式是一種極具彈性的結構型設計模式&#xff0c;它允許我們通過組合的方式動態擴展對象功能而無需修改原有結構。本文將通過JDK源碼中的實際應用和通俗易懂的代碼示例&#xff0c;帶你深入了解這一強大模式的精髓。 裝飾器模式核心原理 裝飾器模式的核心思想&#xff…

調教 DeepSeek - 輸出精致的 HTML MARKDOWN

【序言】 不知道是不是我閑的蛋疼&#xff0c;對百度AI 和 DeepSeek 的回答都不太滿意。 DeepSeek 回答句子的引用鏈接&#xff0c;始終無法準確定位。有時鏈接只是一個域名&#xff0c;有時它給的鏈接是搜索串如: baidu.com/?q"搜索內容"。 百度AI 回答句子的引用…

第1章_數據分析認知_知識點筆記

來自&#xff1a;數據分析自學課程-戴戴戴師兄 逐字稿&#xff1a;【課程4.0】第1章_分析認知_知識點筆記 【課程4.0】第1章 分析認知 知識點總結 一、數據分析的本質認知 數據分析是什么&#xff1f; 不是酷炫看板、復雜模型或升值秘籍&#xff0c;而是認知世界的基礎方法。…

【從0-1的HTML】第2篇:HTML標簽

文章目錄 1.標題標簽2.段落標簽3.文本標簽brbstrongsubsup 4.超鏈接標簽5.圖片標簽6.表格標簽7.列表標簽有序列表ol無序列表ul定義列表dl 8.表單標簽9.音頻標簽10.視頻標簽11.HTML元素分類塊級元素內聯元素 12.HTML布局13.內聯框架13.內聯框架 1.標題標簽 標題標簽&#xff1a…

快速排序(Quick Sort)算法詳解(遞歸與非遞歸)

引言 在計算機科學中&#xff0c;排序算法是最基礎且重要的算法之一。快速排序&#xff08;Quick Sort&#xff09;作為一種高效的排序算法&#xff0c;在實際應用中被廣泛使用。平均時間復雜度為 (O(n log n))&#xff0c;最壞情況下為 (O(n^2))。本文將詳細介紹快速排序算法…

修改 vscode 左側導航欄的文字大小 (更新版)

新增, 個人常用 按 Ctrl Shift P 打開命令面板 輸入并選擇 : Developer: Toggle Developer Tools 打開開發者工具。 1. 起因&#xff0c; 目的: 問題&#xff1a; vscode 左側的文字太小了&#xff01;&#xff01;&#xff01;我最火的一篇文章&#xff0c;寫的就是這個…

Kerberos面試內容整理-Kerberos 的配置與排障

正確配置 Kerberos 對其正常工作至關重要。在Linux/Unix環境下,Kerberos配置通常通過編輯配置文件(例如 /etc/krb5.conf)完成。其中指定了Realm名稱、KDC和管理員服務器地址、默認域到Realm的映射等參數。管理員需要在KDC端初始化數據庫并創建主體(可以使用 kadmin 等工具添…

Windows + CPU也能跑時序預測:TSLib框架快速上手與踩坑避雷

在時序預測領域,選擇一個成熟的框架往往能讓我們事半功倍。最近接手了一個緊急的時序預測項目,經過一番調研后,我選擇了TSLib(Time-Series-Library)這個優秀的開源框架來快速搭建整個預測流程。 由于開發環境限制在Windows平臺且沒有GPU支持,整個部署過程還是遇到了一些…

從 0 到 1:用 Trae 插件 Builder 模式開發端午包粽子小游戲

? 前言 Trae插件獲取&#xff1a;https://www.trae.com.cn/plugin 在編程的世界里&#xff0c;效率就是生命。我們開發者常常為了一個項目的搭建&#xff0c;重復著創建文件夾、初始化項目配置、編寫樣板代碼等一系列繁瑣的操作&#xff0c;耗費了大量的時間和精力。而如今…

React-native之Flexbox

本文總結: 我們學到了 React Native 的 Flexbox 布局&#xff0c;它讓寫樣式變得更方便啦&#xff01;&#x1f60a; Flexbox 就像一個有彈性的盒子&#xff0c;有主軸和交叉軸&#xff08;行或列&#xff09;。 在 RN 里寫樣式要用 StyleSheet.create 對象&#xff0c;屬性名…

Leetcode 1336. 每次訪問的交易次數

1.題目基本信息 1.1.題目描述 表: Visits ---------------------- | Column Name | Type | ---------------------- | user_id | int | | visit_date | date | ---------------------- (user_id, visit_date) 是該表的主鍵(具有唯一值的列的組合) 該表的每行表示 use…

騰訊云國際版和國內版賬戶通用嗎?一樣嗎?為什么?

在當今全球化的數字化時代&#xff0c;云計算服務成為眾多企業和個人拓展業務、存儲數據的重要選擇。騰訊云作為國內領先的云服務提供商&#xff0c;其國際版和國內版備受關注。那么&#xff0c;騰訊云國際版和國內版賬戶是否通用&#xff1f;它們究竟一樣嗎&#xff1f;背后又…

解鎖Java多級緩存:性能飛升的秘密武器

一、引言 文末有彩蛋 在當今高并發、低延遲的應用場景中&#xff0c;傳統的單級緩存策略往往難以滿足性能需求。隨著系統規模擴大&#xff0c;數據訪問的瓶頸逐漸顯現&#xff0c;如何高效管理緩存成為開發者面臨的重大挑戰。多級緩存架構應運而生&#xff0c;通過分層緩存設…

Android Kotlin 算法詳解:鏈表相關

前言 &#x1f60a; 在 Android 開發中&#xff0c;算法與數據結構是基本功之一&#xff0c;而鏈表&#xff08;Linked List&#xff09;作為常見的數據結構&#xff0c;經常出現在各類面試題與實際業務場景中。本文將以 Android Kotlin 為語言&#xff0c;結合 LeetCode 上的…

Blinko智能筆記系統實現跨平臺同步與隱私保護的完整技術方案解析

文章目錄 前言1. Docker Compose一鍵安裝2. 簡單使用演示3. 安裝cpolar內網穿透4. 配置公網地址5. 配置固定公網地址 推薦 ? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。 點擊跳轉到網站 前言 是否…

【小紅書】API接口,獲取筆記列表

小紅書筆記列表API接口詳解 - 深圳小于科技助力高效數據對接 深圳小于科技&#xff08;官網&#xff1a;https://www.szlessthan.com&#xff09;提供的小紅書筆記列表API接口&#xff0c;幫助開發者快速獲取小紅書平臺筆記數據&#xff0c;實現高效內容管理與分析。 接口概述…

Qwen2.5-VL 損失函數

Qwen2.5-VL 損失函數 flyfish 文章名稱鏈接深入理解交叉熵損失 CrossEntropyLoss - 概率基礎鏈接深入理解交叉熵損失 CrossEntropyLoss - 對數鏈接深入理解交叉熵損失 CrossEntropyLoss - 概率分布鏈接深入理解交叉熵損失 CrossEntropyLoss - 信息論&#xff08;交叉熵&#…

LeetCode 1524. 和為奇數的子數組數目

好的&#xff01;讓我們詳細解釋 LeetCode 1524. 和為奇數的子數組數目 這道題的思路和解法。 題目&#xff1a; https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/ 題目分析 問題描述&#xff1a; 給定一個整數數組 arr&#xff0c;返回其中和…

kafka學習筆記(三、消費者Consumer使用教程——消費性能多線程提升思考)

1.簡介 KafkaConsumer是非線程安全的&#xff0c;它定義了一個acquire()方法來檢測當前是否只有一個線程在操作&#xff0c;如不是則會拋出ConcurrentModifcationException異常。 acquire()可以看做是一個輕量級鎖&#xff0c;它僅通過線程操作計數標記的方式來檢測線程是否發…

百度蜘蛛池的作用是什么?技術@baidutopseo

百度蜘蛛池的作用 百度蜘蛛池是一種用于集中管理和調度百度搜索引擎蜘蛛&#xff08;爬蟲&#xff09;的技術工具。其主要目的是優化網站內容的收錄效率&#xff0c;幫助搜索引擎更高效地發現和抓取網頁內容。技術baidutopseo 提升收錄效率 通過集中大量百度蜘蛛的訪問請求&…