视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
详解OracleTemp临时表空间处理方法
2025-09-30 19:39:58 责编:小OO
文档
Oracle认证:详解OracleTemp临时表空间处理方法

  临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理。当oracle里需要用到sort的时候,PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间,正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段的。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。

  排序是很耗资源的,Temp表空间满了,关键是优化你的语句,尽量使排序减少才是上策。

  Temp表空间满时的处理方法:

  一、修改参数(仅适用于8i及8i以下版本)

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

  SQL>alter tablespace temp increase 1;

  SQL>alter tablespace temp increase 0;

  二、kill session

  1、 使用如下语句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;

  注:

  这处方法只能针对字典管理表空间(Dictionary Managed Tablespace)。于本地管理表空间(LMT:Local Managed Tablespace),不需要整理的。9i以后只能创建本地管理的表空间。

  CREATE TABLESPACE TEST DATAFILE ‘D:\\TEST01.dbf’ SIZE 5M EXTENT MANAGEMENT DICTIONARY

  CREATE TABLESPACE TEST DATAFILE ‘D:\\TEST01.dbf’ SIZE 5M EXTENT MANAGEMENT LOCAL;

  三、重启数据库库

  库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。

  四、使用诊断事件的一种方法,也是最有效的一种方法

  1、 确定TEMP表空间的ts#

  SQL>select ts#, name from sys.ts$ ;

  TS# NAME

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

  0 SYSTEM

  1 UNDOTBS1

  2 SYSAUX

  3 TEMP

  4 USERS

  5 UNDOTBS2

2、执行清理操作

  SQL>alter session set events ‘immediate trace name DROP_SEGMENTS level 4’ ;

  说明:

  temp表空间的TS# 为 3, So TS#+ 1= 4

  重建TEMP 表空间:

  Temporary tablespace是不能直接drop默认的临时表空间

的,不过我们可以通过以下方法来做。

  准备:查看目前的Temporary Tablespace

  SQL> select name from v$tempfile;

  NAME

  ———————————————————————

  D:\\ORACLE\\ORADATA\\TEST\\TEMP01.DBF

  SQL> select username,temporary_tablespace from dba_users;

  USERNAME TEMPORARY_TABLESPACE

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

  MGMT_VIEW TEMP

  SYS TEMP

  SYSTEM TEMP

  DBSNMP TEMP

  SYSMAN TEMP

  1.创建中转临时表空间

  create temporary tablespace TEMP1 TEMPFILE ‘E:\\ORACLE\\ORADATA\\ORCL\emp02.DBF’ SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

  2.改变缺省临时表空间 为刚刚创建的新临时表空间temp1

  alter database default temporary tablespace temp1;

  3.删除原来临时表空间

  drop tablespace temp including contents and datafiles;

  4.重新创建临时表空间

  create temporary tablespace TEMP TEMPFILE ‘E:\\ORACLE\\ORADATA\\ORCL\emp01.DBF’ SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

  5.重置缺省临时表空间为新建的temp表空间

  alter database default temporary tablespace temp;

  6.删除中转用临时表空间

  drop tablespace temp1 including contents and datafiles;

  7.如果有必要,那么重新指定用户表空间为重建的临时表空间

  alter user arbor temporary tablespace temp;

  查看表空间语句,不过查不出Temp表空间:

  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

  以上就是Oracle临时表空间的处理方法,希望会对读者带来帮助。下载本文

显示全文
专题