Oracle Data Guard 部署

Oracle Data Guard 部署

适用版本:Oracle Database 19c 文档版本:v1.0 / 2026-07


1. 概述

Data Guard 提供灾备[1]:

类型

  • Physical Standby
  • Logical Standby
  • Snapshot Standby
  • Far Sync

详细见:Oracle Data Guard 容灾


2. 主库准备

2.1 归档模式

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

ARCHIVE LOG LIST;

2.2 Force Logging

ALTER DATABASE FORCE LOGGING;

2.3 Standby Redo Log

-- 组数 = (Redo 组数 + 1)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 
  ('/u01/oradata/stdby_redo11.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 
  ('/u01/oradata/stdby_redo12.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 
  ('/u01/oradata/stdby_redo13.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14 
  ('/u01/oradata/stdby_redo14.log') SIZE 200M;

2.4 参数

ALTER SYSTEM SET log_archive_config = 'dg_config=(orcl,orcldg)';
ALTER SYSTEM SET log_archive_dest_1 = 'location=use_db_recovery_file_dest valid_for=(all_logfiles,all_roles) db_unique_name=orcl';
ALTER SYSTEM SET log_archive_dest_2 = 'service=orcldg async valid_for=(online_logfiles,primary_role) db_unique_name=orcldg';
ALTER SYSTEM SET log_archive_dest_state_1 = enable;
ALTER SYSTEM SET log_archive_dest_state_2 = enable;
ALTER SYSTEM SET fal_server = 'orcldg';
ALTER SYSTEM SET fal_client = 'orcl';
ALTER SYSTEM SET standby_file_management = auto;
ALTER SYSTEM SET db_file_name_convert = '/u01/oradata/orcldg/', '/u01/oradata/orcl/';
ALTER SYSTEM SET log_file_name_convert = '/u01/oradata/orcldg/', '/u01/oradata/orcl/';

3. 网络配置

3.1 tnsnames.ora

ORCL = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = tcp)(HOST = primary)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = orcl))
  )

ORCLDG = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = tcp)(HOST = standby)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = orcldg))
  )

3.2 静态注册(备库)

# listener.ora
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcldg)(ORACLE_HOME = ...)(SID_NAME = orcldg)))

详细见:Oracle 网络配置与监听器


4. 备库准备

4.1 密码文件

# 主库
scp $ORACLE_HOME/dbs/orapworcl standby:$ORACLE_HOME/dbs/orapworcldg

4.2 参数文件

-- 主库
CREATE PFILE='/tmp/initorcldg.ora' FROM SPFILE;
scp /tmp/initorcldg.ora standby:/tmp/

-- 备库调整
db_unique_name='orcldg'
log_archive_dest_2='service=orcl async valid_for=(online_logfiles,primary_role) db_unique_name=orcl'
fal_server='orcl'
fal_client='orcldg'

4.3 创建目录

mkdir -p ******
mkdir -p ******
mkdir -p ******

5. RMAN Duplicate

5.1 启动备库到 NOMOUNT

sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='?/dbs/initorcldg.ora';

5.2 RMAN Duplicate

rman target sys/pwd@orcl auxiliary sys/pwd@orcldg

RMAN> DUPLICATE TARGET DATABASE 
  FOR STANDBY 
  FROM ACTIVE DATABASE 
  DORECOVER 
  NOFILENAMECHECK;

6. 启动应用

6.1 创建 SPFILE

CREATE SPFILE FROM PFILE;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

6.2 启动 MRP

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 
  DISCONNECT FROM SESSION USING CURRENT LOGFILE;

6.3 开启 Active Data Guard

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 
  DISCONNECT FROM SESSION USING CURRENT LOGFILE;

详细见:Oracle Data Guard 性能优化


7. 验证

7.1 主库

SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id = 2;
SELECT thread#, sequence#, archived, applied FROM v$archived_log ORDER BY sequence# DESC;

7.2 备库

SELECT process, status, sequence# FROM v$managed_standby;
SELECT database_role, open_mode, protection_mode FROM v$database;
SELECT name, value, unit FROM v$dataguard_stats;

7.3 日志

# 主库
ALTER SYSTEM SWITCH LOGFILE;
# 备库
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;

8. Switchover

8.1 主库验证

SELECT switchover_status FROM v$database;
-- TO STANDBY

8.2 主库切换

ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
ALTER DATABASE MOUNT STANDBY DATABASE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

8.3 备库切换

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SHUTDOWN IMMEDIATE;
STARTUP;

9. Failover

9.1 备库停止应用

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

9.2 切换

ALTER DATABASE ACTIVATE STANDBY DATABASE;
SHUTDOWN IMMEDIATE;
STARTUP;

9.3 重建原主库

- Flashback Database
- RMAN 重建

10. 监控

10.1 延迟

SELECT name, value, unit, time_computed 
FROM v$dataguard_stats;

10.2 GAP

SELECT * FROM v$archive_gap;

10.3 进程

SELECT process, status, sequence#, block#, blocks 
FROM v$managed_standby;

11. 常见坑与排错

11.1 GAP

-- 1. 查找
SELECT * FROM v$archive_gap;

-- 2. 注册
ALTER DATABASE REGISTER LOGFILE '...';

11.2 备库落后

# 1. 网络带宽
# 2. 备库 I/O
# 3. 并行应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 8;

11.3 ORA-12154

# 1. TNS 配置
# 2. 监听
# 3. 服务名

12. 最佳实践

  1. 归档模式:基础
  2. Force Logging:完整
  3. Standby Redo Log:实时
  4. ASYNC:性能
  5. Active Data Guard:备库利用
  6. TAF:业务切换
  7. 监控延迟:及时
  8. GAP 处理:完整
  9. 定期演练:验证
  10. 文档化:流程

13. 参考资料

[1] Oracle Data Guard Concepts and Administration 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/