当Oracle DataGuard的主备库出现长时间不同步、归档日志缺失、备库数据文件损坏等问题,且常规修复手段无法恢复同步时,重建DataGuard是最稳妥的解决方式。下面我们就来详细讲解重建的完整流程。

一、重建前的前置检查
在正式重建之前,需要先完成以下检查,避免重建过程中出现不必要的问题:
- 确认主库处于归档模式,且强制日志开启:
SELECT log_mode,force_logging FROM v$database; - 检查主库DataGuard相关参数配置是否正确,记录当前的
db_unique_name、log_archive_dest_n等参数值 - 确认主备库Oracle版本一致,操作系统位数相同,服务器存储、内存等资源满足备库运行要求
- 备份主库当前的参数文件、密码文件,避免操作失误导致主库配置丢失
二、主库准备操作
主库端需要完成以下配置,为备库重建提供基础条件:
1. 创建备库控制文件
在主库执行以下命令生成用于备库的控制文件,注意控制文件需要放在主备库都能访问的共享目录或者后续传输到备库:
-- 生成备库控制文件,替换路径为实际存放路径 ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/backup/standby_control01.ctl';
2. 准备参数文件与密码文件
导出主库的参数文件,同时复制主库的密码文件到备库对应目录,保证主备库密码一致:
-- 导出参数文件 CREATE PFILE='/u01/backup/initstandby.ora' FROM SPFILE;
3. 配置TNS解析
在主备库的tnsnames.ora中添加对方实例的解析条目,确保主备库之间可以互相通过TNS连接,以下是示例配置:
-- 主库TNS配置示例,备库端也需要添加对应主库解析
PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = primary)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby)
)
)三、备库环境准备
在备库服务器上完成以下操作,搭建备库运行环境:
1. 创建目录与文件拷贝
按照主库的目录结构创建对应的数据文件、日志文件、归档日志目录,将主库生成的备库控制文件、参数文件、密码文件拷贝到备库对应路径,同时拷贝主库的全量数据文件备份(如果没有全量备份,可以使用RMAN进行全量备份并传输到备库)。
2. 修改备库参数文件
修改拷贝过来的参数文件,调整以下DataGuard相关参数,适配备库环境:
-- 备库参数示例,根据实际环境调整路径和名称 *.db_unique_name='standby' *.log_archive_dest_1='LOCATION=/u01/arch valid_for=(all_logfiles,all_roles) db_unique_name=standby' *.log_archive_dest_2='SERVICE=primary ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary' *.fal_server='primary' *.fal_client='standby' *.standby_file_management='AUTO'
3. 启动备库到mount状态
使用修改后的参数文件启动备库到mount状态:
-- 关闭备库 SHUTDOWN IMMEDIATE; -- 使用pfile启动到nomount STARTUP NOMOUNT PFILE='/u01/app/oracle/product/19c/dbhome_1/dbs/initstandby.ora'; -- 修改控制文件路径,然后启动到mount ALTER SYSTEM SET control_files='/u01/oradata/standby/control01.ctl' SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP MOUNT PFILE='/u01/app/oracle/product/19c/dbhome_1/dbs/initstandby.ora'; -- 创建spfile CREATE SPFILE FROM PFILE='/u01/app/oracle/product/19c/dbhome_1/dbs/initstandby.ora';
四、数据同步与redo传输配置
完成备库环境准备后,需要配置数据同步和redo传输:
1. RMAN恢复数据文件
如果备库没有完整的数据文件,使用RMAN进行恢复:
-- 连接RMAN RMAN TARGET / -- 恢复数据文件,如果有全量备份则直接恢复 RESTORE DATABASE; RECOVER DATABASE;
2. 配置redo传输与日志应用
在主库确认redo传输目标配置正确,在备库开启redo日志应用:
-- 主库执行,确认log_archive_dest_2状态正常 SELECT dest_id,status,error FROM v$archive_dest WHERE dest_id=2; -- 备库执行,开启实时日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
五、同步状态验证
重建完成后,需要验证主备库同步状态是否正常:
- 主库切换几次日志:
ALTER SYSTEM SWITCH LOGFILE;,查看备库是否收到对应归档 - 查询备库同步状态:
SELECT name,open_mode,database_role,switchover_status FROM v$database;,正常备库角色为PHYSICAL STANDBY,open_mode为READ ONLY WITH APPLY(如果开了实时应用) - 查询主备库归档差异:
SELECT max(sequence#) FROM v$archived_log WHERE applied='YES';,主备库的sequence差值应该很小或者为0 - 测试数据同步:主库创建测试表插入数据,提交后查看备库是否同步到对应数据
六、常见问题与注意事项
重建过程中需要注意以下问题,避免同步异常:
- 主备库的
db_unique_name必须唯一,且和TNS配置、参数中的db_unique_name一致 - 密码文件必须保证主备库完全相同,否则redo传输会失败
- 如果备库数据文件路径和主库不一致,需要在参数文件中配置
db_file_name_convert和log_file_name_convert进行路径转换 - 重建完成后不要忘记开启备库的flashback(如果之前有配置),方便后续进行故障切换测试
Oracle_DataGuard物理备库 redo传输恢复同步数据库容灾修改时间:2026-05-25 00:06:28