Oracle 12c RAC 跨平台迁移方案(ADG切换法)
1、需求概述
由于原有基础设备硬件老化,现采购新的硬件平台对原有平台进行替换。
本次实现目标
- 新购硬件服务器
- 2台中兴服务器部署麒麟V10 SP3操作系统(原系统是redhat)
- 1台中兴存储作为RAC集群共享存储
- 2台万兆交换机作为业务交换机及RAC心跳集群交换机
- 在新硬件平台部署Oracle 12c RAC集群
- 将原有Oracle 12c RAC集群数据迁移至新RAC平台
- 原平台作为备机使用,新RAC对外提供服务,沿用原有PUBLIC-IP、VIP、SCAN-IP、服务名、实例名
迁移保障要求
- 迁移后数据完整
- 极端故障可完整回退,数据不丢失
- 尽量缩短停机时间
2、迁移过程详细方案
迁移技术原理
本次迁移利用Oracle DataGuard容灾技术,将新RAC搭建为备库,待同步正常后,在确认时间窗口执行主备切换,完成新RAC上线;原有RAC转为备库使用。
dataguard基本架构如下图所示,PRIMARY DATABASE为主库, STANDBY DATABASE为备库,正常工作时,主库把REDO日志及归档日志通过网络发送到备库进行应用,主备关系正常时,备库可以以只读的方式打开,用于查询工作特定场景下可做为应用读写分离使用。

2.1 迁移流程概述

2.2 人员组织及时间安排
| 步骤与时间 | 参与人员 | 工作内容 |
|---|---|---|
| 新环境搭建 | 现场工程师 | 硬件环境搭建、RAC搭建、数据同步复制 |
| 切换环境准备阶段(2天) | 现场工程师、业主单位 | 1. 检查网络、存储、负载 2. 确认备份正常、主机时间同步 3. 下发停机通知 |
| 切换前(1小时) | 现场工程师 | 1. 系统/硬件检查 2. 关闭业务访问 3. 备份参数文件 4. 停机前增量/归档备份,记录SCN 5. 业务数据确认 |
| 切换中(1小时) | 现场工程师 | 1. 创建测试表、执行主备切换 2. 互换新旧RAC IP 3. 恢复DG同步 |
| 切换后测试(1小时) | 业主单位、软件维护方 | 1. 验证测试表数据 2. 业务系统与数据核对 |
| 异常回退(1.5小时) | 现场工程师 | 服务器/存储故障等极端情况执行全库恢复 |
2.3 迁移前准备
2.3.1 RAC搭建
安装包
- RAC集群:V840012-01.zip
- 数据库软件:V839960-01.zip
- OPatch:p6880880_122010_Linux-x86_64.zip
- 补丁:p28183653_122010_GRID_Linux-x86_64.zip
主机名及hosts规划
shell
192.168.128.222 rac1
192.168.128.223 rac2
192.168.128.224 rac1-vip
192.168.128.225 rac2-vip
10.10.10.103 rac1-priv
10.10.10.104 rac2-priv
192.168.128.221 jbj-scan
网络Bond规划
| 序号 | Bond模式 | Bond命令及使用网卡 | 作用 |
|---|---|---|---|
| 1 | 1热备 | Bond0(p10p1,p8p1) 两个网卡分别接到两个交换机 | 业务网卡 承载PUBLICIP/VIP/SCAN |
| 2 | 1热备 | Bond1(p10p2,p8p2) 两个网卡分别接到两个交换机 | 心跳网卡 承载RAC集群、ASM心跳及及内部通讯内存拷贝 |
| 配置示例如下: | |||
| 创建主备BOND0 |
shell
nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup
nmcli connection modify bond0 connection.autoconnect yes
添加p10p1到bond0
shell
nmcli connection add type bond-slave con-name bond0_1 ifname p10p1 master bond0
nmcli connection modify bond0_1 connection.autoconnect yes
添加p8p1到bond0
shell
nmcli connection add type bond-slave con-name bond0_2 ifname p8p1 master bond0
nmcli connection modify bond0_2 connection.autoconnect yes
设置IP地址、子网掩码
shell
nmcli connection modify bond0 ipv4.addresses 192.168.128.222/25
设置网关
shell
nmcli connection modify bond0 ipv4.gateway 192.168.128.129
系统依赖包安装
bash
rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
rpm -ivh glibc32-2.28-42.1.ky10.x86_64.rpm
rpm -ivh libnsl-2.28-98.p02.ky10.x86_64.rpm
yum install binutils gcc gcc-c++ glibc glibc-devel ksh libstdc++-devel libaio libaio-devel libXext libXtst libX11 libXau libxcb libXi make sysstat unixODBC unixODBC-devel zlib-devel elfutils-libelf elfutils-libelf-devel glibc-headers glibc-common kernel-headers libgcc libgomp libstdc++ numactl-devel sysstat libXau libdmx xorg-x11-utils xorg-x11-xauth libXv libXt libXmu libXxf86misc libXxf86dga libXxf86vm nfs-utils smartmontools -y
yum install libnsl2-devel-1.3.0-2.ky10.x86_64.rpm -y
内核参数 /etc/sysctl.conf
ini
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
用户限制 /etc/security/limits.conf
ini
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
oracle soft memlock 3145728
oracle hard memlock 3145728
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
用户与组创建
bash
groupadd -g 11001 oinstall
groupadd -g 11002 dba
groupadd -g 11003 oper
groupadd -g 11004 backupdba
groupadd -g 11005 dgdba
groupadd -g 11006 kmdba
groupadd -g 11007 asmdba
groupadd -g 11008 asmoper
groupadd -g 11009 asmadmin
groupadd -g 11010 racdba
useradd -u 11021 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper oracle
useradd -u 11022 -g oinstall -G asmadmin,asmdba,asmoper,dba grid
passwd grid
passwd oracle
目录创建
bash
mkdir -p /u01
mkdir -p /g01
chown -R grid:oinstall /g01
chown -R oracle:oinstall /u01
chmod -R 775 /u01/
chmod -R 775 /g01/
环境变量
grid用户修改/home/grid/.bash_profile。
另一节点修改ORACLE_SID=+ASM2
bash
export ORACLE_SID=+ASM1
export ORACLE_BASE=/g01/app/grid
export ORACLE_HOME=/g01/app/12.2.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
oracle用户修改/home/oracle/.bash_profile。
另一节点修改ORACLE_SID= ORCL2
bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1
SSH互信
bash
sh ssh_trust.sh -u grid -p '密码' -i "rac1,rac1-priv,rac2,rac2-priv"
sh ssh_trust.sh -u oracle -p '密码' -i "rac1,rac1-priv,rac2,rac2-priv"
ASM磁盘与多路径(中兴存储)
适配中兴存储,配置多路径软件聚合磁盘,以下是/etc/multipath.conf配置
bash
defaults {
user_friendly_names yes
}
blacklist {
wwid 3600508b1001c5d09c3f3bf226a610929 #rac1 localdisk
wwid 3600508b1001cafd7bae426906851bd49 #rac2 localdisk
}
multipaths {
multipath {
wwid 360024xxx6606273836800210000000003
alias asm_data_01
}
multipath {
wwid 360024xxx6606273836800210000000004
alias asm_ocr_01
}
multipath {
wwid 360024xxx6606273836800210000000005
alias asm_ocr_02
}
multipath {
wwid 360024xxx6606273836800210000000006
alias asm_ocr_03
}
multipath {
wwid 360024xxx6606273836800210000000007
alias asm_arch_01
}
}
devices {
device {
vendor "ZTE"
product "KINGSTOR"
path_grouping_policy multibus
prio const
path_checker tur
path_selector "queue-length 0"
hardware_handler "0"
failback immediate
rr_weight uniform
no_path_retry 20
rr_min_io_rq 1
flush_on_last_del yes
fast_io_fail_tmo 5
dev_loss_tmo 120
}
}
创建udev规则文件,修改dm设备权限
创建文件/etc/udev/rules.d/12-mulitpath-privs.rules,内容如下
bash
ENV{DM_NAME}=="asm_*",OWNER:="grid", GROUP:="asmadmin", MODE:="660"
重载生效配置
bash
udevadm control --reload
udevadm trigger
磁盘组规划为:
ORC磁盘组:asm_ocr_01、asm_ocr_02、asm_ocr_03
ARCH磁盘组:asm_arch_01
DATA磁盘组:asm_data_01
关闭透明大页
bash
cat/sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never //always现在为启用
cd /etc/default/
cp grub grub.bak
cat /etc/default/grub 修改添加transparent_hugepage=never
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's,release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=autord.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
生成配置
grub2-mkconfig -o/boot/efi/EFI/kylin/grub.cfg
configuration file ...
Found linux image:/boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image:/boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image:/boot/vmlinuz-0-rescue-a6225ccf9497470bb6051d6392773fc9
Found initrd image:/boot/initramfs-0-rescue-a6225ccf9497470bb6051d6392773fc9.img
done
reboot //重启服务器
cat/sys/kernel/mm/transparent_hugepage/enabled
always madvise [never] //现在为关闭
修改lib库问题
bash
find / -name libpthread_nonshared.a
cp /usr/lib/libpthread_nonshared.a /usr/lib64/
chmod 777 /usr/lib64/libpthread_nonshared.a
scp /usr/lib/libpthread_nonshared.a yxdb02:/usr/lib64/
修改SCP命令
bash
cd /usr/bin
mv scp scp.orig
vi /usr/bin/scp
/usr/bin/scp.orig -T $*
chmod 555 /usr/bin/scp
解压软件包
bash
su - grid
cd /soft
unzip -d /u01/app/12.2.0/grid V840012-01.zip
cd $ORACLE_HOME
mv OPatch/ OPatch_bak
cd /soft
unzip p6880880_122010_Linux-x86-64.zip -d /u01/app/12.2.0/grid/
unzip p28183653_122010_GRID_Linux-x86-64.zip -d /u01/app/12.2.0/grid/
chown -R grid:oinstall /u01/app/12.2.0/grid/
安装GI集群软件
修改/u01目录下所有cvu_config文件
增加
bash
CV_ASSUME_DISTID=KYV10
替换ZIP包
```bash
cp /usr/bin/unzip /u01/app/12.2.0/grid/bin/unzip
执行软件安装
```bash
./gridSetup.sh -applyPSU /u01/app/12.2.0/grid/28183653/
按指引一直下一步安装即可。详细过程略
安装DB软件
bash
unzip -d /u01/app/oracle/product/12.2.0/db_1 V839960-01.zip
替换ZIP包
bash
cp /usr/bin/unzip /u01/app/oracle/product/12.2.0/db_1/database/install/unzip
修改/u01目录下所有cvu_config文件
增加
bash
CV_ASSUME_DISTID=KYV10
执行安装
bash
./runInstaller
按指引一直下一步安装即可。详细过程略
创建数据库
建库之前修改cvu_config里文件内容为
CV_ASSUME_DISTID=OEL7 //原kyV10修改为OEL7
创建实例名为ORCL1/ ORCL2
数据库sys密码与原库一致
打开归档,归档目录为+ARCH
数据库文件存放位置+DATA/{ DB_UNIQUE_NAME }
对应Oracle DB_UNIQUE_NAME为ORCL_NEW
2.3.2 ADG环境搭建
grid用户编辑各个节点下
bash
$ORACLE_HOME/network/admin/listener.ora
2节点替换对应为SID_NAME= ORCL2
bash
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME= PLSExtProc)
(ORACLE_HOME = /u01/app/12.2.0/grid)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /u01/app/12.2.0/grid)
(SID_NAME= ORCL1)
)
)
配置完成后重载监听,Oracle用户编辑各个节点
$ORACLE_HOME/network/admin/tnsnames.ora
增加新RAC监听
bash
ORCL_NEW =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.225)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.203)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.204)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
在原生产库的Oracle用户
各个节点$ORACLE_HOME/network/admin/tnsnames.ora增加
bash
ORCL_NEW =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.225)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
b.修改新RAC节点参数
sql
alter system set db_file_name_convert='+DATA/ORCL_NEW ','+DATA/ ORCL' scope=spfile;
alter system set log_file_name_convert='+DATA','+DATA' scope=spfile;
alter system set fal_server=' ORCL' scope=spfile;
alter system set log_archive_config='DG_CONFIG=( ORCL, ORCL_NEW)' scope=spfile;
alter system set log_archive_dest_1='location=+ARCH valid_for=(all_logfiles,all_roles) db_unique_name= ORCL_NEW' scope=spfile;
alter system set log_archive_dest_2='service= ORCL ASYNC NOAFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=ORCL' scope=spfile;
alter system set log_archive_format='%t_%s_%r.dbf' scope=spfile;
alter system set standby_file_management='AUTO' scope=spfile;
alter system set db_files=3000 scope=spfile;
c.新RAC环境清理,
bash
su - oracle
srvctl stop database -d ORCL_NEW -o abort
su -- grid
asmcmd
ASMCMD> cd DATA/ ORCL_NEW
ASMCMD> rm -rf CONTROLFILE
ASMCMD> rm -rf DATAFILE
ASMCMD> rm -rf ONLINELOG
ASMCMD> mkdir CONTROLFILE
ASMCMD> mkdir DATAFILE
ASMCMD> mkdir ONLINELOG
d.RMAN全量复制
oracle用户登录新搭建的RAC1节点,startup nomount数据库
然后退出,登录RMAN进行数据复制
sql
rman target sys/ oracle @ ORCL auxiliary sys/oracle@ ORCL_NEW
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;
e.主库增加STANDBY日志以及修改参数
在当前的主库RAC上执行,添加standby日志
bash
alter database add standby logfile thread 1 group 11 ('+DATA') size 2048m;
alter database add standby logfile thread 1 group 12 ('+DATA') size 2048m;
alter database add standby logfile thread 1 group 13 ('+DATA') size 2048m;
alter database add standby logfile thread 1 group 14 ('+DATA') size 2048m;
alter database add standby logfile thread 1 group 15 ('+DATA') size 2048m;
alter database add standby logfile thread 2 group 21 ('+DATA') size 2048m;
alter database add standby logfile thread 2 group 22 ('+DATA') size 2048m;
alter database add standby logfile thread 2 group 23 ('+DATA') size 2048m;
alter database add standby logfile thread 2 group 24 ('+DATA') size 2048m;
alter database add standby logfile thread 2 group 25 ('+DATA') size 2048m;
在当前的主库RAC上执行,
sql
alter system set log_archive_config='DG_CONFIG=(ORCL,ORCL_STD,ORCL_STD_SZ, ORCL_NEW)' scope=both;
alter system set log_archive_dest_5='service= ORCL_NEW ASYNC NOAFFIRM valid_for=(online_logfiles,primary_role) db_unique_name= ORCL_NEW ' scope=both;
f.备库启动复制
oracle登录新搭建的RAC1节点,在sqlplus 下执行
bash
alter database recover managed standby database disconnect from session;
也可以打开备库切换到ADG模式
bash
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
alter database open;
alter database recover managed standby database using current logfile disconnect from session;
2.3.3 ADG参数优化
配置大页内存
bash
echo "vm.nr_hugepages = $(free -m|grep Mem |awk '{print int(($2*0.8*0.8)/2)}')" >> /etc/sysctl.conf
echo "* soft memlock $(free |grep Mem|awk '{print int($2*0.90*1024)}')" >> /etc/security/limits.conf
echo "* hard memlock $(free |grep Mem|awk '{print int($2*0.90*1024)}')" >> /etc/security/limits.conf
修改系统参数
bash
alter system set lock_sga=true scope=spfile;
重启服务器,检查大页内存配置情况
bash
grep Huge proc/meminfo
修改大小写敏感与原来一致
bash
alter system set sec_case_sensitive_logon=false scope=both;
同时注意生产端sqlnet.ora里是否配置了低版本version连接,如果有也同样修改
其它参数参照生产进行适当调整,如SGA/PGA等参数。
2.3.4 RAC切换测试
| 序号 | 测试内容 | 测试方法 | 预期结果 |
|---|---|---|---|
| 1 | 手动进行scan-ip切换检查 | 先通过SQLPLUS或工具连接SCAN登录数据库,通过执行srvctl relocate scan -i 1 -n rac2 切换浮动IP | 重新登录数据库可以恢复SQL执行 |
| 2 | 手动关闭其中1个RAC节点 | 直接关机或停止某一个节点CRS服务 执行: Crsctl stop crs | 重新登录数据库可以恢复SQL执行 |
2.4 迁移过程步骤
2.4.1 切换前准备
- 检查主备状态、坏块、DG参数、归档、GAP、延时
- 停机前全量/增量备份,记录SCN
- 备份参数文件
- 确认应用连接串、DBLINK
检查命令
a.切换前为保证数据库及同步都为正常状态,需要做如下检查:
确保主库无异常,实例状态为open
sql
select instance_name,status from gv$instance;
检查数据库打开模式
OPEN_MODE正常状态为READ WRITE
确认主库DATABASE_ROLE正常状态为PRIMARY
sql
select INST_ID,NAME,open_mode,LOG_MODE,DATABASE_ROLE,PROTECTION_MODE,DB_UNIQUE_NAME from gv$database;
检查主备库是否有坏块,在主备库检查数据库坏块
sql
Select * from v$database_block_corruption;
Select * from v$nonlogged_block;
主备库的DG参数检查确认
sql
show parameter db_file_name_convert
show parameter log_file_name_convert
show parameter standby_file_management
show parameter fal_client
show parameter fal_server
show parameter log_archive_config
show parameter log_archive_dest_2
show parameter log_archive_dest_2_state
检查主库归档设置
sql
col DEST_NAME for a20
col DESTINATION for a25
col ERROR for a15
col ALTERNATE for a20
set lines 1000
select DEST_NAME,DESTINATION,ERROR,ALTERNATE,TYPE,status,VALID_TYPE,VALID_ROLE from V$ARCHIVE_DEST where STATUS <>'INACTIVE';
检查日志传输状态
sql
col DEST_NAME for a30
select DEST_ID,DEST_NAME,STATUS,RECOVERY_MODE from V$ARCHIVE_DEST_STATUS where DEST_NAME='LOG_ARCHIVE_DEST_5';
检查主库、备库确定有足够的归档进程
log_archive_max_processes值需大于等于4,但也不会太大。
sql
show parameter LOG_ARCHIVE_MAX_PROCESSES
查看redo log情况
sql
select group#,thread#,sequence#,members,archived,status,bytes/1024/1024 M from v$log order by 1;
查看standby日志情况
sql
col MEMBER for a50
select GROUP#,THREAD#,BYTES/1024/1024 M,STATUS from v$STANDBY_log;
备库检查数据库是否有gap
检查数据库是否有gap,正常没有
sql
select thread#,low_sequence#,high_sequence# from v$archive_gap;
检查下当前应用进程是否有延时
sql
column name format a13;
column value format a20;
column unit format a30;
column TIME_COMPUTED format a30;
select name,value,unit,time_computed from v$dataguard_stats where name in ('transport lag','apply lag');
select * from v$dataguard_process;
确定主备数据库临时文件一致,且所有的数据文件都是online的
sql
col FILENAME for a50
SELECT TMP.NAME FILENAME,BYTES/1024/1024 M,TS.NAME TABLESPACE FROM V$TEMPFILE TMP, V$TABLESPACE TS WHERE TMP.TS#=TS.TS#;
SELECT NAME FROM V$DATAFILE WHERE STATUS='OFFLINE';
如果存储offline的数据文件,且是切换为主库所需要的数据文件,需要online
sql
SQL> ALTER DATABASE DATAFILE 'datafile-name' ONLINE;
主库验证当前是否可转换为备库
检查主库 switchover_status状态,正常结果为TO STANDBY或SESSION ACTIVE
sql
select switchover_status from v$database;
停机前备份
如果客户有备份设备或备份软件,进行一次完全备份。
如果客户没有备份设备,尽量协调存储空间,手动做一次RMAN全备份,存放在本地磁盘上。
bash
rman target /
backup as compressed backupset incremental level 0 database plus archivelog delete all input;
backup current controlfile;
备份生产参数文件
执行
bash
create pfile='/home/oracle/pfile2025.bak' from spfile
确认生产端应用的连接串以及有没有连到生产的DBLINK
1.与应用方沟通现有生产应用连接数据库字符串写的是SCAN-IP,还是两个VIP。是否配置了TAF,有无DG故障转移配置参数
2.与应用方沟通,有哪些其它库通过DBLILNK连接到现有生产库,DBLINK连接是否使用TNS名或者VIP/SCANIP/PUBLIC-IP
2.4.2 正式切换
- 关闭业务,kill LOCAL=NO进程
业主单位下达业务停机指令,先关闭所有业务系统。
主库数据库侧两节点都执行KILL杀死LOCAL=NO进程
bash
ps -ef |grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9
immediate关闭实例2,只保留1个节点,记录当前节点的SCN。
bash
su -- oracle
srvctl stop instance -d ORCL -i ORCL2 -o immediate
记录SCN
sql
col current_scn for 99999999999999999
set num 50
select current_scn from v$database;
创建一个测试表create emp_2025 as select * from scott.emp
手动备份一次最后1天的归档日志
bash
BACKUP ARCHIVELOG ALL UNTIL TIME 'SYSDATE - 1' FORMAT '/home/oracle/arch_%d_%T_%s_%p.bkp'
-
确认日志应用完毕
--检查主备库创建的最后一个归档日志select thread#, max(sequence#) "Last Primary Seq Generated"
from gvarchived_log val, gvdatabase vdb
where val.resetlogs_change# = vdb.resetlogs_change#
group by thread# order by 1;
--备库检查日志应用情况
select thread#, max(sequence#) "Last Standby Seq Applied"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
and val.applied in ('YES','IN-MEMORY')
group by thread# order by 1;
确保两端一致
-
主库切换为备库
检查主库切换状态,确保为to standby或session activeselect open_mode,protection_mode,database_role,switchover_status from v$database;
在主库侧执行切换
alter database commit to switchover to physical standby with session shutdown;
在新RAC侧单实例节点执行
alter database commit to switchover to primary with session shutdown;
--启动备库RAC为主库
SQL> SHUTDOWN IMMEDIATE;
SQL> startup;
2.4.3 切换RAC IP地址
两套RAC全部执行
crsctl stop crs
关停所有集群,替换IP地址、替换hosts文件
把新旧RAC的IP对换
192.168.128.205 rac1-vip
192.168.128.206 rac2-vip
10.10.10.101 rac1-priv
10.10.10.102 rac2-priv
192.168.128.203 rac1
192.168.128.204 rac2
192.168.128.202 rac-scan
192.168.128.224 rac1-vip
192.168.128.225 rac2-vip
10.10.10.103 rac1-priv
10.10.10.104 rac2-priv
192.168.128.222 rac1
192.168.128.223 rac2
192.168.128.221 rac-scan
修改IP及HOSTS文件后启动Crs
crsctl start crs
各个节点分别root用户执行修改
/u01/app/11.2.0/grid/bin/srvctl stop scan_listener
/u01/app/11.2.0/grid/bin/srvctl stop scan
/u01/app/11.2.0/grid/bin/srvctl modify scan --n <新SCAN-IP>
/u01/app/11.2.0/grid/bin/srvctl start scan_listener
/u01/app/11.2.0/grid/bin/srvctl config scan
最后检查数据库local_listener配置是否正确,如不正确参考下方命令修改
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.122)(PORT=1521))))' scope=both sid='orcl1';
alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.123)(PORT=1521))))' scope=both sid='orcl2';
2.4.4 修改ADG环境
对换监听配置文件中的IP地址
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.225)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
ORCL_NEW =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.203)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.128.204)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
修改DG配置参数
alter system set log_archive_dest_1='location=+ARCH valid_for=(all_logfiles,all_roles) db_unique_name= ORCL_NEW' scope=spfile;
alter system set log_archive_dest_2='service= ORCL ASYNC NOAFFIRM valid_for=(online_logfiles,primary_role) db_unique_name=ORCL' scope=spfile;
2.4.5 恢复ADG环境
启动ADG环境,检查主备库状态,确保正常,启动命令
startup;
alter database recover managed standby database using current logfile disconnect from session;
确认主库DATABASE_ROLE正常状态为PRIMARY
select INST_ID,NAME,open_mode,LOG_MODE,DATABASE_ROLE,PROTECTION_MODE,DB_UNIQUE_NAME from gv$database;
检查下当前应用进程是否有延时
column name format a13;
column value format a20;
column unit format a30;
column TIME_COMPUTED format a30;
select name,value,unit,time_computed from v$dataguard_stats where name in ('transport lag','apply lag');
select * from v$dataguard_process;
检查主备库创建的最后一个归档日志
select thread#, max(sequence#) "Last Primary Seq Generated"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
group by thread# order by 1;
备库检查日志应用情况,同步的情况下,返回的结果一致
select thread#, max(sequence#) "Last Standby Seq Applied"
from gv$archived_log val, gv$database vdb
where val.resetlogs_change# = vdb.resetlogs_change#
and val.applied in ('YES','IN-MEMORY')
group by thread# order by 1;
2.4.6 数据与业务验证
1、检查emp_2025是否存在,数据准确
2、业务维护方进行系统验证
3、回退方案
如生极端情况导致数据库损坏,使用之前准备的全量备份+记录的SCN值,进行rman恢复
sql
startup nomount
rman target /
restor controlfile from 'xx';
sql 'alter database mount';
catalog start with '/home/oracle/';
run{
allocate channel c1 device type disk;
set until scn 记录的SCN号;
restore database;
recover database ;
}
回退IP地址修改。