
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. 数据一致即完成