临时表空间概念

临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT disTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。

临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序disk Sort)和散列操作的中间结果.它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志

创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快。这是因为ORACLE的临时数据文件是一类特殊的数据文件:稀疏文件(Sparse File),当临时表空间文件创建时,它只会写入文件头部和最后块信息(only writes to the header and last block of the file)。它的空间是延后分配的.这就是你创建临时表空间或给临时表空间添加数据文件飞快的原因。

另外,临时表空间是NOLOGGING模式以及它不保存永久类型对象,因此即使数据库损毁,做Recovery也不需要恢复Temporary Tablespace。

查看实例的临时表空间

sql1:

sql>SELECTPROPERTY_NAME,PROPERTY_VALUE

2FROMDATABASE_PROPERTIES
3WHEREPROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAMEPROPERTY_VALUE
----------------------------------------------------------
DEFAULT_TEMP_TABLESPACETEMP

sql2:

SELECTUSERNAME,TEMPORARY_TABLESPACEFROMDBA_USERS;

查看临时表空间信息:

SETLInesIZE1200
COLNAMEFORA60
SELECTFILE#ASFILE_NUMBER
,NAMEASNAME
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',CREATION_TIMEASCREATION_TIME
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',BLOCK_SIZEASBLOCK_SIZE
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',BYTES/1024/1024/1024AS"FILE_SIZE(G)"
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',CREATE_BYTES/1024/1024/1024AS"INIT_SIZE(G)"
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',STATUSAsstATUS
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',ENABLEDASENABLED
FROMV$TEMPFILE;


COLTABLESPACE_NAMEFORA30
COLFILE_NAMEFORA60
SELECTTABLESPACE_NAMEASTABLESPACE_NAME
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',FILE_NAMEASFILE_NAME
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',BLOCKSASBLOCKS
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',AUTOEXTENSIBLEASAUTOEXTENSIBLE
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',DECODE(MAXBYTES,BYTES/1024/1024/1024,
MAXBYTES/1024/1024/1024)
AS"MAX_SIZE(G)"
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#FFFFFF;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',INCREMENT_BYAS"INCREMENT_BY"
ottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New',USER_BYTES/1024/1024/1024AS"USEFUL_SIZE"
FROMDBA_TEMP_FILES;



sql>SELECTBYTES,BLOCKS,USER_BYTES,USER_BLOCKS,
BLOCKS-USER_BLOCKSASSYstem_USED
FROMDBA_TEMP_FILES;
BYTESBLOCKSUSER_BYTESUSER_BLOCKSSYstem_USED
----------------------------------------------------
21474836482621442146435072262016128
10737418241310721072693248130944128
2097152002560020866662425472128


这四列中, BYTES,BLOCKS 显示的是临时文件有多少BYTE大小,包含多少个数据块。而USER_BYTES,USER_BLOCKS是可用的BYTE和数据块个数。因此,我们可以 知道临时文件中有一部分是被系统占用的,大概可以理解成文件头信息,这一部分大小是128个block;

管理表空间


创建临时表空间


下面是一个简单的创建临时表空间的例子,具体很多细节可以参考官方文档,这里省略,不做过多介绍。

http://docs.oracle.com/cd/B10501_01/server.920/a96540/statements_75a.htm

http://docs.oracle.com/cd/B28359_01/server.111/b28310/tspaces002.htm#ADMIN11366

CREATETEMPORARYTABLESPACETMP
TEMPFILE'/u01/gsp/oradata/TMP01.dbf'
SIZE8G
AUTOEXTENDOFF;

增加数据文件


当临时表空间太小时,就需要扩展临时表空间(添加数据文件、增大数据文件、设置文件自动扩展);有时候需要将临时数据文件分布到不同的磁盘分区中,提升IO性能,也需要通过删除增加临时表空间数据文件

sql>ALTERTABLESPACETEMP
2ADDTEMPFILE'/u04/gsp/oradata/temp02.dbf'
3SIZE4G
4AUTOEXTENDON
5NEXT128M
6MAXSIZE6G;

Tablespacealtered.
sql>ALTERTABLESPACETMP
ADDTEMPFILE'/u03/eps/oradata/temp02.dbf'
SIZE64G
AUTOEXTENDOFF;
Tablespacealtered.

删除数据文件


例如,我想删除临时表空间下的某个文件,那么我们有两种方式删除临时表空间的数据文件

方法1:

DROPTEMPFILE'/u01/app/oracle/oradata/GSP/temp02.dbf';
Tablespacealtered.

注意:这种删除临时表空间的写法会将对应的物理文件删除

方法2:

sql>ALTERDATABASETEMPFILE'/u01/app/oracle/oradata/GSP/temp02.dbf'
DROPINCLUDINGDATAFILES;
Databasealtered.

注意:删除临时表空间的临时数据文件时,不需要指定INCLUDING DATAFILES 选项也会真正删除物理文件,否则需要手工删除物理文件



调整文件大小


如下例子,需要将临时数据文件从1G大小调整为2G

sql>ALTERDATABASETEMPFILE
'/u01/app/oracle/oradata/GSP/temp02.dbf'RESIZE2G;

文件脱机联机

2'/u01/app/oracle/oradata/GSP/temp02.dbf'OFFLINE;
Databasealtered.
sql>ALTERDATABASETEMPFILE
2'/u01/app/oracle/oradata/GSP/temp02.dbf'ONLINE;
Databasealtered.

临时表空间并不能脱机,否则会报错,如下所示

sql> ALTER TABLESPACE TEMP OFFLINE;

ALTER TABLESPACE TEMP OFFLINE

*

ERROR at line 1:

ORA-03217: invalid option for alter of TEMPORARY TABLESPACE


设置文件自动扩展

sql>ALTERDATABASETEMPFILE'/u01/app/oracle/oradata/GSP/temp03.dbf'
2AUTOEXTENDON
3NEXT100M
4MAXSIZEUNLIMITED;

移动重命名文件

例如,我需要将/u01/app/oracle/oradata/GSP/temp4.dbf这个文件重命名为/u01/app/oracle/oradata/GSP/temp04.dbf

1: 将临时表空间的临时文件脱机

2'/u01/app/oracle/oradata/GSP/temp4.dbf'OFFLINE;

2:移动或重命名相关的临时文件

mv/u01/app/oracle/oradata/GSP/temp4.dbf/u01/app/oracle/oradata/GSP/temp04.dbf'

3: 使用脚本ALTER DATABASE RENAME FILE

sql>ALTERDATABASERENAMEFILE
2'/u01/app/oracle/oradata/GSP/temp4.dbf'TO
3'/u01/app/oracle/oradata/GSP/temp04.dbf';

4: 将临时表空间的临时文件联机

sql>ALTERDATABASETEMPFILE'/u01/app/oracle/oradata/GSP/temp04.dbf'ONLINE;
Databasealtered.

删除临时表空间

sql>DROPTABLESPACETEMPINCLUDINGCONTENTSANDDATAFILESCASCADECONSTRAINTS;

注意:不能删除当前用户认表空间,否则会报ORA-12906错误

sql>DROPTABLESPACETMPINCLUDINGCONTENTSANDDATAFILESCASCADECONSTRAINTS;
DROPTABLESPACETMPINCLUDINGCONTENTSANDDATAFILESCASCADECONSTRAINTS
*
ERRORatline1:
ORA-12906:cannotdropdefaulttemporarytablespace

如果需要删除一个认的临时表空间,则必须先创建一个临时表空间,然后指定新创建的表空间为认表空间,然后删除原来的临时表空间

临时表空间组

临进表空间组:

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

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

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

如果删除一个临时表空间组的所有成员,该组也自动删除

临时表空间的名字不能与临时表空间组的名字相同。

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

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

sql>CREATETEMPORARYTABLESPACETEMP2
TEMPFILE'/u01/app/oracle/oradata/GSP/temp2_1.dbf'SIZE200M
TABLESPACEGROUPGRP_TEMP;

查看临时表空间组:

sql>SELECT*FROMDBA_TABLESPACE_GROUPS;
GROUP_NAMetaBLESPACE_NAME
------------------------------------------------------------
GRP_TEMPTEMP2

也可以指定已经创建好的临时表空间的临时表空间组。

sql>ALTERTABLESPACETEMPTABLESPACEGROUPGRP_TEMP;
sql>select*fromdba_tablespace_groups;
GRP_TEMPTEMP
GRP_TEMPTEMP2

从组中移除:

sql>ALTERTABLESPACETEMPTABLESPACEGROUP'';

当为数据库指定临时表空间或为用户指定临时表空间时,可以使用临时表空间组的名称

ALTERUSERDMTEMPORARYTABLESPACEGRP_TEMP;

切换临时表空间


1:查看旧临时表空间信息

SELECT * FROM V$TEMPFILE

SELECT USERNAME,TEMPORARY_TABLESPACE FROM DBA_USERS

2:创建中转的临时表空间

3:添加相应的数据文件

4:切换临时表空间。

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TMP;

5:删除旧的临时表空间数据文件

DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;

6:如果有必要,重新指定用户临时表空间为新建的临时表空间

ALTERUSERODstemPORARYTABLESPACETMP;
ALTERUSEREDstemPORARYTABLESPACETMP;
ALTERUSERETLTEMPORARYTABLESPACETMP;
ALTERUSERDMTEMPORARYTABLESPACETMP;

收缩临时表空间


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

sql>ALTERTABLESPACETEMPSHRINKSPACEKEEP8G;
sql>ALTERTABLESPACETEMPSHRINKTEMPFILE'/u01/app/oracle/oradata/GSP/temp02.dbf'

监控临时表空间


查看临时表空间使用情况:

SELECTTU.TABLESPACE_NAMEAS"TABLESPACE_NAME",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">TT.TOTAL-TU.USEDAS"FREE(G)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">TT.TOTALAS"TOTAL(G)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND(NVL(TU.USED,0)/TT.TOTAL*100,3)AS"USED(%)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND(NVL(TT.TOTAL-TU.USED,0)*100/TT.TOTAL,3)AS"FREE(%)"
FROM(SELECTTABLESPACE_NAME,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">SUM(BYTES_USED)/1024/1024/1024USED
FROMGV_$TEMP_SPACE_HEADER
GROUPBYTABLESPACE_NAME)TU,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">(SELECTTABLESPACE_NAME,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">SUM(BYTES)/1024/1024/1024ASTOTAL
FROMDBA_TEMP_FILES
GROUPBYTABLESPACE_NAME)TT
WHERETU.TABLESPACE_NAME=TT.TABLESPACE_NAME;
COLTEMP_FILEFORA60;
SELECTROUND((F.BYTES_FREE+F.BYTES_USED)/1024/1024/1024,2)AS"TOTAL(GB)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND(((F.BYTES_FREE+F.BYTES_USED)-NVL(P.BYTES_USED,0))/1024/1024/1024,2)AS"FREE(GB)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">D.FILE_NAMEAS"TEMP_FILE",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND(NVL(P.BYTES_USED,0)/1024/1024/1024,2)AS"USED(GB)",monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND((F.BYTES_USED+F.BYTES_FREE)/1024/1024/1024,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">ROUND(((F.BYTES_USED+F.BYTES_FREE)-NVL(P.BYTES_USED,2)AS"USED(GB)"
FROMSYS.V_$TEMP_SPACE_HEADERF,DBA_TEMP_FILESD,SYS.V_$TEMP_EXTENT_POOLP
WHEREF.TABLESPACE_NAME(+)=D.TABLESPACE_NAME
ANDF.FILE_ID(+)=D.FILE_ID
ANDP.FILE_ID(+)=D.FILE_ID;

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

SELECTTABLESPACE_NAMEASTABLESPACE_NAME,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">BYTES_USED/1024/1024/1024ASTABLESAPCE_USED,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">BYTES_FREE/1024/1024/1024ASTABLESAPCE_FREE
FROMV$TEMP_SPACE_HEADER
ORDERBY1DESC;

查找消耗临时表空间资源比较多的sql语句

SELECTse.username,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">se.sid,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">su.extents,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">su.blocks*to_number(rtrim(p.value))asspace,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">tablespace,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">segtype,monospace;border-top-style:none;color:#000000;font-size:12pt;border-left-style:none;padding-top:0px;">sql_text
FROMv$sort_usagesu,v$parameterp,v$sessionse,v$sqls
WHEREp.name='db_block_size'
ANDsu.session_addr=se.saddr
ANDs.hash_value=su.sqlhash
ANDs.address=su.sqladdr
ORDERBYse.username,se.sid;





转载:http://www.cnblogs.com/kerrycode/p/4006840.html

相关文章

Java Oracle 结果集是Java语言中处理数据库查询结果的一种方...
Java AES和Oracle AES是现代加密技术中最常使用的两种AES加密...
Java是一种广泛应用的编程语言,具备可靠性、安全性、跨平台...
随着移动互联网的发展,抽奖活动成为了营销活动中不可或缺的...
Java和Oracle都是在计算机领域应用非常广泛的技术,他们经常...
Java 是一门非常流行的编程语言,它可以运行于各种操作系统上...