Oracle 18C 物理 DataGuard 搭建部署完整文档(适合开发测试)

一、文档说明

本文基于 Redhat 7.3 + Oracle 18c 版本,提供物理 ADG 从环境规划、前置配置、主库参数、备库 RMAN 克隆、日志应用、日常维护、主备切换全套标准化部署流程,可直接用于测试 / 生产环境落地实施。

二、环境整体规划

2.1 主机信息表

表格

角色 主机名 IP 地址 操作系统 DB_UNIQUE_NAME DB_NAME Oracle 安装目录
主库 linux29 192.168.1.29 Redhat 7.3 ora18 ora18 /u01/oracle18/oracle/product/18.0.0/db_1
备库 linux30 192.168.1.30 Redhat 7.3 ora18_dg ora18 /oracle/oracle18/oracle/product/18.0.0/db_1

2.2 部署前置硬性要求

  1. 主库必须开启归档模式 + 强制日志模式
  2. 备库仅安装 Oracle 18c 软件,无需提前建库
  3. 主备库 DB_NAME 必须保持一致,DB_UNIQUE_NAME 必须不同;
  4. 主备库操作系统、数据库大版本一致,字符集一致;
  5. 服务器网络互通,1521 端口开放,hosts 主机名互相解析。

2.3 部署后参数标准

  • 主库:DB_NAME=ORA18DB_UNIQUE_NAME=ORA18
  • 备库:DB_NAME=ORA18DB_UNIQUE_NAME=ORA18_DG

三、主库前置配置

3.1 检查并开启归档与强制日志

1)查询当前状态
复制代码
select log_mode,force_logging from v$database;

要求结果:LOG_MODE=ARCHIVELOGFORCE_LOGGING=YES

2)未开启归档执行以下操作
复制代码
shutdown immediate
startup mount
alter database archivelog;
alter database open;
3)开启强制日志
复制代码
alter database force logging;

3.2 同步主库密码文件到备库

Oracle DG 要求主备密码文件一致,主库执行 scp 传输:

运行

复制代码
scp $ORACLE_HOME/dbs/orapwora18 192.168.1.30:$ORACLE_HOME/dbs/orapwora18_dg

3.3 配置主库 tnsnames.ora

编辑网络配置文件:

运行

复制代码
cd $ORACLE_HOME/network/admin
vi tnsnames.ora

写入以下内容(适配本次环境 IP):

ini

复制代码
ORA18 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.29)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ora18)
    )
  )

ORA18_DG =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.30)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ora18)
    )
  )

配置完成后,将 tnsnames.ora 同步到备库:

运行

复制代码
scp $ORACLE_HOME/network/admin/tnsnames.ora 192.168.1.30:$ORACLE_HOME/network/admin/

3.4 备库配置 listener.ora

登录备库,编辑监听配置:

运行

复制代码
cd $ORACLE_HOME/network/admin
vi listener.ora

标准配置:

ini

复制代码
LISTENER_ORA18_DG =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.30)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER_ORA18_DG =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ora18_dg)
      (ORACLE_HOME = /oracle/oracle18/oracle/product/18.0.0/db_1)
      (SID_NAME = ora18_dg)
    )
  )

重启备库监听:

运行

复制代码
lsnrctl stop
lsnrctl start

3.5 主库添加 Standby 日志文件

规范原则:Standby 日志组数 = 在线重做日志组数 + 1

1)查询现有日志

sql

复制代码
set lines 180 pages 500
col member for a70
select a.group#,a.members,a.THREAD#,a.status,a.BYTES/1024/1024,b.member 
from v$log a,v$logfile b where a.group#=b.group# 
order by a.group#,a.thread#;

select a.group#,a.THREAD#,a.status,a.BYTES/1024/1024,b.member 
from v$standby_log a,v$logfile b where a.group#=b.group# 
order by a.group#,a.thread#;
2)添加 Standby 日志

sql

复制代码
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 4('/u01/oracle18/oradata/ORA18/stdredo01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5('/u01/oracle18/oradata/ORA18/stdredo02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 6('/u01/oracle18/oradata/ORA18/stdredo03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 7('/u01/oracle18/oradata/ORA18/stdredo04.log') SIZE 200M;

3.6 主库修改 DG 核心参数

1)先备份 spfile

bash

运行

复制代码
cd $ORACLE_HOME/dbs
cp spfileora18.ora spfileora18.ora.$(date +%Y%m%d%H%M%S)
2)执行参数修改

sql

复制代码
-- 配置DG全局节点
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora18,ora18_dg)' scope=both;

-- 本地归档路径
alter system set LOG_ARCHIVE_DEST_1='location=/u01/oracle18/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=ora18' scope=both;

-- 同步到备库
alter system set LOG_ARCHIVE_DEST_2='SERVICE=ORA18_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora18_dg' scope=both;

alter system set FAL_SERVER=ora18_dg scope=both;
alter system set FAL_CLIENT=ora18 scope=both;
alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both;
alter system set log_archive_dest_state_2=enable scope=both;

-- 文件名路径转换(仅spfile生效)
alter system set db_file_name_convert='/oracle/oracle18/oradata/ORA18_DG','/u01/oracle18/oradata/ORA18' scope=spfile;
alter system set log_file_name_convert='/oracle/oracle18/oradata/ORA18_DG','/u01/oracle18/oradata/ORA18' scope=spfile;

注意要点:

  1. db_file_name_convertlog_file_name_convert备库路径在前,主库路径在后
  2. 这两个参数仅支持 scope=spfile,需重启数据库生效;
  3. LOG_ARCHIVE_DEST_2 中 SERVICE 对应备库 tns 别名。

3.7 生成 pfile 并同步到备库

复制代码
create pfile from spfile;

主库推送 pfile 到备库:

运行

复制代码
scp $ORACLE_HOME/dbs/initora18.ora 192.168.1.30:$ORACLE_HOME/dbs/initora18_dg.ora

3.8 备库修改 pfile 并启动到 nomount

  1. 编辑备库 initora18_dg.ora,修改 DB_UNIQUE_NAME、实例名、路径转换参数与主库对应反向配置;

  2. 备库根据修改后的 pfile 创建 spfile:

    create spfile from pfile;

  3. 备库启动到 nomount 状态:

    startup nomount;


四、RMAN Active 方式克隆备库

登录备库服务器,执行 RMAN 异机克隆:

4.1 普通克隆命令

运行

复制代码
rman target sys/oracle@ORA18 auxiliary sys/oracle@ORA18_DG

DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;

4.2 多通道并发克隆(提速推荐)

bash

运行

复制代码
rman target sys/oracle@ORA18 auxiliary sys/oracle@ORA18_DG
run
{
allocate channel cl1 type disk;
allocate channel cl2 type disk;
allocate channel cl3 type disk;
allocate auxiliary channel c1 type disk;
allocate auxiliary channel c2 type disk;
allocate auxiliary channel c3 type disk;
duplicate target database for standby from active database nofilenamecheck;
release channel c1;
release channel c2;
release channel c3;
release channel cl1;
release channel cl2;
release channel cl3;
}

克隆完成后,备库自动处于 mount 状态。


五、备库开启日志应用(ADG 实时同步)

5.1 备库查询状态

sql

复制代码
select open_mode from v$database;

5.2 开启数据库 + 启动实时应用

复制代码
-- 取消现有恢复(如有)
alter database recover managed standby database cancel;

-- 开启ADG实时日志应用
alter database recover managed standby database using current logfile disconnect from session;

-- 普通DG非实时同步(可选)
-- alter database recover managed standby database disconnect from session;

5.3 检查归档目标状态

复制代码
col dest_name for a30
select dest_name,status,error from v$archive_dest;

六、PDB 容器数据库开启

6.1 单个 PDB 手动开启

复制代码
alter pluggable database PDB名称 open read only;

6.2 批量生成所有 PDB 开启脚本

在主库执行生成语句,复制到备库执行:

复制代码
select 'alter pluggable database '||name||' open read only instances=all;' 
from v$pdbs where open_mode ='READ WRITE';

七、主备库部署完成状态验证

7.1 备库状态

复制代码
select open_mode,database_role from v$database;

正常结果:READ ONLY WITH APPLY

7.2 主库状态

复制代码
select log_mode,open_mode ,database_role from v$database;

正常结果:ARCHIVELOG、READ WRITE、PRIMARY


八、DataGuard 日常维护常用命令

8.1 启停日志同步

复制代码
-- 启动实时同步
alter database recover managed standby database using current logfile disconnect from session;

-- 停止同步
alter database recover managed standby database cancel;

8.2 查看保护模式

复制代码
select database_role,LOG_MODE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

模式切换语句:

复制代码
alter database set standby database to maximize protection;
alter database set standby database to maximize availability;
alter database set standby database to maximize performance;

8.3 查看归档日志应用进度

复制代码
col name for a50
select name,SEQUENCE#,APPLIED from v$archived_log order by sequence#;

8.4 查看 DG 进程状态

复制代码
select process,thread#,status,SEQUENCE# from v$managed_standby;

8.5 检查日志缺口(缺失归档)

复制代码
select * from v$archive_gap;

8.6 查看主备延迟统计

复制代码
col name for a25
col value for a20
col unit for a30
set lines 120
select name,value,unit,time_computed from v$dataguard_stats;

8.7 手动注册缺失归档日志

复制代码
-- 注册归档
alter database register physical logfile '/归档路径/归档文件名';
-- 手动恢复
alter database recover automatic standby database;

九、DataGuard 主备切换完整流程

9.1 原主库操作

复制代码
-- 检查切换状态
select switchover_status from v$database;

-- 切换为备库
alter database commit to switchover to physical standby;

-- 启动到mount
startup mount;

9.2 原备库操作

复制代码
-- 检查状态
select switchover_status from v$database;

-- 切换为主库
alter database commit to switchover to primary;

-- 打开数据库
alter database open;

9.3 原主库(新备库)后续操作

复制代码
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

-- 开启PDB
alter pluggable database PDB名称 open read only;

十、部署注意事项总结

  1. 主备 DB_NAME 一致、DB_UNIQUE_NAME 必须区分;
  2. 路径转换参数 db_file/log_file_name_convert 顺序不能写反;
  3. Standby 日志一定要比在线日志多一组,提前建好;
  4. RMAN Active Duplicate 无需备份集,直接网络克隆,适合 18c 快速部署;
  5. 日常优先用 v$dataguard_stats 查看主备延迟,快速定位同步异常;
  6. 出现归档缺口,手动拷贝日志注册后再应用,避免主备数据差异。
相关推荐
金仓数据库4 小时前
性能提升超十倍!金仓时序数据库首入北京轨交TCC
数据库·时序数据库
java1234_小锋4 小时前
Redis 如何实现持久化?RDB 和 AOF 的区别是什么?如何选择合适的持久化方式?
数据库·redis·bootstrap
倔强的石头1064 小时前
深度解析:数据库内核如何通过逻辑推理与常值推导突破去重性能瓶颈
数据库·oracle
为什么不问问神奇的海螺呢丶4 小时前
Oracle database SYSAUX 表空间占用率过高处理方案
数据库·oracle
fengxin_rou4 小时前
【MySQL SQL 执行全链路剖析】:执行计划、慢查询与经典场景优化指南
数据库·sql·mysql
在繁华处4 小时前
从零搭建轻灵(五):记忆系统与生产化特性
java·jvm·oracle
betazhou4 小时前
LOG_ARCHIVE_DEST_2 ORA-01033: ORACLE initialization or shut
数据库·oracle·oracle19c adg
思诺学长4 小时前
MySQL——数据库并发控制策略: 乐观锁与悲观锁
数据库
fengxin_rou4 小时前
【Spring AI 集成 DeepSeek 实现 AI 摘要与 RAG 问答】:从原理到落地实践
数据库·mysql·rag·deepseek