数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
10年数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸
CSDN:胖头鱼的鱼缸(尹海文)
墨天轮:胖头鱼的鱼缸
ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭
在Oracle Database 23ai之前的版本中,在RAC集群环境下打补丁,是需要使用滚动升级的方式来执行补丁升级操作的,如果不配置TAF/TAC的话,势必会出现在停机节点上的应用连接会中断的现象,如果应用配置不合理很可能造成业务异常现象。
在23ai中Oracle引入了一个新技术叫本地滚动数据库维护(Local Rolling Database Maintenance),可以实现RAC打补丁的完全不停机。
1 概念
从23ai开始,可以在本地为Oracle RAC和Oracle RAC One Node部署应用滚动补丁并执行其他维护操作。
本地滚动是从同一节点上的第二个Oracle家目录创建并启动第二个数据库实例,而不是停止数据库实例并将工作负载重新定位到另一个节点上的另一个实例。本地滚动数据库维护减少了迁移连接的时间。此功能通过将工作负载保持在本地节点上来减少停机时间。必须确保有足够的CPU、内存和其他计算资源来临时运行两个实例。
本地滚动可确保在两个Oracle家目录之间滚动迁移数据库期间,群集中至少运行相同数量的Oracle RAC和Oracle RAC One Node实例。使用此功能,您可以在单个集群节点内进行错位滚动补丁加载。
当您使用本地滚动式就地修补时,Oracle RAC会在新的Oracle家目录中创建第二个实例,启动第二个示例,然后在您要修补的节点上停止旧Oracle家目录的第一个实例。此功能还保留了PDB的位置和服务,因此节点继续执行与补丁加载之前相同的工作。
2 要求
使用本地滚动数据库维护需要满足以下条件:
- 使用OMF(Oracle Managed Files)
- 使用spfile(Server Parameters File)
- 在本地滚动操作完成后重新配置初始化参数THREAD和UNDO_TABLESPACE
- 在本地滚动升级过程中不要执行srvctl add instance、srvctl remove instance或srvctl modify instance命令
- 必须确保有足够的可用存储空间为每个实例创建新的redo线程(redo thread)和新的undo表空间。当您一次使用此功能时,此功能会为每个新实例创建一个新的redo线程和一个新的undo表空间。第二次和后续使用此功能时,将使用以前使用的旧的redo线程和undo表空间,而不会创建新的redo和undo。
3 操作流程
本地滚动升级的流程:
- 创建新Oracle家目录并解压软件
mkdir -p /u01/app/oracle/product/23.4.0/dbhome_1
chgrp oinstall /u01/app/oracle/product/23.4.0/dbhome_1
cd /u01/app/oracle/product/23.4.0/dbhome_1
unzip -q /tmp/db_home.zip
- 执行新Oracle家目录的升级操作
cd /u01/app/oracle/product/23.4.0/dbhome_1
./runInstaller -applyRU patch_directory_location
- 为数据库开启本地滚动升级
srvctl modify database –db [db_name] -oraclehome new_Oracle_home -localrolling
- 将RAC和RAC One Node的PDB和服务从旧家目录转换到新的家目录
$ srvctl transfer instance –d mydb [-node node_list]
{[-stopoption stop_option] | -rollback} [-drain_timeout timeout] [-verbose]
新实例从新的Oracle家目录启动,并等待-drain_timeout参数中指定的时间,以便会话迁移到新实例。当所有会话迁移到新实例时,旧实例停止。
如果不指定-drain_timeout,则使用指定节点上数据库所有运行服务的最大配置超时时间。
- 验证
srvctl config database -db [db_name]
- 根据需求添加或修改service和连接字符串
4 转移失败处理
在本地滚动数据库维护期间,某些实例可能无法转移到目标Oracle家目录。使用下面任何一个方式,在本地滚动模式下从失败的转移中恢复。
- 将所有实例从新的家目录恢复至旧的家目录
a. 恢复数据库家目录配置
srvctl modify database -db [db_name] -localrolling_revert
b. 恢复所有实例至旧的家目录
srvctl transfer instance -db [db_name]
此过程将数据库还原到本地滚动之前的原始状态。所有实例都从旧的Oracle家目录开始运行。您可以删除之前的目标Oracle家目录,创建新的Oracle家目录,然后再次启动本地滚动过程。
- 将部分实例从新的家目录恢复至旧的家目录
a. 恢复数据库家目录配置
srvctl modify database -db [db_name] -localrolling_revert
b. 恢复指定实例至旧的家目录
srvctl transfer instance -db [db_name] -node node_list
# 在转移的节点上修复本地滚动目标Oracle家目录。如果仍有任何实例在本地滚动目标Oracle家目录上运行,则数据库将进入本地滚动REVERT状态。
c. 使用相同的目标Oracle家目录将数据库修改为TRANSFER状态以转移实例
srvctl modify database -db [db_name] -localrolling -oraclehome target_Oracle_home
- 将部分实例从新的家目录恢复至旧的家目录
a. 恢复指定实例至旧的家目录
srvctl transfer instance -db [db_name] -node node_list -rollback
b. 修复目标家目录
c. 将实例转移回目标家目录
srvctl transfer instance -db [db_name]
总结
本期简单介绍了Oracle Database 23ai引入的可以实现完全不停机打补丁的本地滚动维护,但由于还没有本地部署版本放出,待对应版本放出后再演示。
老规矩,知道写了些啥。