oracle临时表空间

临时表空间概念
临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当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> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME=‘DEFAULT_TEMP_TABLESPACE‘ 
SQL2:
SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS;
 
查看临时表空间信息:

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

管理临时表空间
 
创建临时表空间
CREATE TEMPORARY TABLESPACE TMP  TEMPFILE ‘/u01/gsp/oradata/TMP01.dbf‘ SIZE 8G AUTOEXTEND OFF; 
 
增加数据文件
当临时表空间太小时,就需要扩展临时表空间(添加数据文件、增大数据文件、设置文件自动扩展);有时候需要将临时数据文件分布到不同的磁盘分区中,提升IO性能,也需要通过删除、增加临时表空间数据文件。
 
SQL> ALTER TABLESPACE TEMP 2 ADD TEMPFILE ‘/u04/gsp/oradata/temp02.dbf‘ 3 SIZE 4G 4 AUTOEXTEND ON 5 NEXT 128M 6 MAXSIZE 6G;

SQL> ALTER TABLESPACE TMPADD TEMPFILE ‘/u03/eps/oradata/temp02.dbf‘ SIZE 64G AUTOEXTEND OFF;

删除数据文件
例如,我想删除临时表空间下的某个文件,那么我们有两种方式删除临时表空间的数据文件。
方法1:
SQL> ALTER TABLESPACE TEMP  DROP TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘;
注意:这种删除临时表空间的写法会将对应的物理文件删除。
方法2:
SQL> ALTER DATABASE TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘  DROP INCLUDING DATAFILES; 
注意:删除临时表空间的临时数据文件时,不需要指定INCLUDING DATAFILES 选项也会真正删除物理文件。
 
调整文件大小
如下例子,需要将临时数据文件从1G大小调整为2G
SQL> ALTER DATABASE TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘ RESIZE 2G; 
 
文件脱机联机
SQL> ALTER DATABASE TEMPFILE2 ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘ OFFLINE;

SQL> ALTER DATABASE TEMPFILE2 ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘ ONLINE;

默认临时表空间并不能脱机,否则会报错,如下所示
SQL> ALTER TABLESPACE TEMP OFFLINE;
ALTER TABLESPACE TEMP OFFLINE
*
ERROR at line 1:
ORA-03217: invalid option for alter of TEMPORARY TABLESPACE
 
设置文件自动扩展
SQL> ALTER DATABASE TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp03.dbf‘ AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED; 
 
移动重命名文件
例如,我需要将/u01/app/oracle/oradata/GSP/temp4.dbf这个文件重命名为/u01/app/oracle/oradata/GSP/temp04.dbf
1: 将临时表空间的临时文件脱机
SQL> ALTER DATABASE TEMPFILE 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> ALTER DATABASE RENAME FILE  ‘/u01/app/oracle/oradata/GSP/temp4.dbf‘ TO  ‘/u01/app/oracle/oradata/GSP/temp04.dbf‘;
4: 将临时表空间的临时文件联机
SQL> ALTER DATABASE TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp04.dbf‘ ONLINE; 
删除临时表空间
SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
注意:不能删除当前用户的默认表空间,否则会报ORA-12906错误
SQL> DROP TABLESPACE TMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS; DROP TABLESPACE TMP INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS * ERROR at line 1: ORA-12906: cannot drop default temporary tablespace 
如果需要删除某一个默认的临时表空间,则必须先创建一个临时表空间,然后指定新创建的表空间为默认表空间,然后删除原来的临时表空间
 
临时表空间组
临进表空间组:
临进表空间组是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>CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp2_1.dbf‘ SIZE 200M TABLESPACE GROUP GRP_TEMP;
查看临时表空间组:
SQL> SELECT * FROM DBA_TABLESPACE_GROUPS
也可以指定已经创建好的临时表空间的临时表空间组。
SQL> ALTER TABLESPACE TEMP TABLESPACE GROUP GRP_TEMP;

SQL> select * from dba_tablespace_groups;
从组中移除:
SQL> ALTER TABLESPACE TEMP TABLESPACE GROUP ‘‘;
当为数据库指定临时表空间或为用户指定临时表空间时,可以使用临时表空间组的名称
ALTER USER DM TEMPORARY TABLESPACE GRP_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:如果有必要,重新指定用户临时表空间为新建的临时表空间
ALTER USER ODS TEMPORARY TABLESPACE TMP;

ALTER USER EDS TEMPORARY TABLESPACE TMP;

ALTER USER ETL TEMPORARY TABLESPACE TMP;

ALTER USER DM TEMPORARY TABLESPACE TMP; 
 
收缩临时表空间
排序等操作使用的临时段,使用完成后会被标记为空闲,表示可以重用,占用的空间不会立即释放,有时候临时表空间会变得非常大,此时可以通过收缩临时表空间来释放没有使用的空间。收缩临时表空间是ORACLE 11g新增的功能。
SQL> ALTER TABLESPACE TEMP SHRINK SPACE KEEP 8G;

SQL> ALTER TABLESPACE TEMP SHRINK TEMPFILE ‘/u01/app/oracle/oradata/GSP/temp02.dbf‘ 
 
监控临时表空间
查看临时表空间对应的临时文件的使用情况

SELECT TABLESPACE_NAME AS TABLESPACE_NAME,
BYTES_USED / 1024 / 1024 / 1024 AS TABLESAPCE_USED,
BYTES_FREE / 1024 / 1024 / 1024 AS TABLESAPCE_FREE FROM V$TEMP_SPACE_HEADER ORDER BY 1 DESC;

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

SELECT se.username,
se.sid,
su.extents,
su.blocks * to_number(rtrim(p.value)) as Space,
tablespace,
segtype,
sql_text
FROM v$sort_usage su, v$parameter p, v$session se, v$sql s
WHERE p.name = ‘db_block_size‘
AND su.session_addr = se.saddr
AND s.hash_value = su.sqlhash
AND s.address = su.sqladdr
ORDER BY se.username, se.sid;

原文地址:https://www.cnblogs.com/qinjf/p/8343902.html

时间: 2024-08-27 12:16:56

oracle临时表空间的相关文章

Oracle 临时表空间满的清理

正常来说,在完成所送select语句.createindex等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段的.但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题.这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法. 方法一.重启库 库重启时,smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的. 方法二

ORACLE 临时表空间清理

Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序.临时表空间的主要作用: 索引create或rebuildOrder by 或 group byDistinct 操作Union 或 intersect 或 minusSort-merge joinsanalyze 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp表空间会一直增长.即使重建了临时表空间,过一段时间后,临时表空间的使用率就达到99%

oracle临时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段

今天在查数据的时候报错  ORA-01652:无法通过16(在表空间temp1中)扩展 temp 字段 查看表空间使用明细 SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, b.blocks * 32 / 1024 / 1024, a.sid, a.serial#, a.username, a.osuser, a.status, c.sql_text, b.contents FROM v$session a, v$sort_usage b

Oracle临时表空间组

Oracle 10g之前,同一用户的多个会话只可以使用同一个临时表空间,因为在给定的时间只有一个临时表空间默认给用户,为了解决这个潜在的瓶颈,Oracle支持临时表空间组即包含多个临时表空间的集合.临时表空间组逻辑上就相当于一个临时表空间. Example: 1 SQL>create temporary tablespace temp1 tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' size 10M; 2 3 SQL>create tem

ORACLE临时表空间总结

临时表空间概念 临时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序.像数据库中一些操作: CREATE INDEX. ANALYZE.SELECT DISTINCT.ORDER BY.GROUP BY. UNION ALL. INTERSECT.MINUS.SORT-MERGE JOINS.HASH JOIN等都可能会用到临时表空间.当操作完成

oracle 临时表空间

环境: OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 1.查看临时表空间信息: select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files; TABLESPACE FILE_NAME

oracle 临时表空间 占用磁盘空间

新创建一个临时表空间 tmpa create   temporary   tablespace   TEMPA   TEMPFILE   '/oracle/tmp/tempa01.dbf '   SIZE   8192M   REUSE   AUTOEXTEND   ON   NEXT  1024K   MAXSIZE   UNLIMITED;  2.将默认的临时表空间指定为tmpa alter   database   default   temporary   tablespace   te

ORACLE 临时表空间管理

 临时表空间和临时段 临时表空间用于存放排序.临时表等数据,其信息不需要REDO,因此临时表的DML操作往往比普通表产生的REDO少很多.临时表数据变化不产生REDO,UNDO数据变化产生REDO.临时段不仅仅存在于临时表空间中,也可能存在普通表空间.比如通过CTAS创建一张表,新表的数据放在临时段中,这些临时段在CTAS完成的时候会被转换为PERMENT段.ORACLE7.3版本之前,临时段是在需要时分配,使用完毕后被删除.ORACLE7.3 推出的新算法的核心就是SEP(SORT EXTEN

Oracle临时表空间使用分析

查询临时表空间的使用情况: select * from (select a.tablespace_name,sum(maxbytes/1024/1024/1024) total_G,sum(a.bytes/1024/1024) allocated_mbfrom dba_temp_files awhere a.tablespace_name=upper('XXX') group by a.tablespace_name) x,(select sum(b.bytes_used/1024/1024)