12c RAC+ASM恢復到12c 單機文件系統

背景說明

有一套Oracle 12c RAC環境由其他供應商實施RMAN備份,但多年時間過去一直沒有實施恢復測試。客戶也沒有找到當年驗收資料有針對恢復的手順書,於是拜託我針對現有備份實施一次恢復測試並留下一份指導手順書。

實施記錄

鑑於客戶信息的保密性,如下是測試環境模擬。

1. 檢查備份

通過備份檢查,我們可以獲取到一些有用的信息,參考如下:
實例名稱:RACDB
DBID號碼:1038706910
在這裏插入圖片描述

2. 恢復服務器環境構築

創建恢復服務器,設置大於原庫數據大小的磁盤容量。設置相同的服務器主機名參照原服務器系統及軟件版本和位數配置恢復的服務器,避免恢復過程中版本差異導致的問題;
ORACLE用戶權限與號碼參考本番,否則掛載NFS備份盤會有權限問題
<過程省略>

3. 掛載本番NFS備份盤

通過掛載NFS備份盤可以減少拷貝帶來的等待時間與磁盤空間,許多客戶的數據動不動就是TB級別拷貝太耗時。

mount -t nfs,_netdev -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600 192.168.0.99:/home/nfs /backups

在這裏插入圖片描述

4. 創建相關的目錄

mkdir -p /opt/app/oracle/admin/RACDB/{adump,bdump,cdump,dpdump,pfile,udump}
mkdir -p /opt/app/oracle/oradata/RACDB
mkdir -p /opt/app/oracle/archive/RACDB

5. 手工編寫PFILE文件

鑑於原有的RAC SPFILE內容與恢復服務器不一樣,因此手工創建PFILE文件。

vi /opt/app/oracle/product/12.1.0/dbhome_1/dbs/initRACDB.ora
## pfile參考
*.audit_file_dest='/opt/app/oracle/admin/RACDB/adump'
*.audit_sys_operations=TRUE
*.audit_trail='NONE'
*.cluster_database=false
*.compatible='12.1.0.2.0'
*.control_files='/opt/app/oracle/oradata/RACDB/control01.ctl','/opt/app/oracle/oradata/RACDB/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_files=500
*.db_name='RACDB'
*.diagnostic_dest='/opt/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
*.instance_number=1
*.log_archive_dest_1='LOCATION=/opt/app/oracle/archive/RACDB/'
*.log_archive_format='%t_%s_%r.dbf'
*.log_checkpoints_to_alert=TRUE
*.memory_max_target=7516192768
*.memory_target=7516192768
*.nls_language='ENGLISH'
*.nls_territory='HONG KONG'
*.open_cursors=500
*.processes=500
*.recyclebin='off'
*.remote_login_passwordfile='exclusive'
*.sessions=955
*.thread=1
*.undo_tablespace='UNDOTBS1'
*.local_listener=''

6. 新文件路徑變更構築

異機恢復時,我們的原數據庫是ASM環境,恢復服務器是文件系統。兩者不一樣,因此需要通過SET NEWNAME方式實現指定新位置。
不可以採用DG時的db_file_name_convert參數實現自動修改,必須要用SET NEWNAME方式

select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;

在這裏插入圖片描述
通過替換方式構造RMAN恢復腳本:

run {
SET NEWNAME FOR DATAFILE 1 to '/opt/app/oracle/oradata/RACDB/system01.dbf';
SET NEWNAME FOR DATAFILE 2 to '/opt/app/oracle/oradata/RACDB/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/opt/app/oracle/oradata/RACDB/undotbs101.dbf';
SET NEWNAME FOR DATAFILE 4 to '/opt/app/oracle/oradata/RACDB/undotbs201.dbf';
SET NEWNAME FOR DATAFILE 5 to '/opt/app/oracle/oradata/RACDB/users01.dbf';
restore database;
switch datafile all;
}

7. 新REDOFILE路徑變更構築

select 'alter database rename file '''||member||q'[' to '/opt/app/oracle/oradata/RACDB/redo';]' from v$logfile;

在這裏插入圖片描述

8. RMAN異機恢復

rman target /
# 設置DBID號碼信息
set dbid=1038706910
# 通過pfile啓動到nomount狀態
startup nomount pfile ='/opt/app/oracle/product/12.1.0/dbhome_1/dbs/initRACDB.ora';
# 恢復ControlFile控制文件
restore controlfile from '/backups/RACDB.c-1038706910-20200530-01.conf';
# 數據庫啓動到mount狀態
alter database mount;
# 註冊RMAN備份信息
catalog start with '/backups/';
# restore database還原數據文件
run {
SET NEWNAME FOR DATAFILE 1 to '/opt/app/oracle/oradata/RACDB/system01.dbf';
SET NEWNAME FOR DATAFILE 2 to '/opt/app/oracle/oradata/RACDB/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/opt/app/oracle/oradata/RACDB/undotbs101.dbf';
SET NEWNAME FOR DATAFILE 4 to '/opt/app/oracle/oradata/RACDB/undotbs201.dbf';
SET NEWNAME FOR DATAFILE 5 to '/opt/app/oracle/oradata/RACDB/users01.dbf';
restore database;
switch datafile all;
}
# recover database應用日誌文件
## "完整恢復" (鑑於有一些REDOFILE在ASM未取出來的且Archivelog也沒有取過來,無法做完整恢復)
recover database;
## 基於時間恢復
sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
recover database until time '2020-05-30 01:30:00';

# REDO FILE路徑變更
alter database rename file '+DATA01/RACDB/redo01.log' to '/opt/app/oracle/oradata/RACDB/redo01.log';
alter database rename file '+DATA01/RACDB/redo02.log' to '/opt/app/oracle/oradata/RACDB/redo02.log';
alter database rename file '+DATA01/RACDB/redo03.log' to '/opt/app/oracle/oradata/RACDB/redo03.log';
alter database rename file '+DATA01/RACDB/redo04.log' to '/opt/app/oracle/oradata/RACDB/redo04.log';
# 創建SPFILE文件
create spfile from pfile
# 啓動數據庫 (如果需要可以通過read only開庫檢查一下)
alter database open resetlogs;

9. 創建監聽服務

netca

在這裏插入圖片描述
<略>

10. TEMP表空間修復

create temporary tablespace temp02 tempfile '/opt/app/oracle/oradata/RACDB/temp02.dbf' size 10M autoextend on next 100M maxsize 30G;
alter database default temporary tablespace temp02;
drop tablespace temp;
create temporary tablespace temp tempfile '/opt/app/oracle/oradata/RACDB/temp01.dbf' size 100M autoextend on next 100M maxsize 30G;
alter database default temporary tablespace temp;
drop tablespace temp02;

11. 檢查數據庫狀態

# 檢查數據庫啓動狀態
select dbid, open_mode from v$database;
# 檢查數據文件狀態
select status,enabled, name, bytes/1024/1024 file_size from v$datafile;
# 檢查臨時文件狀態
select status,enabled, name, bytes/1024/1024 file_size from v$tempfile;
# 檢查日誌文件狀態
select * from v$logfile;
# 檢查無效對象狀態
col vname format a60
select o.object_type,o.status,o.owner||'.'||o.object_name vname from dba_objects o join dba_users u on o.owner = u.username 
where u.default_tablespace like 'USER%' and o.status ='INVALID';

常見問題

  1. 恢復控制文件出現如下信息:
RMAN> restore controlfile from '/backups/RACDB.c-1038706910-20200530-00.conf';

Starting restore at 30-MAY-20
using channel ORA_DISK_1

channel ORA_DISK_1: no AUTOBACKUP in 7 days found
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 05/30/2020 22:48:16
RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece

解決方案:/backups 的備份文件權限問題引起,解決權限問題即可。

2.sys用戶登錄會報 ORA-01017
解決方案:手工創建密碼文件

# 查詢密碼文件是否存在
select * from v$pwfile_users;
# 創建密碼文件
orapwd file='/opt/app/oracle/product/12.1.0/dbhome_1/dbs/orapwRACDB' password=oracle entries=5 force=y
  1. 業務測試過程中,數據庫會出現自動關閉。查詢日誌反饋如下信息:
ORA-00600: internal error code,arguments:[17090], [] , []

解決方案:TEMP文件不會在RMAN恢復過程被創建,我們必須要手工創建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章