RTT ADG 部署方案
Active Data Guard 同城灾备部署实践:主库监听与参数调整、standby redo log、RMAN 在线复制备库、switchover/failover 切换演练及 oci 客户端替换。
在 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 为例:
- 将安装包上传到服务器,校验 md5 并解压出 instantclient_11_2 目录;
- 替换 $RTT_HOME 下的 oci:
cd $RTT_HOME
mv oci oci20230218
# 将解压的 instantclient_11_2 放到 $RTT_HOME 下并改名为 oci
mv instantclient_11_2 oci
- 替换后按《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 个;
- 测试结果均正常,无遗留问题。