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;
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. 最佳实践
- 归档模式:基础
- Force Logging:完整
- Standby Redo Log:实时
- ASYNC:性能
- Active Data Guard:备库利用
- TAF:业务切换
- 监控延迟:及时
- GAP 处理:完整
- 定期演练:验证
- 文档化:流程
13. 参考资料
[1] Oracle Data Guard Concepts and Administration 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/