ORACLE 临时表空间使用率过高的原因及解决方案(转)
Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤

Oracle:Ora-01652⽆法通过128(在temp表空间中)扩展temp段的过程-解决步骤现象:查询select * from v$sql时提⽰“Ora-01652⽆法通过128(在temp表空间中)扩展temp段的过程”临时⽂件是不存储的,可以将数据库重启,重启后重建临时表空间;shutdown immediate;--关库startup;--启库alter pluggable database db_**open;--打开alter session set container=db_**;--切到⽬的数据库select*from v$tempfile;--查看临时⽂件状态或者⼿动创建临时⽂件。
下⾯是⼿动创建临时⽂件的步骤:解决步骤1、查询当前临时表空间的信息select*from dba_temp_filesFILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUTOEXTENSIBLE MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS SHARED INST_ID --------- ------- --------------- ------ ------ ------- ------------ -------------- -------- --------- ------------ ---------- ----------- ------ -------(null) 3TEMP (null) (null) OFFLINE (null) (null) (null) (null) (null) (null) (null) SHARED (null)发现数据库并没有临时表空间2、查询库中的临时⽂件状态select name,status from v$tempfile;NAME STATUS-------------------------------------------------------------------------------------------- -------/oradata/cdbtest/CDB_TEST/91C8CF1A0C80626CE0535465A8C0455F/datafile/o1_mf_temp_gq1852yy_.dbf OFFLINE临时⽂件处于OFFLINE状态3、给临时表空间增加临时⽂件alter tablespace temp add tempfile '/oradata/cdbtest/CDB_TEST/temp/datafile/temp_clear_01.dbf' size 1024M此时需注意,数据库中需要存在⽬录“/oradata/cdbtest/CDB_TEST/temp/datafile/”,临时⽂件添加成功⾄于为什么在“/oradata/cdbtest"⽬录下,是通过show parameter db_create_file_dest参数,查看value值获得的。
Oracle 常见错误

Oracle 常见错误使用ORACLE的过程过,我们会经常遇到一些ORACLE产生的错误,对于初学者而言,这些错误可能有点模糊,而且可能一时不知怎么去处理产生的这些错误,本人就使用中出现比较频繁的错误代码一一做出分析,希望能够帮助你找到一个合理解决这些错误的方法,同时也希望你能够提出你的不同看法。
毕竟作为一种交流的手段,个人意见难免过于偏颇,而且也必定存在着不足,出错之处在所难免。
写这篇文章的目的就是想通过相互之间的交流共同促进,共同进步。
ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME产生原因:上述ORACLE错误为回滚段表空间不足引起的,这也是ORACLE数据管理员最常见的ORACLE错误信息。
当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。
解决方式:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的数据增加表空间,根据具体的情况可以增加一个或多个表空间。
当然这与还与你主机上的裸盘设备有关,如果你主机的裸盘设备已经没有多余的使用空间,建议你不要轻意的增加回滚段表空间的大小,可使用下列的语句先查询一下剩余的tablespace 空间有多少:Select user_name,sql_text from V$open_cursor where user_name=‟‟;如果多余的空间比较多,就可以适当追加一个大的回滚段给表空间使用,从而避免上述的错误。
你也可以用以下语句来检测一下rollback segment的竞争状况:Select class,count from V$waitstat where calss in(‘system undo header’,’system undo block’,’undo header’,’undo block’);和Select sum(value) from V$sysstat where name in (…db_block_gets‟,‟consistents gets‟);如果任何一个class in count/sum(value)大于1%,就应该考虑增加rollback segment。
oracle优化方法总结

千里之行,始于足下。
oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。
本文总结了一些常见的Oracle优化方法。
1. 使用索引:索引是提高查询性能的主要方法。
通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。
但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。
2. 优化查询语句:查询语句的效率直接影响数据库的性能。
可以通过合理地编写查询语句来提高性能。
例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。
3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。
合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。
例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。
4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。
根据具体的应用场景和需求,可以根据情况调整参数的值。
例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。
5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。
分区表可以加速查询和维护操作,提高数据库的性能。
可以按照时间、地域、业务等来进行分区。
6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。
合理地分配存储空间和管理数据文件可以提高数据库的性能。
例如,定期清理无用的数据文件,使用自动扩展表空间等。
第1页/共2页锲而不舍,金石可镂。
7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。
数据压缩可以减少磁盘空间的使用,提高IO性能。
8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。
并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。
9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。
数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。
oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。
为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。
Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。
因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。
Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。
该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。
建议将该参数设置为 200。
当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。
执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。
因此,TRUNCATE 命令执行时间短,且资源消耗少。
在使用 Oracle 时,尽量多使用 COMMIT 命令。
SYSAUX表空间满对数据库的影响以及解决措施

SYSAUX表空间满对数据库的影响以及解决措施转载最后发布于2018-01-01 22:59:25 阅读数 681 收藏1.概要SYSAUX表空间满了,会影响登录嘛?会影响数据库正常运⾏吗?怎么处理呢?容易的想到,增加空间,删除被耗的空间,⾸先恢复⽣产业务为重。
对于排查消耗SYSAUX空间⼤的对象,⽆论哪个版本,都⼀样,查看是否存放较⼤的业务表,或者个⼈的中间表。
对于12C来说,更加关注的⼀个就是:数据库的audit_trail审计参数是否为开启的,如果该参数值为DB,则关注ausdsys模式下的audsys组件,即audsys.CLI_SWP$459d3b9$1$1表的lob段SYS_LOB0000091784C00014$$的⼤⼩。
如果为NONE,则和10G与11G的排查⼀样的思路去排查SYSAUX⾥的⼤对象。
2.案例分析1、备份检查在⽇常的备份维护当中,从备份检查集中采集的结果发现,多个库的归档备份失败。
2、检查归档备份或者全库的备份的⽇志输出3、检查catalog库的audit_trail参数values=’DB’.4、查看该库的alert⽇志:5、查看消耗SYSAUX表空间⼤的对象(段):其中,audsys组件的lob段占了31.5G。
6、尝试使⽤sys⽤户对该lob段对应的表进⾏truncate:发现sys⽤户也没有权限。
7、使⽤存储过程执⾏清理:begindbms_audit_mgmt.clean_audit_trail(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,use_last_arch_timestamp => FALSE);end;/附:oracle官⽹提供的清理⽅法,查看:1>.exec DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP ( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -LAST_ARCHIVE_TIME => sysdate);2>.exec DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -USE_LAST_ARCH_TIMESTAMP => TRUE);8、检查sysaux表空间释放,调整审计参数audit_trail参数values=’NONE’。
ORACLE 数据库故障解决方案

ORACLE 数据库故障解决方案引言概述:ORACLE 数据库是目前企业常用的一种数据库管理系统,但在使用过程中难免会遇到各种故障。
本文将介绍一些常见的 ORACLE 数据库故障,并提供相应的解决方案,帮助读者更好地应对数据库故障。
一、数据库连接问题1.1 连接超时:当数据库连接超时时,可以通过增加连接超时时间的方式解决。
在 ORACLE 数据库中,可以通过修改 sqlnet.ora 文件中的SQLNET.INBOUND_CONNECT_TIMEOUT 参数来设置连接超时时间。
1.2 连接被拒绝:如果数据库连接被拒绝,可能是由于数据库实例未启动、监听器未启动或者网络故障等原因导致。
解决方案包括启动数据库实例、启动监听器以及检查网络连接是否正常。
1.3 连接池问题:当数据库连接池达到最大连接数时,新的连接请求会被拒绝。
解决方案包括增加连接池的最大连接数、释放闲置连接以及优化数据库连接的使用。
二、数据丢失问题2.1 意外删除数据:当数据被意外删除时,可以通过数据库备份和恢复的方式解决。
可以使用RMAN 工具进行数据库备份,并在需要时使用备份进行恢复操作。
2.2 数据库文件损坏:当数据库文件损坏时,可以使用 RMAN 工具进行数据库文件的修复。
RMAN 提供了诊断和修复数据库文件的功能,可以帮助解决数据库文件损坏的问题。
2.3 数据库坏块:当数据库出现坏块时,可以使用 RMAN 工具进行坏块的修复。
RMAN 提供了坏块检测和修复的功能,可以帮助解决数据库坏块问题。
三、性能问题3.1 慢查询:当数据库查询变慢时,可以通过优化查询语句、创建索引、增加硬件资源等方式解决。
可以使用 Explain Plan 工具来分析查询语句的执行计划,找出慢查询的原因,并进行相应的优化。
3.2 死锁:当数据库出现死锁时,可以通过锁等待超时、死锁检测和解锁等方式解决。
可以使用 V$LOCK 和 V$SESSION 视图来查看当前的锁信息,并根据情况进行相应的解锁操作。
Oracle常见错误及解决方案

O r a c l e常见错误及解决方案问题1:Oracle服务器进入PL/SQL Developer时报ora-01033:oracle initialization or shutdown in progress 错误提示,应用系统无法连接Oracle服务。
解决方法如下:⑴进入CMD,执行set ORACLE_SID=fbms,确保连接到正确的SID;⑵运行sqlplus "/as sysdba"SQL>shutdown immediate停止服务SQL>startup启动服务,观察启动时有无数据文件加载报错,并记住出错数据文件标号SQL>shutdown immediate再次停止服务SQL>startup mountSQL> recover datafile 2恢复出错的数据文件SQL>shutdown immediate再次停止服务SQL>startup启动服务,此次正常。
⑶进入PL/SQL Developer检查,没有再提示错误。
问题2:Oracle密码忘记了怎么办?解决方法有很多种,这里讲述以下三种:⑴打开cmd,输入sqlplus /nolog,回车;输入“conn / as sysdba”;输入“alter user sys identified by 新密码”。
注意:新密码最好以字母开头,否则可能出现错误Ora-00988。
有了这个方法后,只要自己对oracle 服务器有管理员权限,Oracle密码忘记了也不用着急,可以随意修改密码。
⑵在命令行执行如下命令:sqlplus "/@服务名as sysdba"然后在sqlplus中运行以上命令即可修改密码:alter user sys identified by 新密码;alter user system identified by 新密码;⑶运行到C盘根目录输入:SET ORACLE_SID = 你的SID名称输入:sqlplus/nolog输入:connect/as sysdba输入:alert user sys identified by sys输入:alert user system identified by system完成以上5步,则密码更改完成,密码是Oracle数据库的初始密码。
sysaux表空间增大的几种情况及解决办法

sysaux表空间增⼤的⼏种情况及解决办法sysaux表空间会因为多种情况⽽增⼤,以下介绍⼏种情况及解决办法1、由于设置了awr快照基线导致awr⽆法purge--查看sysaux表空间内容占⽤情况SELECT occupant_name "Item",space_usage_kbytes / 1048576 "Space Used (GB)",schema_name "Schema",move_procedure "Move Procedure"FROM v$sysaux_occupantsORDER BY 1 ;--查询sysaux表空间排名前20的⼤段对象select owner, segment_name, segment_type, bytes / 1024 / 1024from (select *from dba_segmentswhere tablespace_name = 'SYSAUX'order by bytes desc)where rownum < 20;--查看awr的保留属性select * from dba_hist_wr_control;--查看awr的最⼤、最⼩快照号select max(snap_id), min(snap_id) from sys.WRM$_SNAPSHOT;--查看数据库dbidselect dbid from v$database;--查看awr相关的基线情况select * from dba_hist_baseline_details;--删除指定的基线EXECUTE DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => 'test_baseline');--清理指定范围的awr快照begindbms_workload_repository.drop_snapshot_range(low_snap_id => 4217,high_snap_id => 4218,dbid => 2513064869);end;/2、WRH A CTIVE S ESSION H ISTORY表未⾃动purge参考MOS:WRH_ACTIVE_SESSION_HISTORY Does Not Get Purged Based Upon the Retention Policy (⽂档 ID 387914.1)--检查WRH$_ACTIVE_SESSION_HISTORY表的分区情况SELECT owner,segment_name,partition_name,segment_type,bytes/1024/1024/1024 Size_GBFROM dba_segmentsWHERE segment_name='WRH$_ACTIVE_SESSION_HISTORY';--⼿⼯为WRH$_ACTIVE_SESSION_HISTORY表进⾏分区,可重复执⾏alter session set "_swrf_test_action" = 72;--检查WRH$_ACTIVE_SESSION_HISTORY表的分区情况SELECT owner,segment_name,partition_name,segment_type,bytes/1024/1024/1024 Size_GBFROM dba_segmentsWHERE segment_name='WRH$_ACTIVE_SESSION_HISTORY';之后oracle内部调⽤⾃动清理作业会purge该表的相关分区3、WRH S QL P LAN表未⾃动purge参考MOS:HowtoPurgeWRH_SQL_PLAN Table in AWR Repository, Occupying Large Space in SYSAUX Tablespace. (⽂档 ID 1478615.1)⽅法1:可能⽆效--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;--查看数据库dbidSELECT dbid FROM v$database;--清理WRH$_SQL_PLAN表(官⽅⽂档未记录该函数)exec dbms_workload_repository.purge_sql_details(1000, &dbid);--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;⽅法2:--查看WRH$_SQL_PLAN表记录的最⼩时间戳select min(TIMESTAMP) from wrh$_sql_plan;--⼿⼯清理WRH$_SQL_PLAN表,删除dba_hist_snapshot记录时间戳范围外的数据(耗时随数据量增加⽽延长,注意undo空间使⽤情况)delete from wrh$_sql_plan where trunc(TIMESTAMP) < (select min(BEGIN_INTERVAL_TIME) from dba_hist_snapshot);--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;4、WRI$_OPTSTAT_TAB_HISTORY表未⾃动purge参考MOS:SYSAUX Grows Because Optimizer Stats History is Not Purged (⽂档 ID 1055547.1)原因:由于oracle内部⾃动purge WRIO PTSTAT T AB H ISTORY表的JOB存在5分钟的窗⼝限制,因此5分钟内未清理完成则JOB失败,该MOS提供的清理⽅式未必⽣效,建议定位到_OPTSTAT_TAB_HISTORY表的sql,⼿⼯进⾏清理--查看sysaux表空间内容占⽤情况SELECT occupant_name "Item",space_usage_kbytes / 1048576 "Space Used (GB)",schema_name "Schema",move_procedure "Move Procedure"FROM v$sysaux_occupantsORDER BY 1 ;--查询sysaux表空间排名前20的⼤段对象select owner, segment_name, segment_type, bytes / 1024 / 1024from (select *from dba_segmentswhere tablespace_name = 'SYSAUX'order by bytes desc)where rownum < 20;--通过awr、ash排查问题时间段⾃动purge的sql--追溯sql的执⾏计划,建⽴合适的索引后,⼿⼯执⾏purge sql--降低删除历史信息数据表的⾼⽔位线,并重建索引注:move表前,导出表的所有对象定义(索引、约束、触发器等),move前、后检查所有对象的可⽤状态是否⼀致--检查I_WRI$_OPTSTAT_IND_OBJ#_ST索引状态select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';--导出索引定义,最好get_ddl和PLSQL的查看sql定义都导出select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_TAB_ST','SYS') from dual;--move WRI$_OPTSTAT_TAB_HISTORY表,降低⾼⽔位alter table WRI$_OPTSTAT_TAB_HISTORY move;--重建索引alter index sys.I_WRI$_OPTSTAT_TAB_ST rebuild;--检查I_WRI$_OPTSTAT_IND_OBJ#_ST索引状态select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';Processing math: 100%。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【转】ORACLE 临时表空间使用率过高的原因及解决方案在数据库的日常学习中,发现公司生产数据库的默认临时表空间temp使用情况达到了30G,使用率达到了100%;待调整为32G后,使用率还是为100%,导致磁盘空间使用紧张。
根据临时表空间的主要是对临时数据进行排序和缓存临时数据等特性,待重启数据库后,temp 会自动释放。
于是想通过重启数据库的方式来缓解这种情况,但是重启数据库之后,发现临时表空间temp的使用率还是100%,一点没变。
虽然运行中应用暂时没有报什么错误,但是这在一定程度上存在一定的隐患,有待解决该问题。
由于临时表空间主要使用在以下几种情况:1、order by or group by (disc sort占主要部分);2、索引的创建和重创建;3、distinct操作;4、union & intersect & minus sort-merge joins;5、Analyze 操作;6、有些异常也会引起TEMP的暴涨。
Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的:1. 没有为临时表空间设置上限,而是允许无限增长。
但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
2.查询的时候连表查询中使用的表过多造成的。
我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
3.对查询的某些字段没有建立索引。
Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。
针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。
总结:1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。
2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的软件中。
3.仔细规划表索引。
如果临时表空间是temporary的,空间不会释放,只是在sort结束后被标记为free的,如果是permanent的,由SMON负责在sort结束后释放,都不用去手工释放的。
查看有哪些用户和SQL导致TEMP增长的两个重要视图:v$ sort_usage和v$sort_segment。
通过查询相关的资料,发现解决方案有如下几种:一、重建临时表空间tempTemporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。
查看目前的Temporary TablespaceSQL> select name from v$tempfile;NAME———————————————————————D:\ORACLE\ORADA TA\ORCL\TEMP01.DBFSQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------ ------------------------------MGMT_VIEW TEMPSYS TEMPSYSTEM TEMPDBSNMP TEMPSYSMAN TEMP1.创建中转临时表空间create temporary tablespace TEMP1 TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1MMAXSIZE UNLIMITED;2.改变缺省临时表空间为刚刚创建的新临时表空间temp1alter database default temporary tablespace temp1;3.删除原来临时表空间drop tablespace temp including contents and datafiles;4.重新创建临时表空间create temporary tablespace TEMP TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZEUNLIMITED;5.重置缺省临时表空间为新建的temp表空间alter database default temporary tablespace temp;6.删除中转用临时表空间drop tablespace temp1 including contents and datafiles;以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。
下面是查询在sort排序区使用的执行耗时的SQL:Select ername,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_textfrom v$sort_usage su,v$parameter p,v$session se,v$sql swhere ='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by ername,se.sid;或是:Select ername,su.Extents,tablespace,segtype,sql_textfrom v$sort_usage su,v$sql sWhere su.SQL_ID = s.SQL_ID;注:如果原临时表空间无用户使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系统可以看看文件的时间戳。
我们可以删除该表空间:如果原临时表空间还有用户在使用,你是删除不了这个表空间的!在一次生产环境的临时表空间切换中,原临时表空间始终有用户在上面,即使我关闭了前台程序,也还是有用户,新的临时表空间已经没有用户在使用了。
我估计用户进程已经死在原临时表空间了,后来只有重新启动数据库才能把原来旧的临时表空间给删除。
二、修改参数(这个方案紧适用于8i及8i以下的版本)修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。
SQL>alter tablespace temp increase 1;SQL>alter tablespace temp increase 0;三、Kill session1、使用如下语句a查看一下认谁在用临时段SELECT ername, se.SID, se.serial#, se.sql_address, se.machine, se.program, su.TABLESPACE,su.segtype, su.CONTENTS fromv$session se, v$sort_usage su WHERE se.saddr = su.session_addr2、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 DICTIONARYCREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL;四、使用诊断事件,也是相对有效的一种方法1、查询事件代码SQL>select ts#, name from sys.ts$ ;TS# NAME---------- ------------------------------0 SYSTEM1 UNDOTBS12 SYSAUX3 TEMP4 USERS5 UNDOTBS22、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4';说明:temp表空间的TS# 为3, So TS#+ 1= 4。
oracle临时表空间过大的原因2009-05-12 11:22Oracle 临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle 使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。
Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的。
1. 没有为临时表空间设置上限,而是允许无限增长。
但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
2.查询的时候连表查询中使用的表过多造成的。
我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
3.对查询的某些字段没有建立索引。