一、文档说明
本文基于 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 部署前置硬性要求
- 主库必须开启归档模式 + 强制日志模式;
- 备库仅安装 Oracle 18c 软件,无需提前建库;
- 主备库
DB_NAME必须保持一致,DB_UNIQUE_NAME必须不同; - 主备库操作系统、数据库大版本一致,字符集一致;
- 服务器网络互通,1521 端口开放,hosts 主机名互相解析。
2.3 部署后参数标准
- 主库:
DB_NAME=ORA18、DB_UNIQUE_NAME=ORA18 - 备库:
DB_NAME=ORA18、DB_UNIQUE_NAME=ORA18_DG
三、主库前置配置
3.1 检查并开启归档与强制日志
1)查询当前状态
select log_mode,force_logging from v$database;
要求结果:LOG_MODE=ARCHIVELOG、FORCE_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;
注意要点:
db_file_name_convert、log_file_name_convert:备库路径在前,主库路径在后;- 这两个参数仅支持
scope=spfile,需重启数据库生效;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
-
编辑备库
initora18_dg.ora,修改DB_UNIQUE_NAME、实例名、路径转换参数与主库对应反向配置; -
备库根据修改后的 pfile 创建 spfile:
create spfile from pfile;
-
备库启动到 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;
十、部署注意事项总结
- 主备
DB_NAME一致、DB_UNIQUE_NAME必须区分; - 路径转换参数
db_file/log_file_name_convert顺序不能写反; - Standby 日志一定要比在线日志多一组,提前建好;
- RMAN Active Duplicate 无需备份集,直接网络克隆,适合 18c 快速部署;
- 日常优先用
v$dataguard_stats查看主备延迟,快速定位同步异常; - 出现归档缺口,手动拷贝日志注册后再应用,避免主备数据差异。