Oracle 11g 临时表空间管理

Wesley13
• 阅读 346

Oracle 11g 临时表空间管理

作者 | JiekeXu

来源 | JiekeXu之路(ID: JiekeXu_IT)

转载请联系授权 | (微信ID:xxq1426321293)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享Oracle 11g 临时表空间管理相关内容 。 本文发布于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!

近期我们运维的数据库有几台出现了 temp 临时表空间使用率过高告警的问题,发现有些 DBA 竟然选择直接添加数据文件或者直接 resize 30G 来消除告警。这样导致临时文件很大占用很多磁盘空间,没有想到优化管理它,临时表空间过大只有重启实例使用率才会下降,如果没有临时表空间实例重启也会自动创建出来,那么今天抽出点时间来说说临时表空间的管理。

一、临时表空间

临时表空间包含仅在会话期间持续存在的临时数据。临时表空间可以提高无法装入内存的多个排序操作的并发性,还可以提高排序期间空间管理操作的效率。在临时表空间中,针对特定实例的所有排序操作共享一个排序段,并且每个执行需要临时空间的排序操作的实例都存在排序段。排序段是由在启动后使用临时表空间进行排序的第一个语句创建的,只有在关闭时才释放。默认情况下,为每个新的 Oracle 数据库安装创建一个名为 TEMP 的临时表空间。也可以使用 create TABLESPACE 语句创建额外的临时表空间。

临时表空间用于存储以下内容:

中间结果排序;

临时表和临时索引;

临时 Lob;

临时 B tree

Oracle 临时表空间作用

Oracle 临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题 SQL 语句的执行,temp 表空间会一直增长直到耗尽磁盘空间。网络上有人猜测在磁盘空间的分配上,oracle 使用的是贪心算法,如果上次磁盘空间消耗达到 1GB,那么临时表空间就是 1GB。也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小。

临时表空间的主要作用:

索引 create 或 rebuild;

Order by 或 group by;

Distinct 操作;

Union 或 intersect 或 minus;

Sort-merge joins;

analyze.

==========================================

oracle 临时表空间的增删改查等管理操作

1、查看****临时表空间 (dba_temp_files 视图)(v_$tempfile 视图)

select tablespace_name,file_name,bytes/1024/1024file_size,autoextensible from dba_temp_files;

2、查****看临时表空间当前使用的大小和历史最大使用的大小

select 'max' asstatus,

3、查看临时表空间的使用情况(GV_$TEMP_SPACE_HEADER 视图必须在 sys 用户下才能查询)

GV_$TEMP_SPACE_HEADER 视图记录了临时表空间的使用大小与未使用的大小

dba_temp_files 视图的 bytes 字段记录的是临时表空间的总大小

SELECT temp_used.tablespace_name,

Oracle 11g 临时表空间管理

Oracle 11g 临时表空间管理

查看临时表空间对应的临时文件的使用情况

SELECT TABLESPACE_NAME         AS TABLESPACE_NAME   ,

4、查找消耗资源比较多的 SQL 语句

Select se.username,

5、查看当前临时表空间使用大小与正在占用临时表空间的 SQL 语句

select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text

6、扩展临时表空间:

方法一、增大临时文件大小:

SQL> alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' resize 100m;

方法二、将临时数据文件设为自动扩展:

SQL> alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' autoextend on next 5m maxsize unlimited;

方法三、向临时表空间中添加数据文件:

SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' size 100m;

7、创建临时表空间:

SQL> create temporary tablespace temp1 tempfile '/u01/app/oracle/oradata/orcl/temp11.dbf' size 10M; 

8、更改系统的默认临时表空间:

--查询默认临时表空间

select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

--修改默认临时表空间

alter database default temporary tablespace temp1;

所有用户的默认临时表空间都将切换为新的临时表空间:

select username,temporary_tablespace,default_ fromdba_users;

--更改某一用户的临时表空间:

alter user scott temporary tablespace temp; 

9、删除临时表空间

删除临时表空间的一个数据文件:

SQL> alter database tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' drop;

删除临时表空间(彻底删除):

SQL> drop tablespace temp1 including contents and datafiles cascade constraints;

10、缩小临时表空间大小

alter database tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' resize 100M;

二、临时表空间组

临时表空间组是 ORACLE 10g 引入的一个新特性,它是一个逻辑概念,不需要显示的创建和删除。只要把一个临时表空间分配到一个组中,临时表空间组就自动创建,所有的临时表空间从临时表空间组中移除就自动删除。

一个临时表空间组必须由至少一个临时表空间组成,并且无明确的最大数量限制.

A temporary tablespace group contains at least one tablespace. There is no limitfor a group to have a maximum number of tablespaces

如果删除一个临时表空间组的所有成员,该组也自动被删除。临时表空间的名字不能与临时表空间组的名字相同。

It shares the namespace of tablespaces, thus its name cannot be the same as thatof any tablespace.

可以在创建临时表空间时指定表空间组,即隐式创建。

1)创建临时表空间组:

create temporary tablespace tempts1 tempfile '/u01/app/oracle/temp1_02.dbf' size 2M tablespace group group1;

2)查询临时表空间组:dba_tablespace_groups 视图

select * from dba_tablespace_groups;

3)将表空间从一个临时表空间组移动到另外一个临时表空间组:

alter tablespace tempts1 tablespace group GROUP2 ;

4)把临时表空间组指定给用户

alter user scott temporary tablespace GROUP2;

5)在数据库级设置临时表空间

alter database <db_name> default temporary tablespace GROUP2;

6)删除临时表空间组 (删除组成临时表空间组的所有临时表空间)

drop tablespace tempts1 including contents and datafiles;

三、临时表空间 shrink 操作

对临时表空间进行shrink(11g新增功能)

排序等操作使用的临时段,使用完成后会被标记为空闲,表示可以重用,占用的空间不会立即释放,有时候临时表空间会变得非常大,此时可以通过收缩临时表空间来释放没有使用的空间。收缩临时表空间是 ORACLE11g 新增的功能。

Large sort operations performed by the database mayresult in a temporary tablespace growing and occupying a considerable amount ofdisk space. After the sort operation completes, the extra space is notreleased; it is just marked as free and available for reuse. Therefore, asingle large sort operation might result in a large amount of allocated temporary space that remains unused after the sort operation is complete. Forthis reason, the database enables you to shrink locally managed temporary tablespaces and release unused space.

数据库执行的大型排序操作可能会导致临时表空间的增长和占用大量的磁盘空间。排序操作完成后,额外的空间不会被释放;它只是被标记为免费的,可以重用。因此,单个大型排序操作可能会导致大量分配的临时空间,这些空间在排序操作完成后仍未使用。由于这个原因,数据库使您能够缩小本地管理的临时表空间并释放未使用的空间。

You use the SHRINK SPACE clause ofthe ALTER TABLESPACE statement to shrink a temporary tablespace, orthe SHRINK TEMPFILE clause of the ALTER TABLESPACE statement toshrink a specific temp file of a temporary tablespace. Shrinking frees as muchspace as possible while maintaining the other attributes of the tablespace ortemp file. The optional KEEP clause defines a minimum size for the tablespace or temp file。

可以使用 ALTER TABLESPACE 语句的 SHRINK SPACE 子句来收缩临时表空间,或者使用ALTER TABLESPACE statement 的 SHRINK TEMPFILE 子句来收缩临时表空间的特定临时文件。在保持表空间或临时文件的其他属性的同时尽可能减少空间。可选的 KEEP 子句为表空间或临时文件定义了最小大小。

Shrinking is an online operation, which means that usersessions can continue to allocate sort extents if needed, and already-runningqueries are not affected.

收缩是一个在线操作,这意味着用户会话可以继续在需要时分配排序区,并且已经运行的查询不受影响。

--将 temp 表空间收缩为10G

alter tablespace temp shrink space keep 10G;

--自动将表空间的临时文件缩小到最小可能的大小

ALTER TABLESPACE temp SHRINK TEMPFILE ’/u01/app/oracle/oradata/temp01.dbf’;

--查看临时表空间大小

Select * from dba_temp_free_space;

Oracle 11g 临时表空间管理

前面指定大小为 16G,报错ORA-03297:文件包含在请求的 RESIZE 值以外使用的数据。偏小了,若为 18G则不会报错,如果不指定保留空间大小, shrink space 会收缩临时表空间到最小的可能空间大小。

Oracle 11g 临时表空间管理

这样就解决了临时表空间使用率过大的问题,当然,也可以使用 resize 临时文件来解决,那么需要 resize 到多少才算合适呢?我们可以查询临时空间使用情况来判断,视图v$sort_usage 记录了排序空间的使用情况,找到最大的块号。

Select (Selectmax(segblk#) from v$sort_usage)*8192/1024/1024/1024 Gb from dual;

Oracle 11g 临时表空间管理

总结:Shrink 操作完后,部分行数据的 rowid 发生了变化,同时,部分行数据的物理存储的顺序也会发生变化,而 table 所位于的 block 的区域却没有变化。所以,shrink 只移动了 table 其中一部分的行数据,来完成释放空间,而且,这个过程是在 table 当前所使用的 block 中完成的。


参考链接:

https://www.cnblogs.com/einyboy/archive/2012/08/10/2631464.html

https://docs.oracle.com/cd/E11882\_01/server.112/e25494/tspaces.htm#ADMIN01103

每天进步一点,一年后的进步将会很大,远远大于 “1”;每天退步,即使退步一点点,一年后几乎退步为 "0"。如果本文对您有一点儿帮助,请多支持“在看”与转发,您的鼓励将是我最大的动力,一起加油,奥利给****!

Oracle 11g 临时表空间管理

Oracle 12c 及以上版本补丁更新说明及下载方法(收藏版)

Oracle 11.2.0.4 RAC 最新补丁下载(11.2.0.4.200714)

11g RAC 在线存储迁移实现 OCR 磁盘组完美替换

如何通过 Shell 监控异常等待事件和活跃会话

我的 OCM 之路|书写无悔青春追梦永不止步

Oracle 19c 之多租户 PDB 连接与访问(三)

案例:RMAN 备份控制文件报错 ORA-00230

Oracle 12C 最新补丁下载与安装操作指北

DBA 常用的软件工具有哪些(分享篇)?

Oracle 相关认证证书查询及真伪辨别

Oracle 每日一题系列合集

Oracle 11g 临时表空间管理

Oracle 11g 临时表空间管理

Oracle 11g 临时表空间管理

Oracle 11g 临时表空间管理

点亮在看,你最好看!

本文分享自微信公众号 - JiekeXu之路(JiekeXu_IT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这