oracle临时表空间

ORALCE 临时表空间

临时表空间概念

临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGAsort_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。


二 临时表空间信息

1 查看系统默认临时表空间(database_properties)

SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

 

2 查看用户临时表空间(dba_users)

SELECT USERNAME, default_tablespace,TEMPORARY_TABLESPACE FROM DBA_USERS where username='CHEN';


3 查看临时表空间详细信息(v$tempfile,dba_temp_files)


SELECT FILE#                        AS FILE_NUMBER

    ,NAME                           AS NAME

    ,CREATION_TIME                  AS CREATION_TIME

    ,BLOCK_SIZE                     AS BLOCK_SIZE

    ,BYTES/1024/1024/1024           AS "FILE_SIZE(G)"

    ,CREATE_BYTES/1024/1024/1024    AS "INIT_SIZE(G)"

    ,STATUS                         AS STATUS

    ,ENABLED                        AS ENABLED

FROM V$TEMPFILE;



SELECT TABLESPACE_NAME                 AS TABLESPACE_NAME

        ,FILE_NAME                     AS FILE_NAME

        ,BLOCKS                        AS BLOCKS

        ,STATUS                        AS STATUS

        ,AUTOEXTENSIBLE                AS AUTOEXTENSIBLE

        ,BYTES/1024/1024/1024          AS "FILE_SIZE(G)"

        ,DECODE(MAXBYTES, 0, BYTES/1024/1024/1024,

                          MAXBYTES/1024/1024/1024)

                                       AS "MAX_SIZE(G)"

        ,INCREMENT_BY                  AS "INCREMENT_BY"

        ,USER_BYTES/1024/1024/1024     AS "USEFUL_SIZE"

FROM DBA_TEMP_FILES;


select a.tablespace_name,

       a.file_name,

       a.status,

       b.status as bstatus,

       a.autoextensible,

       a.increment_by,

       a.bytes / 1024 / 1024 / 1024 || 'G' as file_size,

       decode(a.maxbytes,

              0,

              a.bytes / 1024 / 1024 / 1024 || 'G',

              maxbytes / 1024 / 1024 / 1024 || 'G') as max_size,

       a.USER_BYTES / 1024 / 1024 / 1024 || 'G' AS "USEFUL_SIZE"

  from dba_temp_files a, v$tempfile b

 where a.file_name = b.name;


其中使用decode函数的原因:

当临时表空间不是自动增长时,maxbytes=bytes

当临时表空间是自动增长时,maxbytes=maxbytes


管理临时表空间

1创建临时表空间

create temporary tablespace chen_temp tempfile '/data/oradata/cts/chen_temp01.dbf' size 100M autoextend off;


2增加数据文件

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

方法一:

alter tablespace chen_temp add tempfile '/data/oradata/cts/chen_temp02.dbf' size 50m autoextend on next 10M maxsize 100M;

方法二:

alter tablespace chen_temp add tempfile '/data/oradata/cts/chen_temp03.dbf' size 50M autoextend off;

 

3 调整文件大小

如下例子,需要将临时数据文件从50M大小调整为60M

alter database tempfile '/data/oradata/cts/chen_temp03.dbf' resize 60M;


4 设置文件自动扩展,取消自动增长

alter database tempfile '/data/oradata/cts/chen_temp03.dbf' autoextend on next 10M maxsize unlimited;


alter database tempfile '/data/oradata/cts/chen_temp03.dbf' autoextend off;


5收缩临时表空间

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

alter tablespace chen_temp shrink space keep 200M;

alter tablespace chen_temp shrink tempfile '/data/oradata/cts/chen_temp03.dbf';


6切换临时表空间

1 切换系统默认临时表空间

select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

alter database default temporary tablespace chen_temp;

2 切换用户默认来临时表空间

select username,temporary_tablespace from dba_users where username='CHEN';

alter user chen temporary tablespace chen_temp;


7移动重命名文件

例如,我需要将/data/oradata/cts/chen_temp03.dbf这个文件移动并重命名为/data/oradata/cts/chen/chen_temp003.dbf


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

alter database tempfile '/data/oradata/cts/chen_temp03.dbf' offline;


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

mv /data/oradata/cts/chen_temp03.dbf /data/oradata/cts/chen/chen_temp003.dbf


3: 使用脚本ALTER DATABASE RENAME FILE

alter database rename file '/data/oradata/cts/chen_temp03.dbf' to '/data/oradata/cts/chen/chen_temp003.dbf';


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

alter database tempfile '/data/oradata/cts/chen/chen_temp003.dbf' online;


8监控临时表空间

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

SELECT TU.TABLESPACE_NAME                                    AS "TABLESPACE_NAME",

       TT.TOTAL - TU.USED                                    AS "FREE(G)",

       TT.TOTAL                                              AS "TOTAL(G)",

       ROUND(NVL(TU.USED, 0) / TT.TOTAL * 100, 3)            AS "USED(%)",

       ROUND(NVL(TT.TOTAL - TU.USED, 0) * 100 / TT.TOTAL, 3) AS "FREE(%)"

FROM (SELECT TABLESPACE_NAME,

              SUM(BYTES_USED) / 1024 / 1024 / 1024 USED

       FROM V$TEMP_SPACE_HEADER

       GROUP BY TABLESPACE_NAME) TU ,

     (SELECT TABLESPACE_NAME,

              SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL

       FROM DBA_TEMP_FILES

       GROUP BY TABLESPACE_NAME) TT

WHERE TU.TABLESPACE_NAME = TT.TABLESPACE_NAME;


SELECT ROUND((F.BYTES_FREE  + F.BYTES_USED)/1024/1024/1024, 2)                         AS "TOTAL(GB)",

       ROUND(((F.BYTES_FREE  + F.BYTES_USED) - NVL(P.BYTES_USED, 0))/1024/1024/1024,2) AS "FREE(GB)",

       D.FILE_NAME                                                                     AS "TEMP_FILE",

       ROUND(NVL(P.BYTES_USED, 0)/1024/1024/1024, 2)                                   AS "USED(GB)" ,

       ROUND((F.BYTES_USED + F.BYTES_FREE)/1024/1024/1024, 2)                          AS "TOTAL(GB)",

       ROUND(((F.BYTES_USED + F.BYTES_FREE) - NVL(P.BYTES_USED, 0))/1024/1024/1024, 2) AS "FREE(GB)" ,

       ROUND(NVL(P.BYTES_USED, 0)/1024/1024/1024, 2)                                   AS "USED(GB)"

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;


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

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;


3 查找消耗临时表空间资源比较多的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;


9删除临时表空间及数据文件


(1)删除数据文件

方法1:

alter tablespace chen_temp drop tempfile '/data/oradata/cts/chen_temp01.dbf';

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


方法2:

alter database tempfile '/data/oradata/cts/chen_temp02.dbf' drop including datafiles;

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


(2)删除临时表空间

drop tablespace chen_temp including contents and datafiles cascade constraints;

注意:

1 执行上面语句很长时间没没有结束,查询SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP';

发现有大量的会话在使用这个空间,所有无法删除

解决办法:重启数据库alter system checkpoint;

Shutdown immediate

Startup

在查询SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP';已经没有会话;

再次执行drop tablespace chen_temp including contents and datafiles cascade constraints;成功。

2   Drop table cascade constraints 是不影响到存储于object里的row data,只是删除了相应的约束条件。

3   不能删除当前用户的默认表空间,否则会报ORA-12906错误。

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


临时表空间组


Oracle 10g之前,同一用户的多个会话只可以使用同一个临时表空间,因为在给定的时间只有一个临时表空间默认给用户,为了解决这个潜在的瓶颈,Oracle支持临时表空间组即包含多个临时表空间的集合。临时表空间组逻辑上就相当于一个临时表空间。

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

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

 

create temporary tablespace chen_temp1 tempfile '/data/oradata/cts/chen_temp01.dbf' size 10M;


create temporary tablespace chen_temp2 tempfile '/data/oradata/cts/chen_temp02.dbf' size 10M;


create temporary tablespace chen_temp3 tempfile '/data/oradata/cts/chen_temp03.dbf' size 10M;


添加chen_temp1,chen_temp2,chen_temp3到临时表空间组tempgrp中


alter tablespace chen_temp1 tablespace group tempgrp;

alter tablespace chen_temp2 tablespace group tempgrp;

alter tablespace chen_temp3 tablespace group tempgrp;


启用临时表空间组

alter database default temporary tablespace tempgrp;

select * from dba_tablespace_groups;


此时数据库所有用户的默认临时表空间为tempgrp

SELECT USERNAME, default_tablespace,TEMPORARY_TABLESPACE FROM DBA_USERS where username='CHEN';


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

alter tablespace chen_temp1 tablespace group tempgrp;


删除临时表空间组
必须先删除成员

alter tablespace chen_temp1 tablespace group '';

alter tablespace chen_temp2 tablespace group '';

select * from dba_tablespace_groups;

当表空间组是数据库默认表空间时,最后一个成员删除报错:ORA-10919:Defualt temporary tablespace group must be have at least one tablespace
此时再删除最后一个成员,临时表空间组自动消失
alter tablespace chen_temp3 tablespace group '';
select * from dba_tablespace_groups;
 
删除临时表空间

SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP1';

SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP2';

SELECT * FROM v$sort_usage where tablespace='CHEN_TEMP3';

drop tablespace chen_temp1 including contents and datafiles cascade constraints;

drop tablespace chen_temp2 including contents and datafiles cascade constraints;

drop tablespace chen_temp3 including contents and datafiles cascade constraints;
 
 



 

 

 

 

参考:

http://www.cnblogs.com/david-zhang-index/archive/2012/04/11/2442726.html

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

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29785807/viewspace-1579312/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29785807/viewspace-1579312/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值