在 Oracle 11g 升级 19c 完成后(见《Oracle 升级 19c 实施方案》),为主备库部署 Active Data Guard 同城灾备(主中心 → 备中心),备库以 READ ONLY WITH APPLY 方式打开,可承载只读查询。本文基于 Oracle 19c(19.13)实践。

一、环境信息

项目 主库(源端) 备库(目标端)
操作系统 linux linux
数据库版本 19.13.0.0.0 19.13.0.0.0
IP 地址 192.168.66.71 192.168.35.71
ORACLE_SID rtt rtt
数据文件位置 /data/ora19c/oradata/RTT/ 同左
归档日志位置 /data/ora19c/oradata/RTT/archive 同左

二、主库(源端)参数调整

2.1 配置监听 listener.ora

cd $ORACLE_HOME/network/admin/
vim listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.71)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = rtt)
      (SID_NAME = rtt)
      (ORACLE_HOME = /data/ora19c/app/oracle/product/19.0.0/dbhome_1)
    )
  )

启动监听:

lsnrctl start

2.2 配置 tnsnames.ora

cd $ORACLE_HOME/network/admin/
vim tnsnames.ora
rtt =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.66.71)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rtt)
    )
  )

rtt_disa =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.35.71)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rtt)
    )
  )

测试:

tnsping rtt
tnsping rtt_disa

2.3 创建归档日志文件位置

cd /data/ora19c/oradata/RTT
mkdir archive

2.4 检查归档模式

sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
SQL> select db.NAME, db.LOG_MODE, db.FORCE_LOGGING from v$database db;

2.5 开启归档模式和强制日志模式

SQL> alter database force logging;
SQL> alter database archivelog;
SQL> select db.NAME, db.LOG_MODE, db.FORCE_LOGGING from v$database db;   -- 确认已开启

2.6 创建 standby redo log

官方要求:每个备用重做日志文件的大小至少与主库最大的 redo log 一样大,每个重做线程的 standby redo 组数至少比主库 redo 组多一个。本环境主库 redo 为 1G,故 standby redo log 大小同为 1G,共创建 4 组(比主库 3 组多 1 组):

alter database add standby logfile group 4 ('/data/ora19c/oradata/RTT/standby_log4.log') size 1G;
alter database add standby logfile group 5 ('/data/ora19c/oradata/RTT/standby_log5.log') size 1G;
alter database add standby logfile group 6 ('/data/ora19c/oradata/RTT/standby_log6.log') size 1G;
alter database add standby logfile group 7 ('/data/ora19c/oradata/RTT/standby_log7.log') size 1G;

2.7 创建 pfile

SQL> create pfile from spfile;

2.8 修改参数配置

cd $ORACLE_HOME/dbs/
cp -a initrtt.ora initrtt.ora.20230218
vim $ORACLE_HOME/dbs/initrtt.ora

在文件末尾追加以下参数:

*.db_unique_name='rtt'
*.log_archive_config='dg_config=(rtt,rtt_disa)'
*.log_archive_dest_1='location=/data/ora19c/oradata/RTT/archive valid_for=(all_logfiles,all_roles) db_unique_name=rtt'
*.log_archive_dest_2='service=rtt_disa lgwr sync noaffirm valid_for=(online_logfiles,primary_role) db_unique_name=rtt_disa'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.fal_server='rtt_disa'
*.fal_client='rtt'
*.log_file_name_convert='/data/ora19c/oradata/RTT','/data/ora19c/oradata/RTT/redo'
*.standby_file_management='auto'

同步模式说明:采用最高可用模式(sync noaffirm)。同城灾备网络延迟低,不会造成很大延迟;若后续出现因同步问题导致性能下降、影响正常业务落库,可调整为最大性能模式(async),但异步无法确保零数据丢失,具体影响需根据网络时延评估。

重启数据库并创建 spfile:

sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup pfile='/data/ora19c/app/oracle/product/19.0.0/dbhome_1/dbs/initrtt.ora'
SQL> create spfile from pfile;

2.9 传送文件到备库

cd $ORACLE_HOME/dbs
scp orapwrtt initrtt.ora 192.168.35.71:$ORACLE_HOME/dbs
# 若 22 端口无访问策略,可通过虚拟桌面复制过去

三、备库(目标端)配置

3.1 配置监听

cd $ORACLE_HOME/network/admin
vim listener.ora

内容同主库,HOST 改为备库 IP:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.35.71)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = rtt)
      (SID_NAME = rtt)
      (ORACLE_HOME = /data/ora19c/app/oracle/product/19.0.0/dbhome_1)
    )
  )
lsnrctl start

3.2 配置 tnsnames.ora

内容同主库(rtt / rtt_disa 两个条目,指向各自 IP),配置后测试:

tnsping rtt
tnsping rtt_disa

3.3 创建归档目录与 standby redo 目录

mkdir -p /data/ora19c/oradata/RTT/archive
mkdir -p /data/ora19c/oradata/RTT/redo

3.4 修改参数配置

cd $ORACLE_HOME/dbs/
cp -a initrtt.ora initrtt.ora.20230218
vim initrtt.ora

修改为以下参数(db_unique_name 改为 rtt_disa,dest_2 指向主库):

*.db_unique_name='rtt_disa'
*.log_archive_config='dg_config=(rtt,rtt_disa)'
*.log_archive_dest_1='location=/data/ora19c/oradata/RTT/archive valid_for=(all_logfiles,all_roles) db_unique_name=rtt_disa'
*.log_archive_dest_2='service=rtt lgwr sync noaffirm valid_for=(online_logfiles,primary_role) db_unique_name=rtt'
*.log_archive_dest_state_1=enable
*.log_archive_dest_state_2=enable
*.fal_server='rtt'
*.fal_client='rtt_disa'
*.standby_file_management='auto'

3.5 启动主库、备库 nomount

主库:

sqlplus / as sysdba
SQL> startup open;

备库(先创建审计文件目录):

mkdir -p /data/ora19c/app/oracle/admin/rtt/adump
sqlplus / as sysdba
SQL> startup nomount;

3.6 RMAN 在线复制备库

使用 RMAN 连接主备库,通过 duplicate ... from active database 直接在线复制,无需预先备份,主库全程零停机:

rman
RMAN> connect target sys@rtt;
RMAN> connect auxiliary sys@rtt_disa;
RMAN> run {
  allocate channel ch001 type disk;
  allocate channel ch002 type disk;
  allocate channel ch003 type disk;
  allocate channel ch004 type disk;
  allocate auxiliary channel ch005 type disk;
  allocate auxiliary channel ch006 type disk;
  duplicate target database for standby from active database nofilenamecheck using compressed backupset;
  release channel ch001;
  release channel ch002;
  release channel ch003;
  release channel ch004;
  release channel ch005;
  release channel ch006;
}

3.7 验证备库状态并启用日志应用

SQL> select open_mode from v$database;                     -- 应为 MOUNTED
SQL> alter database open;                                   -- 打开备库
SQL> alter database recover managed standby database disconnect from session;
SQL> select open_mode from v$database;                     -- READ ONLY WITH APPLY 为正常

3.8 切换归档验证同步

SQL> alter system archive log current;
-- 主库查询
SQL> select max(sequence#) from v$archived_log;
-- 备库查询
SQL> select max(sequence#) from v$archived_log;

两者序列号一致,说明同步生效。

四、主备切换操作

4.1 正常切换(switchover)

原主库切换为备库:

-- 查看当前是否可以切换角色
SQL> select switchover_status from v$database;
SQL> select name, open_mode, switchover_status from v$database;
SQL> alter system switch logfile;
SQL> alter system archive log current;
SQL> alter database commit to switchover to physical standby with session shutdown;
SQL> shutdown immediate;
SQL> startup mount;
SQL> select switchover_status from v$database;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect from session;

原备库提升为主库:

SQL> alter database commit to switchover to primary with session shutdown wait;
SQL> alter database open;
SQL> select database_role, switchover_status from v$database;

4.2 主库故障,备库接管(failover)

在备库上执行:

SQL> alter database recover managed standby database finish;
SQL> alter database commit to switchover to primary;
SQL> select database_role, switchover_status from v$database;
SQL> select database_role, switchover_status, open_mode from v$database;
SQL> alter database open;

五、替换 oci 库

ADG 部署完成后,应用侧需替换 Oracle Instant Client 以正确连接 19c/ADG。以下以 instantclient-basiclite-linux.x64-11.2.0.4.0.zip 为例:

  1. 将安装包上传到服务器,校验 md5 并解压出 instantclient_11_2 目录;
  2. 替换 $RTT_HOME 下的 oci:
cd $RTT_HOME
mv oci oci20230218
# 将解压的 instantclient_11_2 放到 $RTT_HOME 下并改名为 oci
mv instantclient_11_2 oci
  1. 替换后按《Oracle 升级 19c 实施方案》6.2 检查项,使用 ldd 检查可执行文件动态库依赖路径是否正确。

六、升级与部署验证结论

升级与 ADG 部署完成后进行了系统级回归测试(测试设计 2023/01/28–01/30,功能与接口测试 2023/01/31–02/06,总结评审 2023/02/07–02/08):

  • 编制测试案例 121 个,通过率 100%;
  • 提交缺陷单 0 个,遗留问题 0 个;
  • 测试结果均正常,无遗留问题。