天天看点

Oracle 11g 新特性 -- 临时表空间收缩 说明

Oracle 11g 新特性 -- 临时表空间收缩

一. 临时表空间收缩


1.1 说明
关于Oracle 的临时表空间,之前有整理过一篇Blog:

Oracle Temp 临时表空间





以下操作会占用大量的temporary:

    1、用户执行imp/exp 导入导出操作时,会使用大量的temporary段

    2、用户在rebuild index时

    3、执行create table ...... as 语句时

    4、移动用户下的数据到别的表空间时



大量的排序操作可能会导致临时表空间大量增长。为了提高性能,对排序区进行物理分配后,将在内存中管理它们以避免以后的物理回收。结果,磁盘中包含一个巨大的临时文件,直到将其删除。      
一种可能的解决方法是:使用较小的文件创建新的临时表空间,并将这个新的表空间设置为用户的默认临时表空间,然后删除旧的表空间。      
但是,这有一个缺点,即过程要求删除旧的临时表空间时不能存在活动的排序操作。



从Oracle Database11g 版本1 开始,可使用ALTER TABLESPACESHRINK SPACE 命令收缩临时表空间,也可以使用ALTER TABLESPACE SHRINKTEMPFILE 命令收缩临时文件。      
对于这两个命令,可以指定可选的KEEP 子句,该子句定义了表空间/临时文件可收缩到的下限。

如果忽略KEEP 子句,则只要满足其它存储属性,数据库就会尽可能尝试收缩表空间/临时文件(所有当前使用的区的总空间)。此操作需联机执行。      
但是,如果所分配的当前使用的一些区超出了收缩估计值,系统将等待这些区被释放以完成收缩操作。



注:

ALTER DATABASETEMPFILE RESIZE 命令通常会因ORA-03297 而失败,因为临时文件包含的已用数据超过了所需的RESIZE 值。

与ALTER TABLESPACE SHRINK 相反,ALTER DATABASE 命令不会在排序区分配后尝试取消分配。



     在Oracle 11g 以前,Temp 表空间使用以后,虽然可以释放,但是表空间的使用量显示还是100%,可以使用如下脚本查看临时表空间每个数据文件实际使用量:


=============================================================================================================================================
set pagesize 50
col tablespace_name for a20
col "Tempfile name" for a42
set linesize 300
Select f.tablespace_name,
d.file_name "Tempfile name",
round((f.bytes_free + f.bytes_used) / 1024 /1024, 2) "total MB",
round(((f.bytes_free + f.bytes_used) -nvl(p.bytes_used, 0)) / 1024 / 1024, 2) "Free MB" ,
round(nvl(p.bytes_used, 0)/ 1024 / 1024, 2)"Used MB",
round((round(nvl(p.bytes_used, 0)/ 1024 /1024, 2)/round((f.bytes_free + f.bytes_used) / 1024 / 1024, 2))*100,2) as"Used_Rate(%)"
from SYS.V_$TEMP_SPACE_HEADER f,DBA_TEMP_FILES d, SYS.V_$TEMP_EXTENT_POOL p
where f.tablespace_name(+) = d.tablespace_name
and f.file_id(+) = d.file_id
and p.file_id(+) =d.file_id;


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

SELECT D.TABLESPACE_NAME,

SPACE || 'M' "SUM_SPACE(M)",

BLOCKS "SUM_BLOCKS",

SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)",

ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) ||

'%'

"USED_RATE(%)",

FREE_SPACE || 'M' "FREE_SPACE(M)"

FROM ( SELECT TABLESPACE_NAME,

ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,

SUM (BLOCKS) BLOCKS

FROM DBA_DATA_FILES

GROUP BY TABLESPACE_NAME) D,

( SELECT TABLESPACE_NAME,

ROUND (SUM (BYTES) / (1024 * 1024), 2)

FREE_SPACE

FROM DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME) F

WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)

UNION ALL

--如果有临时表空间

SELECT D.TABLESPACE_NAME,

BLOCKS SUM_BLOCKS,

USED_SPACE || 'M' "USED_SPACE(M)",

ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%'

"USED_RATE(%)",

NVL (FREE_SPACE, 0) || 'M' "FREE_SPACE(M)"

FROM DBA_TEMP_FILES

ROUND (SUM (BYTES_USED) / (1024 * 1024), 2)

USED_SPACE,

ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2)

FROM V$TEMP_SPACE_HEADER

ORDER BY 1;

1.2 DBA_TEMP_FREE_SPACE视图
该字典视图是在Oracle 11g新增加的视图,用来查看表空间级别的临时空间使用率信息。此信息是从各种现有视图中导出的。



(1)  列出临时空间使用率信息

(2)  临时表空间使用率中心点



列名             说明

TABLESPACE_NAME  表空间的名称

TABLESPACE_SIZE  表空间的总大小(以字节为单位)

ALLOCATED_SPACE  已分配的总空间(以字节为单位),包括当前已分配的且正在使用中的空间以及当前已分配的且可重用的空间

FREE_SPACE  可用的总空间(以字节为单位),包括当前已分配的、可重用的以及当前未分配的空间





1.3 创建临时表的表空间选项
从Oracle Database11g 版本1 开始,可以在创建全局临时表时指定TABLESPACE子句。

如果没有指定表空间,将在默认的临时表空间中创建全局临时表。此外,还会在与临时表相同的临时表空间中创建在临时表中创建的索引。



注:

可以在DBA_TABLES 中查找用于存储全局临时表的表空间。



如:

CREATE TEMPORARY TABLESPACE temp

TEMPFILE 'tbs_temp.dbf' SIZE 600m REUSEAUTOEXTEND ON MAXSIZE

UNLIMITED

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1m;



CREATE GLOBAL TEMPORARY TABLE temp_table (cvarchar2(10))

ON COMMIT DELETE ROWS TABLESPACE temp;



二.示例


2.1 查看dba_temp_free_space


SQL> set lin 160       

SQL> col tablespace_name for a20

SQL> col tablespace_size for 99999999999

SQL> col allocated_space for 99999999999

SQL> col free_space for 99999999999

SQL> select * from dba_temp_free_space;



TABLESPACE_NAME      TABLESPACE_SIZE ALLOCATED_SPACE   FREE_SPACE

-------------------- ------------------------------ ------------

TEMP                       524288000         7340032    523239424



SQL> select 524288000/1024/1024||'M'from dual;



5242

----

500M

--这里的Temp 表空间是500M。



2.2 执行temp 表空间的online shrink 操作:
SQL> alter tablespace temp shrink space keep 400M;



Tablespace altered.



SQL> select * from dba_temp_free_space;



TABLESPACE_NAME      TABLESPACE_SIZE ALLOCATED_SPACE   FREE_SPACE

-------------------- ------------------------------ ------------

TEMP                       420478976         1048576    419430400



SQL> select 420478976/1024/1024||'M'from dual;



4204

----

401M





2.3 shrink 数据文件
--如果有多个temp数据文件,也可以直接指定某个特定的temp 数据文件来进行shrink:



SQL> col file_name for a50

SQL> select file_name fromdba_temp_files;



FILE_NAME

--------------------------------------------------

/u01/app/oracle/oradata/anqing/temp01.dbf



SQL> alter tablespace temp shrink tempfile '/u01/app/oracle/oradata/anqing/temp01.dbf' keep 300M;



Tablespace altered.



SQL> select * from dba_temp_free_space;



TABLESPACE_NAME      TABLESPACE_SIZE ALLOCATED_SPACE   FREE_SPACE

-------------------- ------------------------------ ------------

TEMP                       315613184         1040384    314572800



SQL> select  315613184/1024/1024||'M' from dual;



315613184/10

------------

300.9921875M



SQL>





2.4 keep 选项说明
KEEP 选项用来指定压缩时表空间或者数据文件shrink的最小值,如果没有执行该命令,那么表空间或数据文件将被压缩到最小值。



SQL> alter tablespace temp shrink space;



Tablespace altered.



SQL> select * from dba_temp_free_space;



TABLESPACE_NAME      TABLESPACE_SIZE ALLOCATED_SPACE   FREE_SPACE

-------------------- ------------------------------ ------------

TEMP                         2088960         1040384      1048576



SQL> select 2088960/1024/1024||'M' fromdual;



2088960/10

----------

1.9921875M



--这里直接被压到2M了。Temp 表空间过小对性能是有影响的,所以在shrink时,还是建议使用keep 指定最小值。



















---------------------------------------------------------------------------------------      
下一篇: swap 释放