Oracle RMAN備份異機還原

RMAN備份

備份策略

  1. 每週日2點數據庫全備
  2. 每天4點備份歸檔

以下僅爲備份腳本, 沒有定時任務腳本

準備工作

查看數據庫是否處於歸檔模式:

archive log list;
  • 1

進入sqlpuls: sqlplus / as sysdba

如果不是處於歸檔模式, 開啓歸檔模式:

> shutdown immediate    # 關閉數據庫
> startup mount     # 啓動實例並掛載數據庫
> alter database archivelog;    # 更改數據庫爲歸檔模式
> alter database open;      # 打開數據庫
> alter system archive log start;   # 啓用自動歸檔

注意需要設置歸檔日誌大小, 並及時清理歸檔日誌, 防止佔滿歸檔日誌空間

檢查AUTOBACKUP相關配置:

RMAN> show all;

使用目標數據庫控制文件替代恢復目錄
db_unique_name 爲 ORCL 的數據庫的 RMAN 配置參數爲:
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 6 BACKUP TYPE TO BACKUPSET;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'E:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\SNCFORCL.ORA'; # default
  • controlfile處於off, controlfile format處於默認狀態(如果不處於這個狀態, 執行下面的腳本時, 會將controlfile備份出的文件當做冗餘刪除)
  1. CHANNEL DEVICE TYPE DISK等也需保持默認或者不配置(否則, 執行腳本時會去配置的目錄下檢查冗餘, 而不是在備份輸出目錄下檢查)

上面兩條恢復默認執行的命令是(詳見:Oracle rman configure 常用配置):

> configure controlfile autobackup clear;
> configure controlfile autobackup format for device type disk clear;
> configure CHANNEL DEVICE TYPE DISK clear;

全備份腳本

run {
	CONFIGURE RETENTION POLICY TO REDUNDANCY = 2;
	CONFIGURE DEVICE TYPE DISK PARALLELISM 6;
	CONFIGURE DEFAULT DEVICE TYPE TO DISK;
	backup as compressed backupset database format 'E:\OracleBackup\FULLBAK_%d_%T_%s_%p.DBFILE'; 
	backup current controlfile format 'E:\OracleBackup\%d.%s.%p.%T.CTL';
	backup spfile format 'E:\OracleBackup\%d.%s.%p.%T.SPFILE';
	crosscheck backup;
	crosscheck copy;
	sql "alter system archive log current";
	backup as COMPRESSED backupset archivelog all not backed up format 'E:\OracleBackup\%d.%s.%p.%T.ARC';
	crosscheck archivelog all;
	delete noprompt archivelog all completed before 'sysdate-3';
	delete noprompt expired backup;
	delete noprompt obsolete;
}
exit;

增量備份腳本

run {
	CONFIGURE RETENTION POLICY TO REDUNDANCY = 2;
	CONFIGURE DEVICE TYPE DISK PARALLELISM 6;
	CONFIGURE DEFAULT DEVICE TYPE TO DISK;
	backup current controlfile format 'E:\OracleBackup\%d.%s.%p.%T.CTL';
	backup spfile format 'E:\OracleBackup\%d.%s.%p.%T.SPFILE';
	crosscheck backup;
	crosscheck copy;
	sql "alter system archive log current";
	backup as COMPRESSED backupset archivelog all not backed up format 'E:\OracleBackup\%d.%s.%p.%T.ARC';
	crosscheck archivelog all;
	delete noprompt archivelog all completed before 'sysdate-3';
	delete noprompt expired backup;
	delete noprompt obsolete;
}
exit;

僅僅是把全庫備份中的數據文件備份刪掉

RMAN異機恢復

這裏模擬的場景是在另一臺服務器上, 並且數據庫安裝目錄與原安裝目錄不同, 但是數據庫版本相同(11.2.0.4).

恢復步驟

將上面的備份文件複製到恢復服務器上.

  1. 進入rman :
rman target /
  1. 關閉目標數據庫:
shutdown immediate
  1. 創建原始參數文件

任意路徑均可, 下面會用到.

*.audit_file_dest='C:\app\Administrator\admin\orcl\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='C:\app\Administrator\oradata\orcl\control01.ctl','C:\app\Administrator\oradata\orcl\control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.diagnostic_dest='C:\app\Administrator'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_dest_1='LOCATION=C:\app\arch'
*.memory_target=1234173952
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

注意與數據庫安裝路徑相對應, 可以參照當前數據庫的"ORACLE_HOME\admin\orcl\pfile\init.ora.xxxx"和備份的SPFILE進行編寫

  1. 加載參數文件
startup nomount pfile="C:\initparam\pfile.ora"
  •  

這個pfile路徑就是上面的參數文件路徑

  1. 加載控制文件
restore controlfile from "C:\OracleBackup\ORCL.16.1.20181226.CTL";
  •  
  1. 掛載數據庫
alter database mount;
  •  
  1. 將備份集信息重新導入到當前控制文件中
catalog start with "C:\OracleBackup\";
  •  

這時可能會報錯:

RMAN-12010: 自動通道分配初始化失敗
RMAN-06189: 當前 DBID 1010101010 與目標裝載數據庫 (3030303030) 不匹配

需要重新配置DBID(如果不報錯, 不需要執行下面7.1, 7.2的步驟)

7.1 設置DBID

shutdown immediate
set dbid=3030303030
exit

注意, exit是必須的, 需要重新進入rman

7.2 重新執行之前步驟

> startup nomount pfile="C:\initparam\pfile.ora"
> alter database mount;
> catalog start with "C:\OracleBackup\";
  1. 檢查備份
crosscheck backup;
  1. 轉儲文件
restore database;
  •  

由於數據庫安裝路徑不同, 會導致這裏報錯:

通道 ORA_DISK_1: ORA-19870: 還原備份片段 C:\ORACLEBACKUP\FULLBAK_ORCL_20181226_4_1.DBFILE 時出錯
ORA-19504: 無法創建文件"E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF"
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

通道 ORA_DISK_2: ORA-19870: 還原備份片段 C:\ORACLEBACKUP\FULLBAK_ORCL_20181226_5_1.DBFILE 時出錯
ORA-19504: 無法創建文件"E:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF"
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

通道 ORA_DISK_3: ORA-19870: 還原備份片段 C:\ORACLEBACKUP\FULLBAK_ORCL_20181226_1_1.DBFILE 時出錯
ORA-19504: 無法創建文件"E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF"
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

通道 ORA_DISK_4: ORA-19870: 還原備份片段 C:\ORACLEBACKUP\FULLBAK_ORCL_20181226_3_1.DBFILE 時出錯
ORA-19504: 無法創建文件"E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF"
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

通道 ORA_DISK_5: ORA-19870: 還原備份片段 C:\ORACLEBACKUP\FULLBAK_ORCL_20181226_2_1.DBFILE 時出錯
ORA-19504: 無法創建文件"E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF"
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

故障轉移到上一個備份

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: restore 命令 (在 12/26/2018 11:04:38 上) 失敗
RMAN-06026: 有些目標沒有找到 - 終止還原
RMAN-06023: 沒有找到數據文件5的副本來還原
RMAN-06023: 沒有找到數據文件4的副本來還原
RMAN-06023: 沒有找到數據文件3的副本來還原
RMAN-06023: 沒有找到數據文件2的副本來還原
RMAN-06023: 沒有找到數據文件1的副本來還原

這時需要在restore之前制定新的位置(根據報錯的路徑編輯下面指令):

 run{
	allocate channel a1 type disk;
  allocate channel a2 type disk;
  set until sequence=4631 thread=1;
	set newname for datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF' to 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF';
	set newname for datafile "E:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF" to "C:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF";
	set newname for datafile "E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF" to "C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF";
	set newname for datafile "E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF" to "C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF";
	set newname for datafile "E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF" to "C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF";
	restore database;
	switch datafile all;
  release channel a1;
	release channel a2;
 }
  1. 指定恢復時間點
> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
> recover database until time '2018-12-26 11:00:00';

這裏可能會報錯, 屬於正常現象, 不需要處理

  1. 啓動數據庫

首先推出rman, 進入sqlplus

sqlplus / as sysdba
  •  

先只讀打開確認數據是否符合要求

alter database open read only; 
  •  

確認沒問題後, 關閉數據庫並重新打開:

> shutdown immediate
> create spfile from pfile='C:\initparam\pfile.ora';
> startup mount
> alter database open resetlogs;

在最後打開數據庫時可能會報錯:

alter database open resetlogs
*
第 1 行出現錯誤:
ORA-00344: 無法重新創建聯機日誌 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
ORA-27040: 文件創建錯誤, 無法創建文件
OSD-04002: 無法打開文件
O/S-Error: (OS 3) 系統找不到指定的路徑。

依然是由於異機恢復安裝路徑不一致導致的.

首先查看當前系統redo log路徑:

> select * from v$logfile;
  •  

會發現很多路徑都不正確, 需要修改:

 alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' to 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG';
 alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG' to 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG';
 alter database rename file 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG' to 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG';

再次執行打開數據庫命令, 還可能出錯:

SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出現錯誤:
ORA-00392: 日誌 1 (用於線程 1) 正被清除, 不允許操作
ORA-00312: 聯機日誌 1 線程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'

查看日誌文件狀態:

SQL> select group#,bytes/1024/1024||'M',status from v$log;

    GROUP# BYTES/1024/1024||'M'                      STATUS
---------- ----------------------------------------- ----------------
         1 50M                                       CLEARING_CURRENT
         3 50M                                       CLEARING
         2 50M                                       CLEARING

修復:

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;

數據庫已更改。

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 2;

數據庫已更改。

SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;

數據庫已更改。

再打開就可以了.

網上的例子, alter之後依舊不能打開, 由於oracle版本不一致導致的. 裏面給出的解決辦法是退出重新進入sqlplus, 並執行startup upgrade;然後執行升級腳本:@$ORACLE_HOME/rdbms/admin/catupgrd.sql;即可.

到此, 數據庫異機恢復成功!

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