Oracle 19c 单机到单机 Active Data Guard 搭建与巡检操作手册

1. 适用场景

本文适用于 Oracle 19c 单实例数据库搭建单实例 Physical Standby / Active Data Guard 场景。

环境前提:

项目 主库 备库
Oracle版本 19.25.0.0.0 19.25.0.0.0
架构 单实例 单实例
部署方式 OracleShellInstall OracleShellInstall
当前状态 Oracle 数据库已完整部署并正常运行 仅安装 Oracle 软件,不创建数据库
DG初始化方式 RMAN Backup-Based RMAN Restore + Recover
Redo传输 ASYNC 接收并应用
Protection Mode Maximum Performance Maximum Performance
最终状态 READ WRITE READ ONLY WITH APPLY

示例环境统一使用虚拟地址:

复制代码
主库:
主机名:oradb-primary
IP:192.168.100.11

备库:
主机名:oradb-standby
IP:192.168.100.12

Oracle目录:

复制代码
ORACLE_BASE=/app/app/oracle
ORACLE_HOME=/app/app/oracle/product/19.3.0/db
ORACLE_SID=imipzhwl

数据目录:
/app/data

归档目录:
/app/archivelog

RMAN初始化目录:
/app/backup/rman_dg_init

数据库名称规划:

复制代码
主库:
DB_NAME=imipzhwl
DB_UNIQUE_NAME=imipzhwl

备库:
DB_NAME=imipzhwl
DB_UNIQUE_NAME=imipzhwladg

核心原则:

复制代码
DB_NAME 主备必须一致
DB_UNIQUE_NAME 主备必须不同

2. ADG总体搭建流程

标准实施顺序:

复制代码
1. 主库检查及DG前置参数
2. 创建Standby Redo Log
3. 准备密码文件
4. 主库RMAN初始化备份
5. 最后一轮归档备份
6. 备份文件传输及校验
7. 备库创建最小PFILE
8. 恢复Standby Controlfile
9. Restore Database
10. Recover Database
11. 创建正式Standby SPFILE
12. 配置主备Oracle Net
13. 配置主备DG参数
14. 启动MRP
15. 验证Redo传输及应用
16. 打开备库READ ONLY WITH APPLY
17. 执行ADG巡检
18. 使用测试表验证实时同步

3. 主库前置检查

登录主库:

复制代码
su - oracle
sqlplus / as sysdba

确认:

复制代码
set lines 200

select db_unique_name,
       database_role,
       open_mode,
       log_mode,
       force_logging
from v$database;

要求:

复制代码
DATABASE_ROLE = PRIMARY
OPEN_MODE     = READ WRITE
LOG_MODE      = ARCHIVELOG

检查关键参数:

复制代码
show parameter db_name
show parameter db_unique_name
show parameter db_create_file_dest
show parameter standby_file_management
show parameter remote_login_passwordfile

建议:

复制代码
remote_login_passwordfile = EXCLUSIVE
standby_file_management   = AUTO

如果未开启 FORCE LOGGING:

复制代码
ALTER DATABASE FORCE LOGGING;

设置:

复制代码
ALTER SYSTEM SET standby_file_management='AUTO'
SCOPE=BOTH;

4. 创建Standby Redo Log

查询主库 Online Redo:

复制代码
select group#,
       thread#,
       bytes/1024/1024 size_mb,
       status
from v$log
order by group#;

原则:

复制代码
SRL大小 = Online Redo大小
SRL数量 >= 每个Thread的Online Redo组数 + 1

例如主库:

复制代码
8组 Online Redo
每组1024MB
Thread 1

则创建:

复制代码
9组 Standby Redo Log
每组1024MB

执行:

复制代码
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 SIZE 1024M;

按所需数量重复执行。

检查:

复制代码
select group#,
       thread#,
       bytes/1024/1024 size_mb,
       status
from v$standby_log
order by group#;

5. 准备密码文件

主库检查:

复制代码
ls -l $ORACLE_HOME/dbs/orapw${ORACLE_SID}

将主库密码文件复制至备库:

复制代码
scp $ORACLE_HOME/dbs/orapwimipzhwl \
oracle@192.168.100.12:$ORACLE_HOME/dbs/

备库执行:

复制代码
chown oracle:oinstall $ORACLE_HOME/dbs/orapwimipzhwl
chmod 640 $ORACLE_HOME/dbs/orapwimipzhwl

主备 SYS 密码文件必须保持一致。


6. 主库RMAN初始化备份

创建目录:

复制代码
mkdir -p /app/backup/rman_dg_init
chown oracle:oinstall /app/backup/rman_dg_init

进入 RMAN:

复制代码
rman target /

数据库备份:

复制代码
BACKUP DATABASE
FORMAT '/app/backup/rman_dg_init/db_%d_%T_%s_%p.bkp';

归档备份:

复制代码
BACKUP ARCHIVELOG ALL
FORMAT '/app/backup/rman_dg_init/arc_%d_%T_%s_%p.bkp';

Standby Controlfile:

复制代码
BACKUP CURRENT CONTROLFILE FOR STANDBY
FORMAT '/app/backup/rman_dg_init/standby_ctl_%d_%T_%s_%p.bkp';

SPFILE:

复制代码
BACKUP SPFILE
FORMAT '/app/backup/rman_dg_init/spfile_%d_%T_%s_%p.bkp';

7. 最后一轮归档备份

数据库及控制文件备份完成后,再进行一次日志切换,避免备份期间产生的 redo 未包含在初始化备份中。

确认当前在:

复制代码
CDB$ROOT

执行:

复制代码
ALTER SYSTEM ARCHIVE LOG CURRENT;

再进入 RMAN:

复制代码
BACKUP ARCHIVELOG ALL
FORMAT '/app/backup/rman_dg_init/arc_final_%d_%T_%s_%p.bkp';

8. 备份文件传输及校验

主库:

复制代码
cd /app/backup/rman_dg_init

sha256sum *.bkp > SHA256SUMS

传输:

复制代码
scp /app/backup/rman_dg_init/* \
oracle@192.168.100.12:/app/backup/rman_dg_init/

备库:

复制代码
cd /app/backup/rman_dg_init

sha256sum -c SHA256SUMS

所有文件必须显示:

复制代码
OK

9. 备库初始化

备库前提:

复制代码
OracleShellInstall 已完成 Oracle 19.25 软件安装
未创建数据库
未创建CDB/PDB

环境变量:

复制代码
export ORACLE_BASE=/app/app/oracle
export ORACLE_HOME=/app/app/oracle/product/19.3.0/db
export ORACLE_SID=imipzhwl
export PATH=$ORACLE_HOME/bin:$PATH

创建目录:

复制代码
mkdir -p /app/data/IMIPZHWL
mkdir -p /app/data/IMIPZHWL/pdbseed
mkdir -p /app/data/IMIPZHWL/onlinelog
mkdir -p /app/archivelog
mkdir -p /app/app/oracle/admin/imipzhwl/adump

chown -R oracle:oinstall /app/data
chown -R oracle:oinstall /app/archivelog
chown -R oracle:oinstall /app/app/oracle/admin

10. 创建备库最小PFILE

文件:

复制代码
$ORACLE_HOME/dbs/initimipzhwl.ora

内容:

复制代码
*.db_name='imipzhwl'
*.db_unique_name='imipzhwladg'

*.enable_pluggable_database=TRUE

*.db_create_file_dest='/app/data'

*.control_files='/app/data/IMIPZHWL/control01.ctl',
'/app/data/IMIPZHWL/control02.ctl'

*.log_archive_dest_1='LOCATION=/app/archivelog'

*.standby_file_management='AUTO'

启动:

复制代码
startup nomount pfile='$ORACLE_HOME/dbs/initimipzhwl.ora';

11. 恢复Standby Controlfile

进入 RMAN:

复制代码
rman target /

执行:

复制代码
RESTORE STANDBY CONTROLFILE
FROM '/app/backup/rman_dg_init/standby_ctl_xxx.bkp';

然后:

复制代码
ALTER DATABASE MOUNT;

12. Catalog并恢复数据库

Catalog:

复制代码
CATALOG START WITH '/app/backup/rman_dg_init/' NOPROMPT;

建议先:

复制代码
RESTORE DATABASE PREVIEW;

正式恢复:

复制代码
RESTORE DATABASE;

恢复 redo:

复制代码
RECOVER DATABASE;

如果根据备份链需要指定恢复点,可采用:

复制代码
RECOVER DATABASE UNTIL SCN <目标SCN>;

成功应看到:

复制代码
media recovery complete

检查:

复制代码
select *
from v$recover_file;

正常:

复制代码
no rows selected

13. 创建正式Standby SPFILE

推荐以主库参数为模板生成备库正式参数文件。

主库:

复制代码
CREATE PFILE='/tmp/init_imipzhwl_primary.ora'
FROM SPFILE;

复制到备库后调整以下核心参数:

复制代码
*.db_unique_name='imipzhwladg'

*.service_names='imipzhwladg'

*.local_listener=
'(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.12)(PORT=1521))'

*.log_archive_config=
'DG_CONFIG=(imipzhwl,imipzhwladg)'

*.log_archive_dest_1=
'LOCATION=/app/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=imipzhwladg'

*.log_archive_dest_2=
'SERVICE=IMIPZHWL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=imipzhwl'

*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'

*.fal_server='IMIPZHWL'

*.standby_file_management='AUTO'

创建 SPFILE:

复制代码
CREATE SPFILE=
'/app/app/oracle/product/19.3.0/db/dbs/spfileimipzhwl.ora'
FROM PFILE=
'/app/app/oracle/product/19.3.0/db/dbs/initimipzhwl_stby.ora';

然后:

复制代码
shutdown immediate;
startup mount;

14. 配置Oracle Net

主库 tnsnames.ora

复制代码
IMIPZHWL =
  (DESCRIPTION =
    (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = 192.168.100.11)
      (PORT = 1521)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = imipzhwl)
    )
  )

IMIPZHWL_STBY =
  (DESCRIPTION =
    (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = 192.168.100.12)
      (PORT = 1521)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = imipzhwladg)
    )
  )

备库保持同样的 TNS Alias。

验证:

复制代码
tnsping IMIPZHWL
tnsping IMIPZHWL_STBY

然后分别测试 SYS 远程连接:

复制代码
sqlplus sys@IMIPZHWL_STBY as sysdba

以及:

复制代码
sqlplus sys@IMIPZHWL as sysdba

密码交互输入。


15. 主库Data Guard参数

主库:

复制代码
ALTER SYSTEM SET
log_archive_config=
'DG_CONFIG=(imipzhwl,imipzhwladg)'
SCOPE=BOTH;

ALTER SYSTEM SET
log_archive_dest_1=
'LOCATION=/app/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=imipzhwl'
SCOPE=BOTH;

ALTER SYSTEM SET
log_archive_dest_2=
'SERVICE=IMIPZHWL_STBY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=imipzhwladg'
SCOPE=BOTH;

ALTER SYSTEM SET log_archive_dest_state_1='ENABLE'
SCOPE=BOTH;

ALTER SYSTEM SET log_archive_dest_state_2='ENABLE'
SCOPE=BOTH;

ALTER SYSTEM SET fal_server='IMIPZHWL_STBY'
SCOPE=BOTH;

ALTER SYSTEM SET standby_file_management='AUTO'
SCOPE=BOTH;

16. 备库Data Guard参数

备库:

复制代码
ALTER SYSTEM SET
log_archive_config=
'DG_CONFIG=(imipzhwl,imipzhwladg)'
SCOPE=BOTH;

ALTER SYSTEM SET
log_archive_dest_1=
'LOCATION=/app/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=imipzhwladg'
SCOPE=BOTH;

ALTER SYSTEM SET
log_archive_dest_2=
'SERVICE=IMIPZHWL ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=imipzhwl'
SCOPE=BOTH;

ALTER SYSTEM SET log_archive_dest_state_1='ENABLE'
SCOPE=BOTH;

ALTER SYSTEM SET log_archive_dest_state_2='ENABLE'
SCOPE=BOTH;

ALTER SYSTEM SET fal_server='IMIPZHWL'
SCOPE=BOTH;

ALTER SYSTEM SET standby_file_management='AUTO'
SCOPE=BOTH;

17. 启动Redo Apply

备库:

复制代码
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
DISCONNECT FROM SESSION;

此时已经进入标准 Physical Standby 同步状态。


18. 转为Active Data Guard

如果需要备库在线查询:

复制代码
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

ALTER DATABASE OPEN READ ONLY;

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
DISCONNECT FROM SESSION;

检查:

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

正常应为:

复制代码
PHYSICAL STANDBY
READ ONLY WITH APPLY

说明已经进入 Active Data Guard Real-Time Query 状态。

生产使用前需确认 Active Data Guard Option 授权。


19. ADG核心巡检

后续日常巡检不需要执行大量 SQL,核心看以下几项即可。

主库

19.1 基本状态

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

应:

复制代码
PRIMARY
READ WRITE
MAXIMUM PERFORMANCE

19.2 备库传输状态

复制代码
select dest_id,
       status,
       target,
       destination,
       error,
       db_unique_name
from v$archive_dest
where dest_id in (1,2);

重点看:

复制代码
DEST_ID=2
STATUS=VALID
TARGET=STANDBY
ERROR为空

备库

19.3 数据库状态

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

应:

复制代码
PHYSICAL STANDBY
READ ONLY WITH APPLY

19.4 MRP/RFS状态

复制代码
select process,
       status,
       thread#,
       sequence#
from v$managed_standby
where process in ('MRP0','RFS')
order by process;

正常 MRP:

复制代码
WAIT_FOR_LOG

或者:

复制代码
APPLYING_LOG

19.5 接收及应用序列

复制代码
select thread#,
       max(sequence#) received_seq,
       max(case
             when applied='YES'
             then sequence#
           end) applied_seq
from v$archived_log
group by thread#;

正常:

复制代码
received_seq ≈ applied_seq

19.6 Archive Gap

复制代码
select *
from v$archive_gap;

正常:

复制代码
no rows selected

20. ADG快速判断标准

同时满足以下条件即可基本判断正常:

复制代码
主库:
PRIMARY
READ WRITE
DEST_2 = VALID
ERROR = 空

备库:
PHYSICAL STANDBY
READ ONLY WITH APPLY

MRP0:
WAIT_FOR_LOG
或
APPLYING_LOG

RFS:
正常存在

received_seq 与 applied_seq 基本一致

v$archive_gap:
无记录

不建议单独根据:

复制代码
transport lag
apply lag

一个指标判断异常。


21. 强制日志切换验证

需要快速验证主备链路时,主库必须在:

复制代码
CDB$ROOT

执行:

复制代码
ALTER SYSTEM ARCHIVE LOG CURRENT;

然后观察备库:

复制代码
select process,
       status,
       thread#,
       sequence#
from v$managed_standby
where process in ('MRP0','RFS');

以及:

复制代码
select thread#,
       max(sequence#) received_seq,
       max(case when applied='YES'
                then sequence# end) applied_seq
from v$archived_log
group by thread#;

序列推进即可证明 redo transport/apply 正常。


22. 简单测试表验证ADG同步

为了以后快速验证 ADG,建议在某个业务 PDB 中保留一个简单测试表。

例如:

复制代码
CREATE TABLE ADGTEST (
    ID        NUMBER PRIMARY KEY,
    TEST_TIME TIMESTAMP DEFAULT SYSTIMESTAMP
);

主库插入:

复制代码
INSERT INTO ADGTEST (ID) VALUES (1);
COMMIT;

查询:

复制代码
ALTER SESSION SET
NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF6';

SELECT *
FROM ADGTEST;

例如:

复制代码
ID  TEST_TIME
1   2026-10-06 17:18:08.294606

然后去备库相同 PDB:

复制代码
ALTER SESSION SET
NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF6';

SELECT *
FROM ADGTEST;

能够查询到相同记录,即可非常直观地验证:

复制代码
主库写入
→ Redo生成
→ Redo传输
→ Redo Apply
→ ADG只读查询

整条链路正常。

后续验证可以继续:

复制代码
INSERT INTO ADGTEST (ID) VALUES (2);
COMMIT;

备库:

复制代码
SELECT *
FROM ADGTEST
ORDER BY ID;

23. 常见问题

ORA-65040

如果执行:

复制代码
ALTER SYSTEM ARCHIVE LOG CURRENT;

报:

复制代码
operation not allowed from within a pluggable database

说明当前在 PDB。

切回:

复制代码
ALTER SESSION SET CONTAINER=CDB$ROOT;

再执行。

ORA-65093

备库 CDB 启动时报错时,检查:

复制代码
*.enable_pluggable_database=TRUE

MRP0 WAIT_FOR_LOG

这是正常状态,表示:

复制代码
当前Redo已经应用完成
正在等待新的日志

不是故障。

MRP0 APPLYING_LOG

说明正在实时应用日志,也是正常状态。

v$archive_gap无记录

说明当前没有归档缺口。


24. 下一次搭建ADG速查版

下一次遇到相同场景,可以直接按下面执行:

复制代码
【主库】
1. 确认ARCHIVELOG
2. 开启FORCE LOGGING
3. standby_file_management=AUTO
4. 创建SRL
5. 检查password file
6. RMAN BACKUP DATABASE
7. RMAN BACKUP ARCHIVELOG
8. BACKUP STANDBY CONTROLFILE
9. BACKUP SPFILE
10. ARCHIVE LOG CURRENT
11. 再备份一次ARCHIVELOG
12. SHA256
13. 传输备份文件


【备库】
14. OracleShellInstall只安装Oracle软件
15. 不创建数据库
16. 配置ORACLE_SID
17. 创建目录
18. 复制password file
19. 创建最小PFILE
20. startup nomount
21. restore standby controlfile
22. mount
23. catalog backup
24. restore database
25. recover database
26. 创建正式standby SPFILE
27. startup mount


【主备配置】
28. 配置listener/tnsnames
29. tnsping双向测试
30. SYS双向连接测试
31. 配置主库DG参数
32. 配置备库DG参数


【启动同步】
33. 备库启动MRP
34. 检查MRP/RFS
35. 检查received/applied
36. 检查archive gap
37. 检查主库DEST_2


【转ADG】
38. cancel MRP
39. open read only
40. restart MRP
41. 确认READ ONLY WITH APPLY


【最终验证】
42. 主库ADGTEST插入数据
43. COMMIT
44. 备库查询ADGTEST
45. 数据一致即完成
相关推荐
念越1 小时前
初中语数英答题与竞赛平台
java·数据库·spring boot
落日归屿1 小时前
AI 商品图做完后,为什么还要管图层?
数据库
拾贰_C2 小时前
【English | conversation 】call | 抖音AI短句情景:打电话---come over
数据库·redis·缓存
2601_962885722 小时前
AlphaFeed 支持哪些 K 线周期?period参数怎么传?
前端·数据库·python
麦壳饼2 小时前
架构深度解析:SonnetDB 的写入与查询路径
数据库·sonnetdb
gudufy3 小时前
ASP.NET Core 多租户如何动态创建数据库?数据库初始化怎么做?
数据库·blazor·admin
Data-Miner4 小时前
离线AI制表:模型适配与脚本固化实操
大数据·数据库·人工智能·excel
xixiaoyunya4 小时前
数据库三种备份方式怎么组合?从原理到落地的完整方案
数据库
2501_933670794 小时前
2027届数学与应用数学转经营分析:SQL、财务指标与业务指标补齐路线
数据库·sql·数学建模