使用 RMAN DUPLICATE ... FOR STANDBY 從主庫備份建立實體備庫,適用於主備儲存結構完全一致的環境。
ARCHIVELOG + FORCE LOGGINGDB_NAME 相同,DB_UNIQUE_NAME 不同-- 1. 強制日誌
ALTER DATABASE FORCE LOGGING;
-- 2. 建立 Standby Redo Log (SRL) - 建議每組比 Online Redo 多 1 組
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/oradata/ORCL/srl04a.log','/u02/oradata/ORCL/srl04b.log') SIZE 500M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/oradata/ORCL/srl05a.log','/u02/oradata/ORCL/srl05b.log') SIZE 500M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/oradata/ORCL/srl06a.log','/u02/oradata/ORCL/srl06b.log') SIZE 500M;
-- 3. 設定 Data Guard 參數 (PFILE/SPFILE)
*.db_unique_name=ORCL_PRI
*.log_archive_config='DG_CONFIG=(ORCL_PRI,ORCL_SB)'
*.log_archive_dest_1='LOCATION=/u01/arch/ORCL_PRI VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL_PRI'
*.log_archive_dest_2='SERVICE=ORCL_SB ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL_SB'
*.fal_server=ORCL_SB
*.standby_file_management=AUTO
scp $ORACLE_HOME/dbs/orapwORCL_PRI $ORACLE_HOME/dbs/orapwORCL_SBinitORCL_SB.ora):
db_name=ORCL
db_unique_name=ORCL_SB
control_files=('/u01/oradata/ORCL/control01.ctl','/u02/oradata/ORCL/control02.ctl')
log_archive_dest_1='LOCATION=/u01/arch/ORCL_SB VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL_SB'
fal_server=ORCL_PRI
standby_file_management=AUTO
export ORACLE_SID=ORCL_SB sqlplus / as sysdba STARTUP NOMOUNT PFILE=/u01/app/oracle/dbs/initORCL_SB.ora
rman target sys/xxx@ORCL_PRI auxiliary sys/xxx@ORCL_SB
RUN {
DUPLICATE TARGET DATABASE FOR STANDBY
DORECOVER
SPFILE
SET "db_unique_name"="ORCL_SB" COMMENT 'Is standby'
SET "log_archive_dest_2"="SERVICE=ORCL_PRI ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORCL_PRI"
SET "fal_server"="ORCL_PRI" COMMENT 'Is primary'
NOFILENAMECHECK; -- 路徑完全相同才能用
}
FOR STANDBY:建立實體備庫控制檔,不開啟資料庫。DORECOVER:Restore 完成後自動執行 Media Recovery (應用歸檔),但**不進入 Managed Recovery 模式**。NOFILENAMECHECK:主備路徑完全一致時跳過檔名轉換檢查。SPFILE:從主庫複製 SPFILE 並套用 SET 參數覆寫。ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
SELECT process, status, sequence# FROM v$managed_standby; SELECT max(sequence#) FROM v$archived_log WHERE applied='YES';
ALTER DATABASE OPEN READ ONLY;
| 錯誤 | 原因 | 解決 |
|---|---|---|
| RMAN-06023: no backup found | 備份集不可見或 TAG 錯誤 | 確認備份路徑掛載正確;指定 BACKUP LOCATION 或 UNTIL SCN |
| ORA-19504: failed to create file | 目標目錄不存在或權限不足 | 預先建立所有目錄,擁有者 oracle:oinstall |
| Standby 卡在 "waiting for log" | SRL 未建立或大小不足 | 主備同步建立足夠 SRL 組 (建議 Online Redo 組數 +1) |