第一阶段:主库配置
1. 启用归档模式并配置强制日志
ADG 要求主库必须处于归档模式并启用强制日志记录。
-- 以sysdba身份登录主库
sqlplus / as sysdba
-- 查看当前模式
archive log list;
-- 如果未开启归档,则执行以下操作(需要重启数据库)
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
-- 启用强制日志
alter database force logging;
-- 验证
select force_logging from v$database;
select log_mode from v$database;
2. 配置备用重做日志
备用重做日志是ADG的核心之一,它在主库上创建,用于接收从主库传输过来的重做数据。其大小应与在线重做日志完全相同。
规则:每组备用日志文件最好比在线重做日志多一组,每个组至少一个成员。(例如,有3组在线重做日志,则建议创建4组备用重做日志)。
-- 查看当前在线重做日志组信息(获取大小和组数)
SELECT group#, bytes FROM v$log ORDER BY group#;
-- 假设在线日志大小为 50MB,有3组
-- 则创建4组50MB的备用重做日志(每组一个成员,路径根据实际情况修改)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/adglog/std_redo04a.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/adglog/std_redo05a.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/adglog/std_redo06a.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/adglog/std_redo07a.log') SIZE 50M;
-- 验证
SELECT group#, thread#, sequence#, archived, status FROM v$standby_log;
3. 配置初始化参数
修改主库的 pfile或 spfile中的参数。
-- 如果使用spfile,最好先创建pfile备份
create pfile from spfile;
-- 然后逐个设置参数(以下为关键参数)
alter system set db_name='b2b' scope=spfile sid='*'; -- 主备库db_name必须相同
alter system set db_unique_name='PRIMARY’ scope=spfile sid='*’; -- 主库唯一名
alter system set log_archive_config='dg_config=(PRIMARY,STANDBY)' scope=spfile sid='*'; -- 配置DG成员
alter system set fal_server='STANDBY' scope=spfile sid='*'; -- 指定备库的TNS入口,用于故障处理
alter system set fal_client='PRIMARY' scope=spfile sid='*';
-- 配置归档路径,使用%t(线程号)、%s(序列号)、%r(resetlogs id)确保唯一性
alter system set log_archive_dest_1='location=/u01/arch/ valid_for=(all_logfiles,all_roles) db_unique_name=PRIMARY' scope=spfile sid='*';
-- 关键:配置指向备库的归档路径,使用LGWR异步进程(推荐性能)
alter system set log_archive_dest_2='service=STANDBY lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=STANDBY' scope=spfile sid='*';
-- 启用实时应用(11gR2功能,可选但推荐),允许备库在备用日志文件归档前应用重做
alter system set log_archive_dest_state_2=defer; -- 先设置为defer,等备库建好后再enable
-- 重启主库使部分参数生效
shutdown immediate;
startup;
#上面配置需要修改spfile
-- 1. 导出 SPFILE
create pfile='/tmp/initORCL.ora' from spfile;
-- 2. 编辑 PFILE,添加这一行
db_unique_name=PRIMARY
-- 3. 用 PFILE 启动数据库
startup pfile='/tmp/initORCL.ora';
-- 4. 重新生成 SPFILE
create spfile from pfile='/tmp/initORCL.ora';
-- 5. 重启数据库
shutdown immediate;
startup;
4. 配置TNSNAMES.ORA
在主备库的 $ORACLE_HOME/network/admin/tnsnames.ora文件中添加连接字符串。
# 在主库服务器上配置
PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary_hostname)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby_hostname)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
配置后使用 tnsping STANDBY测试网络连接是否通畅。
第二阶段:创建备库
1. 准备备库环境
在备库服务器上安装相同版本的Oracle软件(只安装软件,不建库)。
创建与主库相同的目录结构(如 admin, datafile, arch等)。
将主库的密码文件 orapw<sid>复制到备库的相同位置。
2. 从主库进行备份
rman target /
-- 进行全量备份(包括归档日志)
BACKUP DATABASE PLUS ARCHIVELOG;
3. 将备份集传输到备库
使用 scp, rsync等工具将RMAN备份集传输到备库服务器上与主库完全相同的目录路径下。
4. 创建备库的控制文件
在主库上为备库创建控制文件。
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby_control.ctl';
然后将这个控制文件也传输到备库服务器上。
5. 准备备库的参数文件
从主库创建pfile,并传输到备库,然后进行修改。
-- 在主库
CREATE PFILE='/tmp/initb2b.ora' FROM SPFILE;
传输到备库后,修改以下关键参数:
# 在备库的pfile中修改
btob.__db_cache_size=4445962240
btob.__java_pool_size=16777216
btob.__large_pool_size=16777216
btob.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
btob.__pga_aggregate_target=1828716544
btob.__sga_target=5469372416
btob.__shared_io_pool_size=0
btob.__shared_pool_size=939524096
btob.__streams_pool_size=16777216
*.audit_file_dest='/u01/app/oracle/admin/btob/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/btob/control01.ctl','/u01/app/oracle/fast_recovery_area/btob/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='btob'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=5218762752
*.db_unique_name='STANDBY'
*.diagnostic_dest='/u01/app/oracle'
*.fal_client='STANDBY'
*.fal_server='PRIMARY'
*.log_archive_config='dg_config=(PRIMARY,STANDBY)'
*.log_archive_dest_1='location=/u01/arch/ valid_for=(all_logfiles,all_roles) db_unique_name=STANDBY'
*.log_archive_dest_2='service=PRIMARY lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=PRIMARY'
*.log_archive_dest_state_2='DEFER'
*.open_cursors=300
*.pga_aggregate_target=1817182208
*.processes=1500
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=1655
*.sga_target=5453643776
*.undo_tablespace='UNDOTBS1'
standby_file_management='AUTO'
6.启动备库到MOUNT状态
将修改后的pfile放在 $ORACLE_HOME/dbs目录下(如 initORCL.ora)。
将之前传输的备用控制文件放到正确位置。
启动备库实例:
export ORACLE_SID=ORCL # 备库SID最好与主库相同
sqlplus / as sysdba
STARTUP NOMOUNT;
-- 使用备库控制文件挂载数据库
ALTER DATABASE MOUNT STANDBY DATABASE;
7. 使用RMAN恢复并开启同步
在备库上使用RMAN注册备份并进行恢复。
rman target /
-- 注册备份文件
CATALOG START WITH '/u01/app/oracle/fast_recovery_area/PRIMARY/backupset/2025_11_25'; -- 备份文件所在路径
-- 恢复数据库
restore database;
RECOVER DATABASE;
恢复完成后,开启Redo应用:
-- 在备库sqlplus中执行
-- 开启Redo应用(Managed Recovery Process)
-- 使用DISCONNECT允许会话断开后恢复继续运行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- 如果需要实时应用(推荐),可以加上USING CURRENT LOGFILE子句
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
第三阶段:最终设置与验证
1. 在主库启用指向备库的归档路径
ALTER SYSTEM SET log_archive_dest_state_2=enable;
2. 验证ADG状态
在主库查询进程和传输状态:
SELECT process, status, sequence#, block#, client_process FROM v$managed_standby;
SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id=2;
在备库查询应用状态:
SELECT process, status, sequence#, block# FROM v$managed_standby;
-- 查看归档日志序列号是否在增长
SELECT sequence#, first_time, next_time, applied FROM v$archived_log ORDER BY sequence#;
-- 如果applied为YES,说明日志已被应用
检查备库是否处于实时应用模式:
SELECT recovery_mode FROM v$archive_dest_status WHERE dest_id=2;
3. 测试切换(可选但重要)
在业务低峰期,进行一次切换测试,验证ADG的完整性。
1.主库切换为备库:ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;
2.原备库切换为主库:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
3.重启两个数据库,并重新开启Redo应用。
第四阶段:切换为ADG 备库只读模式
1.先停止 MRP
# 备库执行
alter database recover managed standby database cancel;
#这样会停止正在运行的恢复进程。
2.打开备库为只读
alter database open read only;
#此时数据库进入只读模式,可以供查询使用
3.重新启动恢复进程(实时应用)
#在只读模式下启用 redo 应用:
alter database recover managed standby database using current logfile disconnect from session;
#using current logfile → 表示启用实时应用(实时接收主库的 online redo)。
#disconnect from session → 表示恢复进程在后台运行,不依赖当前会话。
4.验证
#在备库查询
select open_mode, database_role from v$database;
#应该显示OPEN READ ONLY PHYSICAL STANDBY
#检查进程
select process, status, sequence# from v$managed_standby;
#应该看到MRP0 APPLYING_LOG ,同时用户可以在备库执行查询(只读)。
运维
🔹 主库 (Primary)
- 重启后状态:主库会自动进入 OPEN 状态,可以正常提供业务。
- 需要操作:通常不需要额外操作,确认归档和日志传输参数是否启用即可。
🔹 备库 (Standby)show parameter log_archive_dest_2; show parameter log_archive_dest_state_2; - 重启后状态:备库通常只会到mount状态,不会自动启动托管恢复进程(MRP)
- 恢复步骤
1. 如果是普通物理备库,在备库执行
• 启动 MRP 进程,接收并应用主库 redo。alter database recover managed standby database using current logfile disconnect from session;
• → 启用实时应用。
• → 后台运行,不依赖当前会话。2. 如果是 Active Data Guard (需要只读查询)
#在备库执行 alter database recover managed standby database cancel; -- 停止 MRP alter database open read only; -- 打开只读模式 alter database recover managed standby database using current logfile disconnect from session; #这样备库既能应用 redo,又能提供只读查询服务。3.验证
在备库检查状态#检查状态READ ONLY WITH APPLY PHYSICAL STANDBY select open_mode, database_role from v$database; #检查进程 select process, status, sequence# from v$managed_standby;、 #确认日志应用 select sequence#, applied from v$archived_log order by sequence#;