Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是对于大型的频繁操作,如创建索引,排序等等都需要在临时表空间完成来减少内存的开销。当然对于查询性能要求较高的应尽可能的避免在磁盘上完成这些操作。本文主要描述的是临时表空间的管理与受损恢复。
一、临时表空间的特性与注意事项
1.特性
用户存储临时数据的表空间
临时数据通常只在一个数据库会话期间内存在的数据,分为两种形式,排序数据和全局临时表
临时数据不会被写入存储永久对象的普通表空间内,而是存储在临时表空间的临时段中
临时表空间临时性导致不需要备份该类型的表空间,RMAN也不支持对临时表空间的备份
对于临时数据的处理,不会生成重做,也不会生成撤销数据
临时表空间的数据文件不能置为只读、不能重命名
监时表空间的数据文件的日志方式总是NOLOGGING
使用临时表空间的主要操作
CREATE INDEX,ALTER INDEX ...REBUILD,ORDER BY,GROUP BY,DISTINCT,UNION,INTERSECT,MINUS,SORT-MERGER,JOIN,ANALYZE
2.临时表空间使用的注意事项
a. 每个用户都有一个缺省的临时表空间,对于临时表空间使用较高的系统,建议将临时表空间数据文件分布到不同的磁盘
b. 对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理
c. 分配用户单独临时表空间,一般是针对大型产品数据库,OLTP数据库,数据库仓库
d. 对于小型产品不需要单独制定临时表空间,使用默认临时表空间
e. 对于临时表空间建议关闭自动扩展功能,避免过度扩展所致的空间压力
关于临时表空间的创建与管理请参考:Oracle 表空间与数据文件
二、临时表空间的管理
1. 查看缺省的临时表空间
SQL> select property_name,property_value from database_properties
2 where property_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_TBS_TYPE SMALLFILE
2.查看临时表空间的大小及位置
SQL> select s.name tbsname,t.name,(t.bytes/1024/1024) bytes,status
2 from v$tablespace s,v$tempfile t
3 where s.ts# = t.ts#;
TBSNAME NAME BYTES STATUS
---------- --------------------------------------------- ---------- -------
TEMP /u01/app/oracle/oradata/orcl/temp01.dbf 30 ONLINE
SQL> select tablespace_name,file_name,bytes/1024/1024 Size_MB from dba_temp_files;
TABLESPACE FILE_NAME SIZE_MB
---------- --------------------------------------------- ----------
TEMP /u01/app/oracle/oradata/orcl/temp01.dbf 30
SQL> select tablespace_name,logging,allocation_type
2 from dba_tablespaces where tablespace_name='TEMP';
TABLESPACE LOGGING ALLOCATIO
---------- --------- ---------
TEMP NOLOGGING UNIFORM
3. 临时表文件大小和已使用空间
SELECT t1."Tablespace" "Tablespace",
t1."Total (G)" "Total (G)",
nvl(t2."Used (G)", 0) "Used(G)",
t1."Total (G)" - nvl(t2."Used (G)", 0) "Free (G)"
FROM (SELECT tablespace_name "Tablespace",
to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
FROM dba_temp_files
GROUP BY tablespace_name
UNION
SELECT tablespace_name "Tablespace",
to_char((SUM(bytes / 1024 / 1024 / 1024)), '99,999,990.900') "Total (G)"
FROM dba_data_files
WHERE tablespace_name LIKE 'TEMP%'
GROUP BY tablespace_name) t1,
(SELECT tablespace, round(SUM(blocks) * 8 / 1024 /1024) "Used (G)"
FROM v$sort_usage
GROUP BY tablespace) t2
WHERE t1."Tablespace" = t2.tablespace(+);
Tablespace Total (G) Used(G) Free (G)
------------------------------ --------------- ---------- ----------
GOEX_TEMP 31.999 1 30.999
FIX_TEMP 0.098 0 .098
TEMP 0.195 0 .195