oracle中临时表空间剩余大小,临时表空间过大

出差回来发现有两个临时表空间分别达到了29g和28g,于是上网看看解决方法,

查到一下几个文章,抄过来做一个记录。

SELECT UPPER(F.TABLESPACE_NAME) "表空间名",

D.TOT_GROOTTE_MB "表空间大小(M)",

D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",

TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) /

D.TOT_GROOTTE_MB * 100,

2),

'990.99') "使用比",

F.TOTAL_BYTES "空闲空间(M)",

F.MAX_BYTES "最大块(M)"

FROM (SELECT TABLESPACE_NAME,

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

ROUND(MAX(BYTES) / (1024 * 1024),2) MAX_BYTES

FROM SYS.DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME) F,

(SELECT DD.TABLESPACE_NAME,

ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM

SYS.DBA_DATA_FILES DD

GROUP BY DD.TABLESPACE_NAME) D

WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME

ORDER BY 4 DESC

;

临时表空间主要使用在:

- 索引创建或重创建。

- ORDER BY or GROUP BY

- DISTINCT 操作。

- UNION & INTERSECT & MINUS -

Sort-Merge joins. - Analyze 操作

- 有些异常将会引起temp暴涨

create temporary tablespace a7_t

TEMPFILE 'D:\oracle\oradata\exchange\linshi.dbf' SIZE 512M

REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;

--创建中转临时表空间

alter user a7 temporary tablespace

a7_t;--改变缺省临时表空间为刚刚创建的新临时表空间

drop tablespace a7_tmp including contents

and datafiles; --删除原来临时表空间

create temporary tablespace a7_tmp

TEMPFILE 'D:\oracle\oradata\exchange\a7_tmp.dbf' SIZE 512M

REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;

--重新创建临时表空间

alter user a7 temporary tablespace

a7_tmp;

drop tablespace a7_t including contents

and datafiles; --删除中转用临时表空间

以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。下面是查询在sort排序区使用的执行耗时的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

或是:

Select

su.username,su.Extents,tablespace,segtype,sql_text

From v$sort_usage su,v$sql s

Where su.SQL_ID = s.SQL_ID

可以kill

session1、使用如下语句a查看一下认谁在用临时段

SELECT se.username, se.SID, se.serial#,

se.sql_address, se.machine, se.program, su.TABLESPACE,

su.segtype, su.CONTENTS FROM v$session se,

v$sort_usage su

WHERE se.saddr = su.session_addr

2、kill正在使用临时段的进程

SQL>Alter system kill session

'sid,serial#';

3、把TEMP表空间回缩一下

SQL>Alter tablespace TEMP

coalesce; --??

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

如果临时表空间是temporary的,空间不会释放,只是在sort结束后被标记为free的,如果是permanent的,由SMON负责在sort结束后释放,都不用去手工释放的。查看有哪些用户和SQL导致TEMP增长的两个重要视图:

v$sort_usage和v$sort_segment

对于非LMT管理方式的TEMP表空间,最简单的方法是Metalink给出的一个方法:(仅适用于8i及8i以下版本)

修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp default

storage(pctincrease 1);

SQL>alter tablespace temp default

storage(pctincrease 0);

而对于LMT管理方式的TEMP表空间,需要重新建立一个新的临时表空间,将所有用户的默认临时表空间指定到新的表空间上,然后offline旧的临时表空间,并drop掉。具体步骤如下:

首先查询用户的缺省临时表空间:

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 11:11:43

2006

Copyright (c) 1982, 2002, Oracle Corporation. All rights

reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

SQL> select username,temporary_tablespace from

dba_users;

USERNAME TEMPORARY_TABLESPACE

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

SYS TEMP2

SYSTEM TEMP2

OUTLN TEMP2

EYGLE TEMP2

CSMIG TEMP2

TEST TEMP2

REPADMIN TEMP2

......

13 rows selected.

SQL> select name from v$tempfile;

NAME

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

/opt/oracle/oradata/conner/temp02.dbf

/opt/oracle/oradata/conner/temp03.dbf

重建新的临时表空间并进行切换:

SQL> create temporary tablespace temp tempfile

'/opt/oracle/oradata/conner/temp1.dbf' size 10M;

Tablespace created.

SQL> alter tablespace temp add tempfile

'/opt/oracle/oradata/conner/temp2.dbf' size 20M;

Tablespace altered.

SQL> alter database default temporary tablespace

temp;

Database altered.

SQL> select username,temporary_tablespace from

dba_users;

USERNAME TEMPORARY_TABLESPACE

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

SYS TEMP

SYSTEM TEMP

OUTLN TEMP

EYGLE TEMP

CSMIG TEMP

TEST TEMP

REPADMIN TEMP

.......

13 rows selected.

如果原临时表空间无用户使用(select

tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks

from

v$sort_segment;),如果是文件系统可以看看文件的时间戳。

我们可以删除该表空间:(如果原临时表空间还有用户在用,你是删除不了这个表空间的!在一次生产环境的临时表空间切换中,原临时表空间始终有用户在上面,即使我关闭了前台程序,也还是有用户,新的临时表空间已经没有用户在使用了。我估计用户进程已经死在原临时表空间了。后来只有重新启动数据库才能把原来旧的临时表空间给删除。)

SQL> drop tablespace temp2;

Tablespace dropped.

SQL>

SQL> select name from v$tempfile;

NAME

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

/opt/oracle/oradata/conner/temp1.dbf

/opt/oracle/oradata/conner/temp2.dbf

SQL> select

file_name,tablespace_name,bytes/1024/1024 MB,autoextensible

2 from dba_temp_files

3 /

FILE_NAME TABLESPACE_NAME MB AUTOEXTENSIBLE

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

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

/opt/oracle/oradata/conner/temp2.dbf TEMP 20 NO

/opt/oracle/oradata/conner/temp1.dbf TEMP 10 NO

drop tablespace temp including contents

and datafiles; --将表空间的内容和数据文件一起删除。

下面是查询在sort排序区使用的执行耗时的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

或是:

Select

su.username,su.Extents,tablespace,segtype,sql_text

From v$sort_usage su,v$sql s

Where su.SQL_ID = s.SQL_ID

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

我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,

磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,

在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,

如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,

如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。

像上文提到的恐怖现象经过分析可能是以下几个方面的原因造成的。

1. 没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,

最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,

临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。

2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,

根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,

如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。

3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,

而如果有索引的话,一般只是将索引的数据复制到临时表空间中。

参照以上原因尝试解决下,

如果不行就清空临时表空间,不过还是建议先查找临时表空间增长的原因才是关键

清控临时表空间

1.startup --启动数据库

2.create temporary tablespace TEMP2 TEMPFILE

'/home2/oracle/oradata/sysmon/temp02.dbf ' SIZE 512M REUSE

AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间

3.alter database default temporary tablespace

temp2;--改变缺省临时表空间为刚刚创建的新临时表空间temp2

4.drop tablespace temp including contents and

datafiles;--删除原来临时表空间

5.create temporary tablespace TEMP TEMPFILE

'/home2/oracle/oradata/sysmon/temp01.dbf ' SIZE 512M REUSE

AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --重新创建临时表空间

6.alter database default temporary tablespace

temp;--重置缺省临时表空间为新建的temp表空间

7.drop tablespace temp2 including contents and

datafiles;--删除中转用临时表空间

8.alter user roll temporary tablespace temp;

--重新指定用户表空间为重建的临时表空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值