💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨
💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解✌️
💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖

在Oracle数据库架构的演进过程中,从传统的单机部署模式平滑过渡到高可用性、高性能的RAC(Real Application Clusters)集群环境,是提升系统稳定性与扩展性的重要选择。当架构变成RAC后,如何确保应用层无需进行大规模的代码修改,即可无缝对接新的数据库集群环境,成为了迁移过程中不可忽视的挑战。
在此背景下,将原单机数据库的IP地址在RAC环境中映射为SCAN(Single Client Access Name)IP,成为了一种高效且优雅的解决方案。 RAC中的SCAN IP设计初衷是为了简化客户端对RAC集群的访问,它作为集群的虚拟入口点,对外部应用隐藏了集群内部的复杂性和动态性 。这意味着,原单机数据库的IP地址映射为SCAN IP后,应用层也就无需直接修改连接数据库的IP地址了,而是通过指向SCAN IP来透明地访问集群中的任何数据库实例,从而大大降低了迁移的复杂度和对业务连续性的影响。
需要注意 修改为SCAN IP要确保原单机的IP下线,不然会冲突,SCAN IP可以理解为虚拟IP,所以不涉及在硬件网卡上修改 。
需求:
公司因为单机Oracle的瓶颈和需要实现负载均衡,所以通过DG的方式将单机的数据全量同步到了RAC中,但业务层面是通过将连接数据库的IP写到代码中的,新RAC的IP和原单机IP不一致,所以需要逐个修改,为了减少修改IP的工作量,需要将单机对外访问的IP变更为RAC集群的SCAN IP。目前单机Oracle数据库对外访问的IP地址为110.120.100.15,当前新搭建的RAC集群SCAN IP地址为110.120.100.14,将110.120.100.15变更为RAC集群的SCAN IP,并且为新的SCAN IP设置新域名。
任意节点的grid用户上执行:
[grid@rac1 ~]$ srvctl stop scan_listener ###停止Cluster Resources组件的ora.LISTENER_SCAN1.lsnr
[grid@rac1 ~]$ srvctl stop scan ###停止Cluster Resources组件的ora.scan1.vip(需要先停scan_listener,如果先停scan,报because that would require stopping or relocating 'ora.LISTENER_SCAN1.lsnr')
小提示💥:组件scan_listener和scan关系
1)scan_listener组件控制着远程监听LISTENER_SCAN1的启停状态
2)scan组件控制着远程监听LISTENER_SCAN1的scan ip、域名
节点一root用户执行:
[root@rac1 ~]# vi /etc/hosts ###建议只修改新的scan ip,域名不建议修改,因为修改了域名所有实例都要修改remote_listener参数,通过新的域名才能映射到新的ip上才能注册在scan监听上,不然实例不会注册新的scan ip和域名上。
#scan 删除
110.120.100.14 racscan
#scan 新增
110.120.100.15 racscanip
节点二root用户执行:
[root@rac2 ~]# vi /etc/hosts ###建议只修改新的scan ip,域名不建议修改,因为修改了域名所有实例都要修改remote_listener参数,通过新的域名才能映射到新的ip上才能注册在scan监听上,不然实例不会注册新的scan ip和域名上。
#scan 删除
110.120.100.14 racscan
#scan 新增
110.120.100.15 racscanip
修改OCR注册信息(任意节点使用root用户):
[root@rac1 ~]# su - root
[root@rac1 ~]# cd /liu_data/oracle11g/app/11.2.0/grid/bin ###进入到grid用户的$ORACLE_HOME/bin路径下
[root@rac1 bin]# ./srvctl modify scan -n racscanip ### -n后面跟scan_name就是scan ip后面写的域名,如果还写之前的racscan就会报PRCS-1016 : Failed to resolve Single Client Access Name racscan,因为oracle会自动找到/etc/hosts对应域名的ip。
[root@rac1 bin]# ./srvctl config scan
注意:指定了域名,oracle会自动将/etc/hosts对应域名的ip找到,指定为scan ip

[root@rac1 bin]# ./srvctl start scan ###启动Cluster Resources组件的ora.scan1.vip
[root@rac1 bin]# ./srvctl start scan_listener ###启动Cluster Resources组件的ora.LISTENER_SCAN1.lsnr
[root@rac1 bin]# ./srvctl status scan

[root@rac1 bin]# ./crsctl status resource -t

登录到节点二:因为LISTENER_SCAN1监听在节点二上,所以需要在节点二上查看监控的情况
[root@rac2 ~]# su - grid
[grid@rac2 ~]$ lsnrctl status LISTENER_SCAN1 ###由于/etc/hosts文件的scan ip域名之前是racscan,现在变为了racscanip,那么数据库中的remote_listener参数也要变动,通过新的域名才能映射到新的ip上才能注册在scan监听上,不然实例不会注册新的scan ip和域名上。

节点一的oracle用户上查看:
SQL> show parameter listener
local_listener:实例liudbyw1只是本地实例(LISTENER),所以只需要注册到本地监听上,ip是本机虚拟ip
remote_listener:用于注册在scan监听上(LISTENER_SCAN1),scan监听用于连接多个实例所以要注册上去
注:remote_listener中的racscan为/etc/hosts的域名,通过域名映射到ip(也是就scan ip),那么就实例就注册到了LISTENER_SCAN1(LISTENER_SCAN1注册的是scan ip)上了,如果/etc/hosts的racscan域名变动,数据库中的remote_listener参数也要变动。

节点二的oracle用户上查看:
SQL> show parameter listener
local_listener:实例liudbyw2只是本地实例(LISTENER),所以只需要注册到本地监听上,ip是本机虚拟ip
remote_listener:用于注册在scan监听上(LISTENER_SCAN1),scan监听用于连接多个实例所以要注册上去
注:remote_listener中的racscan为/etc/hosts的域名,通过域名映射到ip(也是就scan ip),那么就实例就注册到了LISTENER_SCAN1(LISTENER_SCAN1注册的是scan ip)上了,如果/etc/hosts的racscan域名变动,数据库中的remote_listener参数也要变动。

任意节点的oracle用户上执行:
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL> alter system set remote_listener='racscanip:1521'; ###remote_listener设置的值racscanip为/etc/hosts的域名,通过域名映射到ip(也是就scan ip),那么就实例就注册到了LISTENER_SCAN1(LISTENER_SCAN1注册的是scan ip)上了,如果/etc/hosts的racscan域名变动,那么remote_listener参数也要变动。
登录到节点二:因为LISTENER_SCAN1监听在节点二上,所以需要在节点二上查看监控的情况
[root@rac2 ~]# su - grid
[grid@rac2 ~]$ lsnrctl status LISTENER_SCAN1 ###设置了新的域名后实例成功注册到新的域名和ip上。

结束!

本文介绍了如何在从单机环境迁移Oracle数据库到rac集群时,修改scanip并确保应用无缝连接,包括停止扫描服务、修改hosts文件、更新OCR注册信息以及调整数据库实例的remote_listener设置。


1137

被折叠的 条评论
为什么被折叠?



