在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放临时段。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。下面总结出几种处理方法:
重启库
数据库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。
修改TEMP表空间的storage参数
这个方法来自Metalink主要是让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。
SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;
以上方法在9I和10G不行,
SQL> alter tablespace temp PCTINCREASE 1;
alter tablespace temp PCTINCREASE 1
*
第 1 行出现错误:
ORA-02142: ALTER TABLESPACE 选项缺失或无效
杀死会话,回收收缩
句a查看一下认谁在用临时段
SQL>SELECT se.username,
sid,
serial#,
sql_address,
machine,
program,
tablespace,
segtype,
contents
FROM v$session se,
v$sort_usage su
WHERE se.saddr=su.session_addr
杀死正在使用临时段的进程
SQL>Alter system kill session 'sid,serial#';
回缩TEMP表空间
SQL>Alter tablespace TEMP coalesce;
使用诊断事件
确定TEMP表空间的ts#
SQL>select ts#, name from sys.ts$ ;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
4 TOOLS
5 INDX
6 DRSYS
执行清理操作
SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;
说明:
temp表空间的TS# 为 3*, So TS#+ 1= 4
一下是摘自Metalink的说明
The DROP_SEGMENTS event
~~~~~~~~~~~~~~~~~~~~~~~
Available from 8.0 onwards.
DESCRIPTION
Finds all the temporary segments in a tablespace which are not
currently locked and drops them.
For the purpose of this event a "temp" segment is defined as a
segment (seg$ entry) with TYPE#=3. Sort space in a TEMPORARY
tablespace does not qualify under this definition as such
space is managed independently of SEG$ entries.
PARAMETERS
level - tablespace number+1. If the value is 2147483647 then
temp segments in ALL tablespaces are dropped, otherwise, only
segments in a tablespace whose number is equal to the LEVEL
specification are dropped.
NOTES
This routine does what SMON does in the background, i.e. drops
temporary segments. It is provided as a manual intervention tool which
the user may invoke if SMON misses the post and does not get to
clean the temp segments for another 2 hours. We do not know whether
missed post is a real possibility or more theoretical situation, so
we provide this event as an insurance against SMON misbehaviour.
Under normal operation there is no need to use this event.
It may be a good idea to
alter tablespace <tablespace> coalesce;
after dropping lots of extents to tidy things up.
*SQL Session (if you can connect to the database):
alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1';
The TS# can be obtained from v$tablespace view:
select ts# from v$tablespace where name = '<Tablespace name>';
Or from SYS.TS$:
select ts# from sys.ts$ where name = '<Tablespace name>' and online$ != 3;
If ts# is 5, an example of dropping the temporary segments in that tablespace
would be:
alter session set events 'immediate trace name DROP_SEGMENTS level 6';
临时表空间相关常用sql
查看临时表空间的使用情况(GV_$TEMP_SPACE_HEADER视图必须在sys用户下才能查询)
GV_$TEMP_SPACE_HEADER视图记录了临时表空间的使用大小与未使用的大小
dba_temp_files视图的bytes字段记录的是临时表空间的总大小
SELECT temp_used.tablespace_name,
total - used as "Free",
total as "Total",
round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
FROM GV$TEMP_SPACE_HEADER
GROUP BY tablespace_name) temp_used,
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
FROM dba_temp_files
GROUP BY tablespace_name) temp_total
WHERE temp_used.tablespace_name = temp_total.tablespace_name
查找比较消耗临时表空间资源的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
查看当前临时表空间使用大小与正在占用临时表空间的sql语句
select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
from v$sort_usage sort, v$session sess, v$sql sql
where sort.SESSION_ADDR = sess.SADDR
and sql.ADDRESS = sess.SQL_ADDRESS
order by blocks desc;
个人认为,临时表空间组可以有效减少临时表空间使用率100%的情况
具体可参见
http://czmmiao.iteye.com/blog/1293790
参考至:EVENT: DROP_SEGMENTS - Forcing cleanup of TEMPORARY segments [ID 47400.1]
http://www.cnblogs.com/lanzi/archive/2011/06/08/2075447.html
http://hi.baidu.com/yafeiie/blog/item/8272452775690606908f9d44.html
http://www.tbdata.org/archives/203
本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
解决 Oracle 临时表空间满的问题需要通过查看当前数据库的默认临时表空间、查看当前临时表空间的大小、创建新的临时表空间、将新建的临时表空间设置为数据库的默认临时表空间、删除原来的临时表空间、创建新的临时表...
在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...
### Oracle的Temp表空间与UNDO表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...
合理的管理和优化临时表空间不仅可以提高系统的性能,还可以帮助解决空间不足等问题。本文将详细介绍如何通过SQL脚本进行临时表空间的查询、创建、修改以及删除操作。 #### 一、查询临时表空间信息 首先,我们来...
当发现现有临时表空间已满且无法直接调整大小时,解决方案之一是创建一个新的临时表空间。具体步骤如下: 1. **创建新临时表空间**: ```sql CREATE TEMPORARY TABLESPACE temp02 TEMPFILE '/oracle/oms/oradata/...
Oracle 表空间命令语句大全提供了 Oracle 数据库管理的重要操作,包括建立表空间、建立 UNDO 表空间、建立临时表空间、改变表空间状态、删除表空间、扩展表空间和查看表空间信息等。这些命令对于 Oracle 数据库管理...
如果上述方法仍不能解决问题,那么就需要考虑增加表空间的数据文件。这可以通过以下命令实现: ```sql ALTER DATABASE DATAFILE '/path/to/new/datafile.dbf' ADD TO TABLESPACE TEMP SIZE 100M AUTOEXTEND ON NEXT ...
### Oracle表空间与数据文件详解 #### 一、Oracle表空间与数据文件的概念 在Oracle数据库中,**表空间**是存储数据的基本单位之一,它是一个或多个数据文件的逻辑集合。表空间提供了数据存储的逻辑视图,而数据...
### Oracle 临时表空间详解 #### 一、Oracle表空间概览 在Oracle数据库系统中,数据被组织成多个逻辑单元,这些单元被称为表空间。每个表空间由一个或多个物理磁盘文件(称为数据文件)组成,并且是数据库中的最高...
从标题和描述中,我们可以了解到该文档主要讲述了Oracle8i数据库临时表空间满时的解决方案。Oracle8i是甲骨文公司推出的一个关系型数据库管理系统,它是Oracle数据库的一个版本,在业界有着广泛的应用。临时表空间...
因此,Oracle 引入了表空间的概念,以解决存储空间的管理问题。 Oracle 表空间是指一个逻辑概念,由若干个操作系统文件组成的。这些文件可以不是很大,但是它们组成了一个统一的存储空间。一个数据文件只能属于一个...
创建数据表空间的命令与创建临时表空间类似,但是不使用temporary关键字。同样需要指定表空间名称、数据文件的路径和大小、是否自动扩展和最大扩展的大小,以及使用本地还是字典管理空间。例如: create tablespace ...
- **temporary tablespace**: 设置用户的临时表空间。 #### 三、设置用户权限 为了确保数据库的安全性和数据的一致性,需要对用户进行权限设置。 ``` /*权限*/grant connect, resource, dba to zoweenewerp; ``` ...
PERMANENT|TEMPORARY 指出表空间的属性,是永久表空间还是临时表空间。永久表空间存放的是永久对象,临时表空间存放的是 session 生命周期中存在的临时对象。 11、Extent Manager Clause extent_manager_clause 这...
CREATE TEMPORARY TABLESPACE <表空间名> TEMPFILE '<物理文件路径>' SIZE <初始大小> AUTOEXTEND ON NEXT <下次扩展大小> MAXSIZE <最大大小> EXTENT MANAGEMENT LOCAL; ``` 以给定的示例为例: ```sql CREATE ...
除了基本的SMS和DMS表空间之外,DB2还支持几种特殊类型的表空间,如系统临时表空间(System Temporary Table Space, STTS)和用户临时表空间(User Temporary Table Space, UTTS)。 **系统临时表空间(STTS)**: 系统...
此命令将用户`sysadmin`在表空间`juddi`上的配额设置为100MB。 综上所述,通过这些命令和语法,我们可以有效地在Oracle数据库中创建并管理表空间,以及对用户进行相应的权限配置。这有助于更好地控制数据存储和访问...
在Oracle数据库管理系统中,创建表空间是管理数据库存储空间的关键操作。表空间是数据库中用于存储数据对象(如表、索引、视图等)的逻辑结构。它将物理磁盘上的一个或多个数据文件组织成一个逻辑单元,使得数据库...
创建临时表空间的步骤是:create temporary tablespace test_temp tempfile 'F:\app\think\oradata\orcl\test_temp01.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local;。 创建表空间...
- `CREATE TEMPORARY TABLESPACE`指明了要创建的是临时表空间。 - `ndgl_isc_temp`为新建临时表空间的名称。 - `TEMPFILE`定义了该临时表空间对应的数据文件路径和文件名。 - `SIZE 500M`同样指定了数据文件的初始...