oracle 12.2 local temp的原理和实现

章宇文 2017-05-09
312

从Oracle数据库12c开始可以将Oracle Clusterware和Oracle RAC配置在大型集群中,称为Oracle Flex集群。 这些集群包含两种类型的节点:Hub节点和Leaf节点。 Hub节点紧密连接,可以直接访问共享存储,并作为一个或多个Leaf 节点的锚点。 leaf 节点与Hub节点松动连接,可能无法直接访问共享存储。


关于Flex Cluster,详情请点击:Oracle Flex Clusters


随着12.2的发布,如果是FLEX集群,可以在LEAF NODE创建read only实例,从而引入了local temp表空间的概念。 


local temp和local undo的概念不一样,首先pdb必须使用自己的temp表空间,local temp指的是RAC环境下,可以在各自的节点上创建local temp表空间,拥有各自的temp表空间就跟拥有各自的PGA一样,对于只读节点来说大的排序需要用到temp时就不需要去看这块空间另外一个节点有没有使用,另外避免了两边同时使用temp表空间产生的争用。 


首先,PDB不能使用CDB的temp表空间,PDB和CDB上temp视图查出来的结果都不一样: 连接到PDB1,并查看当前的临时表空间



创建新的临时表空间,设置为默认,并删掉原来的临时表空间



测试最初的临时表空间不存在



查看当前的临时表空间



以sysdba连接,再次查询



dba_temp_files的SHARED字段中表明了类型,local有两种类型,RIM是read_only实例,ALL是所有实例 

SHARED: for shared temporary tablespace 
LOCAL_ON_ALL: for local temporary tablespace on all instances 
LOCAL_ON_RIM: for local temporary tablespace on read-only instances 


官方给的创建语句有两处问题,一是未指定tempfile的大小,二是local temp是BIGFILE类型,所以不能指定AUTOEXTEND,也不能添加第二个tempfile。 

先来看LOCAL_ON_ALL,创建语句如下,(由于没有RAC环境只能在单实例上测试) 



查询数据库当前的大文件表空间,临时文件和临时表空间



从操作系统层面查看



从上面可以看到,理论上会创建各自的tempfile,在指定文件名结尾加上_1和_2,但是不知V$TEMPFILE视图中为什么没有标明详细的文件名。 

LOCAL_ON_RIM由于需要read only的实例,创建会报错ORA-32778


[oracle@orasql2 ~]$ oerr ORA 32778 
32778, 00000, "DDL operations are disabled on local temporary tablespaces FOR LEAF." 
// *Cause: A DDL operation on a local temporary tablespace FOR LEAF was 
// attempted in a system without any read-only running instances. 
// *Action: Add at least one read-only instance to the cluster. 


read writ的实例会优先使用shared的临时表空间,再使用local的临时表空间 ;read only的实例优先使用local的临时表空间,再使用shared的临时表空间 

其他操作都类似,具体可以参考官方文档 
http://docs.oracle.com/database/122/RACAD/introduction-to-oracle-rac.htm#RACAD-GUID-E84E3BA2-7F36-406B-B630-CD651E0C856F


加入"云和恩墨大讲堂"微信群,参与讨论学习

搜索 盖国强(Eygle) :eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。


关注微信,获得后续精彩分享

文章转载自章宇文,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论