公司里面有一个12nodes的rac环境来跑数据仓库的应用,有一个1TB的临时表空间,有一些应用会跑的很慢,比如多个大表关联,而且有复杂的分组排序的操作会耗费大量的临时表空间,这些应用有事会跑的比较快,有时会跑的莫名其妙的慢,这是为什么呢?
花了点时间看了一下原因,
模块1正常的时候15分钟完成,但是慢的时候会跑1个半小时,原来有些的P0XX进程都在等待”enq: TS – contention”,根据gv$session_wait我们可以通过p2找到tablespace ID,进而可以发现是临时表空间出现了TS enq,然后可以发现是smon进程持有了这enq,这些P0XX的并行进程都在等待smon去释放这个enq,但是smon这时候在做什么呢?
那首先让我们来看一下rac里面的temp空间分配的机制是怎么样的。在rac里面,大家都知道temp表空间对所有节点都是可见的,但是temp空间一旦分配给了某一个节点使用,其他节点对这部分空间将都会看不见。
很典型的情况就像下面这样,每个节点有自己的temp extent
INST_ID TSNAME TOTAL USED FREE ---------- ------- ----- ---- ----- 1 TEMP 6678 0 6678 2 TEMP 83966 0 83966 3 TEMP 8908 0 8908 4 TEMP 1589 0 1589 5 TEMP 10006 0 10006 6 TEMP 12147 0 12147 7 TEMP 99 0 99 8 TEMP 414 0 414 9 TEMP 10913 0 10913 10 TEMP 2347 6 2341 11 TEMP 343 3 340 12 TEMP 16189 0 16189
一旦某个节点上发生了一个大的分组排序的操作,它目前分配到的temp exten将会被耗尽,这时候它会发出一个Cross Instance Call(CIC)来向每个节点请求新的temp extent,这时候smon就启动去回收每个节点的free temp extent,在这个过程中smon会持有TS enq,发起空间请求的节点必须等待smon完成对所有节点的free temp extent回收请求后才会继续下一步动作,smon每次向每个节点回收100 extents的临时空间,在这个12nodes的环境里面最大就是1200 extents,每个extent设置为8M,大致每次回收8GB的空间可以给发起节点使用,但是在一个很大操作面前,8GB的临时空间一下子就能用完。而且在一个多并发的系统里面,同时会有很多个大操作在进行,这个时候对于临时表空间的争用将会非常严重,会严重影响整个系统的执行效率。
下面来看一个实验
首先看一下当前系统个节点临时空间的分配情况
INST_ID TSNAME TOTAL USED FREE ---------- ------- ----- ----- --- 1 TEMP 6378 0 6378 2 TEMP 82296 0 82296 3 TEMP 8908 0 8908 4 TEMP 1589 0 1589 5 TEMP 10006 0 10006 6 TEMP 12147 0 12147 7 TEMP 99 0 99 8 TEMP 414 0 414 9 TEMP 10913 0 10913 10 TEMP 2347 6 2341 11 TEMP 520 3 517 12 TEMP 16189 0 16189
我们可以看到7节点上当前只分配到了99个extents,
select sum(TOTAL_EXTENTS)*8/1024||'G' from gv$sort_segment; SUM(TOTAL_EXTENTS)*8/1024||'G' ----------------------------------------- 1185.984375G
当前系统总共分配了1185.984375G的temp空间,总的temp表空间大小是1200G,整个系统里面还有1200-1186=14GB的空闲temp空间可以使用
下面登录到7节点执行一个耗费临时空间的操作
dwdb7> exec big_sort(null);
过了一会可以看到
select sum(TOTAL_EXTENTS)*8/1024||'G' from gv$sort_segment; SUM(TOTAL_EXTENTS)*8/1024||'G' ----------------------------------------- 1199.9921875G
系统的空闲临时空间已经被用完,这个时候7节点会通过CIC请求smon释放其他节点的空闲temp空间,可以看到节点7现在的等待
Taobao@dwdb7> / EVENT ---------------------------------------------------------------- PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd PX Deq Credit: send blkd enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention enq: TS - contention
再看各节点temp空间的分布
Taobao@dwdb9> select INST_ID,TABLESPACE_NAME TSNAME, TOTAL_EXTENTS TOTAL,USED_EXTENTS USED,FREE_EXTENTS FREE from gv$sort_segment order by inst_id; INST_ID TSNAME TOTAL USED FREE ---------- --------------- ---------- 1 TEMP 6278 0 6278 2 TEMP 82196 0 82196 3 TEMP 8808 0 8808 4 TEMP 1489 0 1489 5 TEMP 9906 0 9906 6 TEMP 12047 0 12047 7 TEMP 2992 2992 0 8 TEMP 314 0 314 9 TEMP 10813 0 10813 10 TEMP 2247 3 2244 11 TEMP 420 3 417 12 TEMP 16089 0 16089
smon完成一轮空间回收,节点7继续进行排序操作,但是可以看到所有的其他节点free_extents都少了100
INST_ID TSNAME TOTAL USED FREE ---------- ------------------------- 1 TEMP 6178 0 6178 2 TEMP 82096 0 82096 3 TEMP 8708 0 8708 4 TEMP 1389 0 1389 5 TEMP 9806 0 9806 6 TEMP 11947 0 11947 7 TEMP 3728 3728 0 8 TEMP 214 0 214 9 TEMP 10713 0 10713 10 TEMP 2147 3 2144 11 TEMP 320 3 317 12 TEMP 15989 0 15989
然后节点7用完smon回收的空间后又会碰到空间不够的问题,于是发起CIC请求smon会继续回收,
INST_ID TSNAME TOTAL USED FREE ---------- ------ -------- ------------- 1 TEMP 6078 0 6078 2 TEMP 81996 0 81996 3 TEMP 8608 0 8608 4 TEMP 1289 0 1289 5 TEMP 9706 0 9706 6 TEMP 11847 0 11847 7 TEMP 5192 5192 0 8 TEMP 114 0 114 9 TEMP 10613 0 10613 10 TEMP 2047 3 2044 11 TEMP 220 117 103 12 TEMP 15889 0 15889
周而复始,直到整个操作完成,这中间的回收过程会比较久,而且排序操作会一直等待smon从而影响整个应用模块的时间,而且由于各个节点分配到的temp extent严重贫富不均,如果一个sql刚好分配到了某个temp extent比较少的节点,它将会深受其害。
问题的原因相信大家都看明白了,下面就来看一下解决的方案,Oracle提供了一个命令来释放temp空间
ALTER SESSION SET events ‘immediate trace name drop_segments level tablespace_number+1′;
现在节点1有5478个free temp extent,
INST_ID TSNAME TOTAL USED FREE ---------- ---------- -------- ---------- ------- 1 TEMP 5478 0 5478
登录到节点1执行两次ALTER SESSION SET events ‘immediate trace name drop_segments level 4′后将会释放出200个extent
INST_ID TSNAME TOTAL USED FREE ---------- ---------- -------- ---------- ------- 1 TEMP 5278 0 5278
这样的话我们就可以自己包装到crontab,定时在每个节点执行这个命令,这样节点间贫富不均的情况将会被修正,各个节点的空闲temp空间将会被及时的返回到temp pool中供需要的节点使用,也就避免了sql会去等待smon回收,基本上相当于每个节点有自己的专属的temp空间的效果,修正了RAC在temp空间管理这块的缺陷。
相关推荐
在本部署方案中,我们将详细讨论如何在Oracle 19c环境下,配置CDB(Container Database)和RAC(Real Application Clusters)环境,并搭建Active Data Guard来实现数据的实时同步和容灾。 首先,我们需要了解什么是...
采用HP InfiniBand解决方案可以显著提升Oracle RAC环境下的系统性能。与标准以太网相比,InfiniBand提供了更低的延迟和更高的带宽,这对于那些高竞争的应用尤其有利,能够使其在更高负载下依然保持良好的响应速度和...
Oracle Data Guard RAC TO RAC 迁移方案 本文档旨在提供一个基于 RMAN 备份的 Oracle Data Guard RAC TO RAC 迁移方案,以便帮助 DBA schnell 和可靠地完成数据库迁移任务。该方案适用 Oracle 11g 版本,文档版本为...
在生产环境下实施 Oracle RAC 需要进行详细的规划和实施本文将详细介绍 Oracle RAC 项目实施方案,涵盖硬件规划、系统拓扑结构设计、磁盘规划、IP 地址规划、交换机接口规划、存储系统实施、ORACLE RAC 安装等方面。...
本文主要探讨了在Oracle RAC环境中利用DBCA(Database Configuration Assistant)工具进行数据库创建时遇到的一个特殊问题——无法成功创建RAC数据库的情况,并提供了详细的故障排查与解决方案。 #### BLOG文档结构...
而Oracle RAC(Real Application Clusters)是一种高可用性解决方案,可以将多台数据库服务器组成一个集群,提供共享的数据库服务。在这样的环境下,配置WebLogic连接Oracle RAC数据源是一项关键任务,它确保了应用...
Oracle Real Application Clusters (RAC) 是一种高可用性、高性能的企业级数据库解决方案。本文档旨在提供一个全面的Oracle 11g RAC安装后的功能测试方案,主要包括性能测试、负载均衡测试以及异常情况下的稳定性...
Oracle数据仓库解决方案是Oracle公司提供的一整套用于构建和管理数据仓库的技术和工具。这个解决方案旨在帮助企业整合来自多个异构系统的数据,以便进行深入的分析和决策支持。 Oracle数据仓库的设计思想强调了完整...
1. **Oracle RAC 11gR2**:Oracle 11g Release 2 (11.2.0.3) 是一个高可用性和可扩展性的数据库解决方案,允许多个实例同时访问同一数据库,提供故障切换和负载均衡能力。 2. **Red Hat Enterprise Linux 6.3 x64**...
RAC(Real Application Clusters),即真实应用集群,是由Oracle公司开发的一种高可用性和高扩展性的数据库集群解决方案,能够为大型企业和高负载应用提供稳定、高效的数据服务。淘宝采用Oracle RAC系统,不仅解决了...
在现代企业级应用环境中,Oracle Real Application Clusters (RAC) 提供了一种高效且可靠的解决方案,用于实现高性能、高可用性和可伸缩性的数据库服务。由于RAC环境下的数据库结构更加复杂,因此对数据库的备份和...
在RAC环境下,rootvg通常需要配置为镜像模式,以提供更高的可用性和数据安全性。使用`lsvg -l rootvg`命令查看rootvg中的逻辑卷(LV)状态。LV如hd5(boot)、hd6(paging)和hd8(jfs2log)应有正确的镜像配置,即...
Oracle 19c RAC (Real Application Clusters) 和 RACDG (Data Guard) 是企业级数据库解决方案,用于实现高可用性和灾难恢复。RAC允许多个实例同时访问同一个数据库,而RACDG则提供了主库与备库之间的数据保护。 在...
RAC,全称real application clusters,译为“实时应用集群”, 是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。
在Oracle RAC(Real Application Clusters)环境下启用Flashback闪回功能是一项高级的数据库管理技术,它能够帮助数据库管理员在不丢失数据的情况下恢复到过去某一时间点的状态,这对于数据安全和灾难恢复至关重要。...
在Oracle Real Application Clusters (RAC)环境中,当面临只有历史全备(热备)且无增量备份和归档备份的情况下,若需要将数据恢复到单机环境,会面临一定的挑战。本文将详细介绍具体的恢复步骤及可能遇到的问题与...
Oracle RAC 环境可以提供高可用性和高性能的数据库解决方案,但是在这种环境中,数据备份和恢复也是非常重要的。 二、数据备份 数据备份是保护数据的重要手段,Oracle RAC 环境中的数据备份可以通过 RMAN...
在 Oracle RAC 环境中,每个实例都维护着一个 Local Cache(本地高速缓存),用于存储当前实例上的数据块,但是在某些情况下,数据块可能会被从全局高速缓存中删除,导致 gc block lost 问题的出现。 gc block ...
本文档详细介绍了如何将一个Oracle单机环境通过DataGuard技术平滑地迁移到Oracle Real Application Clusters (RAC)环境中,并实现近乎无停顿的数据迁移。这种方法特别适合那些希望将当前的单机数据库系统无缝且无损...