概述
最近有个客户在咨询adg跨版本相关问题,大伙都知道不能跨数据库版本,那11.2.0.1到11.2.0.4呢?12.2.0到19c呢?和几个同事讨论后,发现大家都思考过这个问题,但是又不能确定正确答案,引发我的好奇心,确切的说触发知识盲区了hhhh;希望读者看本篇blog能有底气的回答下面的问题。
Oracle ADG跨数据库版本可以搭建吗?
Oracle ADG跨平台版本可以搭建吗?
跨版本搭建ADG后会出现什么问题?
跨版本搭建ADG后是否可以真正实现数据迁移?
目录
一、跨数据库版本搭建ADG
环境:
主库:12.2.0.1.0 os:redhat 7.6
备库:19.5.0.0.0 os:redhat 7.6
技能比较熟练的读者就可以跳过1.1章节
使用两种搭建方法来测试是否能完成跨数据库版本搭建
1.1 前期准备
这里的前期准备工作有参数配置、日志组调整、tns配置等,不管是哪个种方式搭建都需要做的;
1.1.1 归档模式和附加日志
shutdown immediate
startup mount
alter database archivelog;
alter database open;
alter database force logging;
检查:
SQL> select log_mode,force_logging from v$database;
LOG_MODE FORCE_LOGGING
------------ ---------------------------------------
ARCHIVELOG YES
1.1.2 添加1621静态监听
--集群添加
srvctl add listener -l LSNR_DG -p 1621
--- listener.ora 添加以下内容
SID_LIST_LSNR_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = hygge) --根据实际更改
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) --根据实际更改
(SID_NAME = hygge1) --根据实际更改
)
)
--打开监听
srvctl start listener -l lsnr_dg
--检查监听状态
lsnrctl status
1.1.3 配置tnsname.ora
hyggeold =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.218.51)(PORT = 1621))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hygge)
)
)
hyggenew =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.218.21)(PORT = 1621))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.218.23)(PORT = 1621))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hygge)
)
)
--检查
tnsping hyggeold
tnsping hyggenew
1.1.4 修改主库参数
这里对每个参数是什么意思,怎么设置就不赘述了。
alter system set standby_file_management=AUTO scope=both sid='*';
alter system set log_archive_config='DG_CONFIG=(hygge, standby)' scope=both sid='*';
alter system set log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hygge' scope=both sid='*';
alter system set log_archive_dest_2='SERVICE=hyggenew LGWR SYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' scope=both sid='*'
alter system set fal_server=hyggenew scope=both sid='*';
alter system set fal_client=hyggeold scope=both sid='*';
alter system set db_file_name_convert='+DATA','+DATA' scope=spfile sid='*'; --位置都是+data下其实也可以不用设置这个参数
alter system set log_file_name_convert='+DATA/HYGGE/ONLINELOG/','+DATA/STANDBY/ONLINELOG/' scope=spfile sid='*';
1.1.5 添加standby 日志
在主库添加就可以了
alter database add standby logfile thread 1 group 11 size 200M;
alter database add standby logfile thread 1 group 12 size 200M;
alter database add standby logfile thread 1 group 13 size 200M;
alter database add standby logfile thread 1 group 14 size 200M;
1.1.6 备库上操作
---备库加库
srvctl add database -db standby -oraclehome /u01/app/oracle/product/19.3.0/dbhome_1 -diskgroup DATA,FRA -dbname hygge
--- 添加实例
srvctl add instance -db standby -instance standby1 -n hygge1
1.1.7 拷贝密码文件
均在asm中操作
pwcopy pwdyngedb.256.1037464551 /home/grid/pwdhygge --主服务器复制出来
scp pwdhygge 192.168.218.21:/home/grid/pwdstandby --scp传输密码文件
pwcopy /home/grid/pwdstandby +DATA --dbuniquename standby --备服务器复制进去
--将密码文件注册到数据库资源中
srvctl modify database -db standby -pwfile '+DATA/STANDBY/PASSWORD/pwdstandby.322.1044481127'
1.1.8 生产备库参数文件
将主库参数文件中参数修改后,传到备库
--编辑参数文件,并对参数文件进行修改(主库操作)
create pfile='/home/oracle/1.ora' from spfile;
scp /home/oracle/1.ora hygge:/home/oracle/1.ora
根据修改后的参数文件启动到nomount(备库)
startup nomount pfile='/home/oracle/1.ora';
1.2 duplicate方式
[oracle@hygge1 ~]$ rman target sys/123456@hyggeold auxiliary sys/123456@hyggenew nocatalog
Recovery Manager: Release 19.0.0.0.0 - Production on Tue Jun 30 21:41:28 2020
Version 19.5.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-06429: TARGET database is not compatible with this version of RMAN
RMAN-06618: RMAN client and database version mismatch; indicated database version is 12.2.0.1
由于oracle的版本不同,就不能使用rman duplicate搭建。
1.3 异机恢复的方式
异机恢复就是使用rman的全库备份恢复来搭建adg
1.3.1 主库上全库备份
--全部备份,如果库很大可以压缩
backup database format '/home/oracle/backup/%U.bak';
--待全库备份完成后,对控制文件进行备份
backup current controlfile for standby format'/home/oracle/backup/std_control01.ctl';
将备份集通过scp传到备库服务器
scp /home/oracle/backup/* 192.168.218.21:/home/oracle/backup/
1.3.2 在19c的软件上恢复全库
先恢复控制文件(注意,恢复后将参数文件中的控制文件名字改成asm实际的名字)
restore standby controlfile from '/home/oracle/backup/std_control01.ctl';
--然后将库启到mount状态
alter database mount;
然后恢复数据文件
run {
SET NEWNAME FOR DATABASE TO '+DATA';
restore database;
switch datafile all;
recover database;
}
1.3.3 应用日志检查是否同步
成功应用上日志
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
日志传输和应用均无延迟
NAME VALUE UNIT TIME_COMPUTED
------------------------- -------------------- ------------------------------ ------------------------------
transport lag +00 00:00:00 day(2) to second(0) interval 06/30/2020 22:16:10
apply lag +00 00:00:00 day(2) to second(0) interval 06/30/2020 22:16:10
进程状态也是正常的
SQL> select process,client_process,THREAD#, sequence#,status from v$managed_standby;
PROCESS CLIENT_P THREAD# SEQUENCE# STATUS
--------- -------- ---------- ---------- ------------
DGRD N/A 0 0 ALLOCATED
ARCH ARCH 0 0 CONNECTED
DGRD N/A 0 0 ALLOCATED
ARCH ARCH 1 24 CLOSING
ARCH ARCH 0 0 CONNECTED
ARCH ARCH 1 23 CLOSING
RFS Archival 1 0 IDLE
RFS LGWR 1 25 IDLE
RFS UNKNOWN 0 0 IDLE
MRP0 N/A 1 25 APPLYING_LOG
10 rows selected.
主库日志应用序列号,也是与备库正常相差小于等于1
DB Role THREAD# MAX(SEQUENCE#)
--------- ---------- --------------
Primary : 1 26
Standby : 1 25
主库主动切换日志,观察备库alert日志也有变化
2020-06-30T22:18:17.734556+08:00
rfs (PID:51571): Selected LNO:12 for T-1.S-27 dbid 4195110742 branch 1044439066
2020-06-30T22:18:17.738354+08:00
MRP0 (PID:54199): Media Recovery Waiting for T-1.S-27 (in transit)
2020-06-30T22:18:17.770535+08:00
ARC0 (PID:51517): Archived Log entry 24 added for T-1.S-26 ID 0xfa0ba753 LAD:1
2020-06-30T22:18:17.775983+08:00
Recovery of Online Redo Log: Thread 1 Group 12 Seq 27 Reading mem 0
Mem# 0: +DATA/STANDBY/ONLINELOG/group_12.379.1044482047
Mem# 1: +DATA/STANDBY/ONLINELOG/group_12.341.1044482047
1.3.4 异机恢复搭建跨平台adg存在的问题
无法正常将备库open(read only)
SQL> alter database open read only
2 ;
alter database open read only
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
Process ID: 51532
Session ID: 3186 Serial number: 36053
正因为无法open,也无法查询和验证备库数据
二、跨平台搭建ADG
这个跨平台异构搭建adg,官方已经有所支持,所支持列表如下:
在物理 Data Guard 中对异构主备系统的支持 (Doc ID 1602437.1)
三、跨版本搭建adg无法open处理
由于从主库12.2恢复到19.5的软件上,需要进行数据库升级处理;但是由于是备库,所以必须得强制切换成主库后再做升级。
3.1 强制failover备库
--停止应用恢复模式
alter database recover managed standby database finish;
--转换为primary db
alter database commit to switchover to primary;
3.2 升级备库版本
--升级必须将这个参数成false
ALTER SYSTEM SET CLUSTER_DATABASE=FALSE scope=spfile ;
-- 将备库已升级模式启动
alter database open upgrade;
--跑升级脚本
@?/rdbms/admin/catupgrd.sql;
cd $ORACLE_HOME/rdbms/admin
$ORACLE_HOME/perl/bin/perl catctl.pl catupgrd.sql
这个升级脚本跑了2个多小时!
总结
跨版本搭建oracle adg可以通过异机恢复实现(adg备库无法open,adg部分功能无法实现)
跨平台搭建oracle adg在官方支持范围内也是可以实现
测试中oracle adg跨版本的主备数据是能同步的
oracle adg跨版本搭建后无法open,只能通过切换主库后upgrade拉起,可以作为数据迁移+版本升级的参考方案,但是慎用,毕竟oracle人家没官方说能这么玩。