oracle 9i 临时表空间的问题

合集下载

temp 临时表空间不释放

temp 临时表空间不释放

如果您遇到了Oracle数据库中temp表空间不释放的问题,这可能是由于多种原因造成的。

以下是一些建议和步骤,帮助您解决这个问题:1. **识别问题**:首先,确认确实有临时空间没有被释放。

您可以通过查询`DBA_TEMP_FREE_SPACE`视图来查看可用的临时空间。

```sqlSELECT * FROM DBA_TEMP_FREE_SPACE WHERE TABLESPACE_NAME = 'TEMP';```2. **会话级别的临时表空间使用**:如果您知道是哪个会话或进程在使用这些临时空间,您可以考虑直接在那个会话中结束其使用,例如通过断开连接或结束进程。

3. **清除旧的临时段**:Oracle会自动清除临时段,但有时由于某种原因(如错误的段策略配置)这可能不会发生。

您可能需要手动清理这些旧的临时段。

但在此之前,请确保先备份数据库。

对于AIX或HP-UX系统:1. 使用`alter system`命令,将`undo_management`设置为`manual`。

2. 执行`drop tablespace temp including contents;`。

3. 重新创建临时表空间。

4. 将`undo_management`重新设置为`auto`。

5. 执行`alter system flush temp_undo_tablespace;`。

对于Linux系统:1. 使用`alter system`命令,将`undo_management`设置为`manual`。

2. 执行`drop tablespace temp including contents;`。

3. 重新创建临时表空间。

4. 将`undo_management`重新设置为`auto`。

5. 执行`alter system flush temp_undo_tablespace;`。

6. 如果上述步骤没有解决问题,您可能需要考虑手动清理文件系统上的临时文件或与操作系统管理员联系,以确保文件系统空间被正确释放。

oracle修改表空间大小的方法

oracle修改表空间大小的方法

oracle修改表空间大小的方法一、引言Oracle数据库是广泛应用于企业级应用系统的数据库管理系统,表空间是Oracle数据库中最基本的数据存储单位。

为了满足业务需求或应对数据增长,常常需要对表空间的大小进行调整。

本篇文章将详细介绍如何修改Oracle数据库中的表空间大小。

二、准备工作1. 确认具有足够的权限:修改表空间大小需要具有足够的权限,通常需要具有DBA(数据库管理员)角色或与之相关的权限。

2. 了解表空间状态:在修改表空间大小之前,需要确保表空间处于正确的状态,例如是否打开了,是否是只读状态等。

3. 备份数据:修改表空间大小可能会对数据库中的数据产生影响,因此在执行此操作之前,强烈建议进行数据备份。

1. 使用ALTER TABLESPACE命令:使用ALTER TABLESPACE命令可以动态地增加或减少表空间中的存储空间。

以下是基本语法:```sqlALTER TABLESPACE tablespace_name ADD SPACE[ ( space_number ) ] [ DATAFILE 'file_path' [ SIZE{ file_size | next_autoextend } ] ] ;```* `tablespace_name`:要修改的表空间名称。

* `space_number`:要添加的空间编号(可选)。

* `file_path`:新数据文件的路径和文件名。

* `file_size`:新数据文件的大小(可选)。

* `next_autoextend`:自动扩展的最小大小(可选)。

2. 使用ALTER TABLE命令:通过修改表的数据块大小来间接调整表空间的大小。

这种方法适用于调整单个表的大小。

以下是基本语法:```sqlALTER TABLE table_name MODIFY (data_block_size =new_size);```* `table_name`:要修改的表的名称。

Oracle临时表空间满的处理步骤

Oracle临时表空间满的处理步骤

Oracle临时表空间主要用来做查询和存放一些缓冲区数据。

临时表空间消耗的主要原因是需要对查询的中间结果进行排序。

重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp 表空间会一直增长。

直到耗尽硬盘空间。

临时表空间不足,会产生如下报错:网上有人猜测在磁盘空间的分配上,oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB。

也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小。

临时表空间的主要作用:索引create或rebuildOrder by 或 group byDistinct 操作Union 或 intersect 或 minusSort-merge joinsanalyze清除临时表空间的方法治标不治本从根本上降低temp表空间的膨胀的方法有2个:1 设置合理的pga或sort_area_size2 优化引起disk sort的sql清除并重建临时表空间的步骤:0.shutdown immediate;1.startup --启动数据库2.create temporary tablespace TEMP2 TEMPFILE'E:/oracle/oradata/battery/temp02.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间3.alter database default temporary tablespace temp2;--改变缺省临时表空间为刚刚创建的新临时表空间temp24.drop tablespace temp including contents and datafiles;--删除原来临时表空间5. create temporary tablespace TEMP TEMPFILE 'E:/oracle/oradata/battery/temp.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 backwardsys temporary tablespace temp; --重新指定用户表空间(用户名)为重建的临时表空间9.可通过语句select username,default_tablespace,temporary_tablespace from dba_users 来查询数据库用户的临时表空间。

处理临时表空间满的一些方法

处理临时表空间满的一些方法

处理临时表空间满的一些方法如何处理Oracle中TEMP表空间满的问题(转载)正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段a的。

但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。

这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。

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

法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp default storage(pctincrease 1) ;SQL>alter tablespace temp default storage(pctincrease 1) ;法三、我常用的一个方法,具体内容如下:1、使用如下语句a查看一下认谁在用临时段SELECT username,sid,serial#,sql_address,machine,program,tablespace,segtype,contentsFROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法1、确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP4 TOOLS5 INDX6 DRSYS2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为3*, So TS#+ 1= 4其它:1、出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的。

Oracle临时表空间清理

Oracle临时表空间清理

Oracle 临时表空间清理回收
Oracle临时表空间使用时,一旦空间自动扩展,已扩展的大小是不能收缩的,除非重建临时表空间。

正常来说临时表空间中非活动段是由后台smon进程自动释放的,但smon进程每两个小时五分钟才进行一次临时段的回收清理,且每次清理只会回收五个临时段,因此如果连接排序等操作过于频繁时,会导致临时表空间扩展,当然这跟配置的Oracle物理内存也有关系,主要是PGA区,如果配置的内存过少,大量的排序在内存中无法完成,将会额外使用临时表空间来完成,因此临时表空间消耗与配置了大PGA内存相比必然多出。

频繁复杂的语句连接排序完全可能导致临时表空间不停扩展,临时段来不及回收,出现无临时段可用的情况。

如果临时段不能及时释放,通常可以通过重启数据库来清理非活动的临时段,实践证明没有问题。

但如果生产环境不适宜重启数据库,也可以使用手工方式进行非活动临时段的清理。

Oracle 9i OEM中经常看到临时表空间满,其实那是假象,因为OEM是从v$temp_extent_pool统计的。

正常来说要看v$sort_segment中sum(free_blocks)是不是近于0,以确认临时表空间是不是真的满了,如果为0,则表明临时表空间已被当前激活临时段用完。

手工清理非活动临时段的方法如下:
1、正常退出、终止所有连接数据库的应用
5、执行临时表空间非激活临时段清理
该方法适用于Oracle9i以上版本。

Oracle_表空间的过大处理方法

Oracle_表空间的过大处理方法

--临时表空间满时的处理方法1.增加临时文件: 不建议设置为自增长导致把磁盘给撑满SQL> ALTER TABLESPACE TEMP ADD TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'SIZEE 10M AUTOEXTEND OFF;2.修改临时文件: 可以将原来的数据文件改大一点如:SQL> ALTER DATABASE TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'RESIZE100M;3.收缩Shrinking临时表空间SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP20M; 收缩表空间SQL> ALTER TABLESPACE temp SHRINK TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'; 收缩文件数据库重启后,会自动释放temp表空间默认临时表空间TEMP的过大的重建流程如果删除不了查询哪些sql在使用临时表空间,开启另外一个session查询SQL> selectername,se.sid,se.serial#,su.extents,su.blocks*to_number(rtrim(p.value))as space,tablespace,segtype,sql_text from v$sort_usage su,v$parameter p,v$sessionse,v$sql s where ='db_block_size'and su.session_addr=se.saddr ands.hash_value=su.sqlhash and s.address=su.sqladdr order by ername,se.sid;如果列出存在的,则通过以下语句杀掉这些sid与serial 【注意:1是系统进程不能乱杀】SQL> alter system kill session'187,12619';SYSTEM与SYSAUX表空间满了怎么办?1.添加表空间2.把system或者sysaux表空间的信息迁移到其它表空间。

Oracle10g的临时表空间占满之后的解决方法。

Oracle10g的临时表空间占满之后的解决方法。

Oracle10g的临时表空间占满之后的解决方法。

公司客户数据库用了一段时间之后,总是出现磁盘被占满的情况。

基本上这个情况要么就是undo表空间很大,要么就是临时表空间很大,这个时候就需要进行转储undo表空间或者临时表空间。

以下是解决方法。

---解决临时表空间Temp的方法TEMP文件尚未调整,还是16G,首先创建了一个新的TEMP文件并设定为缺省临时表空间SQL> create temporary tablespace TEMP3 TEMPFILE '/opt/oracle/oradata/cuss/TEMP2.dbf' size 20m reuse autoextend off;SQL>alter database default temporary tablespace "TEMP2"结果这个情况下做exp产生ORA-01403的错误,后来得知是因为TEMP临时表空间容量过小的原因重新创建一个TEMP3文件,初始大小1G,每次增长200M,最大限制为4G。

SQL> create temporary tablespace TEMP3 TEMPFILE'/opt/oracle/oradata/cuss/TEMP3.dbf' size 1000m reuse autoextend on next 200m maxsize 4000m;把缺省临时表空间指向这个新建的TEMP3。

SQL>alter database default temporary tablespace "TEMP3"删除原有的临时表空间文件和操作系统中的对应物理文件,释放磁盘空间SQL>drop tablespace temp2 including contents and datafiles;重新做exp导出,导出成功。

至此调整结束。

oracle中临时表用法

oracle中临时表用法

在Oracle 数据库中,临时表(Temporary Table)是一种在会话期间存在并可用的表,这种表在会话结束时自动删除。

临时表的主要作用是为了解决数据管理的问题及优化查询性能,可以大大减少数据的I/O 操作,提高查询的速度。

临时表提供了一个临时存储结果集的空间,在某些情况下,创建一个临时表来存储查询的结果集,可能要比多次进行复杂的连接查询更为高效。

常见的用法包括但不限于以下几种:1. 存储及处理大型数据集:对于数据存放不方便的情况,使用临时表可以提高查询速度并且减少与外部程序的交互。

2. 存储查询的中间结果:当多个表连接查询时,查询的结果可能是复杂的中间结果,此时可以使用临时表存储结果,以便后续的查询操作,这可以大大提高查询效率。

3. 缓存查询结果:将查询结果存储到临时表中,在下一次查询时可以直接从临时表中获取数据而不需要再次执行查询,减少了查询的时间。

在Oracle 中创建临时表的语法如下所示:```CREATE GLOBAL TEMPORARY TABLE 表名(列名数据类型,...)ON COMMIT {DELETE|PRESERVE} ROWS;```创建临时表的时候需要设置ON COMMIT 子句。

DELETE 这个选项表示当事务提交后删除临时表中所有的数据。

PRESERVE 这个选项则表示当事务提交后保留临时表中的数据。

使用GLOBAL 关键字创建的是全局临时表,可以被其他会话访问;如果使用的是SESSION 关键字,则创建的是会话级别的临时表,只能被当前会话访问。

临时表在使用结束之后,需要使用DROP TABLE 命令来删除。

例如:```DROP TABLE 表名;```需要注意的是,临时表的作用是暂时存储数据,使用后需要及时删除,否则可能会浪费存储空间和影响其他查询。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

oracle 9i 临时表空间的问题正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉仍没有解决问题。

这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。

法一、重启库库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp increase 1;SQL>alter tablespace temp increase 0;法三、我常用的一个方法,具体内容如下:1、使用如下语句a查看一下认谁在用临时段SELECT * FROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法1、确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP4 TOOLS5 INDX6 DRSYS2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为 3*, So TS#+ 1= 4其它:1、出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的。

也可能包含着2、观注TEMP等这些空间的状态是Dba日常职责之一,我们可以通过Toad、Object Browser等这些工具办到,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_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY 4 DESCOracle9i引入了全局缺省临时表空间,缺省的如果不指定用户临时表空间,Oracle会为用户指定这个缺省临时表首先查询用户的缺省临时表空间:[oracle@jumper oracle]$ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.4.0 - Production on Wed Apr 12 11:11:43 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - ProductionSQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------ ------------------------------SYS TEMP2SYSTEM TEMP2OUTLN TEMP2EYGLE TEMP2CSMIG TEMP2TEST TEMP2REPADMIN 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 TEMPSYSTEM TEMPOUTLN TEMPEYGLE TEMPCSMIG TEMPTEST TEMPREPADMIN TEMP.......13 rows selected.如果原临时表空间无用户使用,我们可以删除该表空间: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.dbfSQL> select file_name,tablespace_name,bytes/1024/1024 MB,autoextensible2 from dba_temp_files3 /FILE_NAME TABLESPACE_NAME MB AUTOEXTENSIBLE -------------------------------------- -------------------- ---------- -------------- /opt/oracle/oradata/conner/temp2.dbf TEMP 20 NO/opt/oracle/oradata/conner/temp1.dbf TEMP 10 NO我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。

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

1. 没有为临时表空间设置上限,而是允许无限增长。

但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。

2.查询的时候连表查询中使用的表过多造成的。

我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。

3.对查询的某些字段没有建立索引。

Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间而如果有索引的话,一般只是将索引的数据复制到临时表空间中。

参照以上原因尝试解决下,如果不行就清空临时表空间,不过还是建议先查找临时表空间增长的原因才是关键清控临时表空间1.startup --启动数据库2.create temporary tablespace TEMP2 TEMPFILE '/home2/oracle/oradata/sysmon/temp 创建中转临时表空间3.alter database default temporary tablespace temp2;--改变缺省临时表空间为刚4.drop tablespace temp including contents and datafiles;--删除原来临时表空间5.create temporary tablespace TEMP TEMPFILE '/home2/oracle/oradata/sysmon/temp0重新创建临时表空间6.alter database default temporary tablespace temp;--重置缺省临时表空间为新建的7.drop tablespace temp2 including contents and datafiles;--删除中转用临时表空8.alter user roll temporary tablespace temp; --重新指定用户表空间为重建的临时。

相关文档
最新文档