记一次麒麟 oracle 12c RAC安装迁移全过程

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 正式切换
  1. 关闭业务,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'
  1. 确认日志应用完毕
    --检查主备库创建的最后一个归档日志

    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;

确保两端一致

  1. 主库切换为备库
    检查主库切换状态,确保为to standby或session active

    select 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地址修改。
相关推荐
Mr. zhihao12 小时前
Redis 脑裂深度解析:Sentinel 与 Cluster 机制、流程及对比
数据库·redis·sentinel
努力攻坚操作系统12 小时前
MySQL 原理解析
数据库·mysql
数据库小学妹12 小时前
MySQL 字符集深度解析:utf8 vs utf8mb4 的底层差异与索引失效根因
数据库·经验分享·mysql
Daydream.V12 小时前
深入拆解 MySQL 锁机制:全局锁、表级锁、行级锁实战全解析
数据库·mysql·oracle·
小辰记事本12 小时前
从零读懂RDMA硬件排障:读数、看码、查计数器
运维·网络·数据库
JZC_xiaozhong13 小时前
企业微信集成OA、ERP与第三方应用:从“数据孤岛”到“流程闭环”
大数据·数据库·企业微信·etl工程师·持续集成·企业数据安全·数据集成与应用集成
一 乐13 小时前
个人博客系统|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·个人博客系统
光泽雨13 小时前
SqlDataAdapter.Fill(dt) 和SqlDataReader + dt.Load()的差异
数据库
迷枫71213 小时前
达梦数据库安全管理与访问控制
数据库