ORACLE 配置ADG

By | 2025-11-25

第一阶段:主库配置

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 状态,可以正常提供业务。
  • 需要操作:通常不需要额外操作,确认归档和日志传输参数是否启用即可。
    show parameter log_archive_dest_2;
    show parameter log_archive_dest_state_2;
    
    🔹 备库 (Standby)
  • 重启后状态:备库通常只会到mount状态,不会自动启动托管恢复进程(MRP)
  • 恢复步骤

    1. 如果是普通物理备库,在备库执行

    alter database recover managed standby database using current logfile disconnect from session;
    
    • 启动 MRP 进程,接收并应用主库 redo。
    • → 启用实时应用。
    • → 后台运行,不依赖当前会话。

    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#;
    
分类: IT 标签: