知识大全 收缩临时表空间

Posted 空间

篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 收缩临时表空间相关的知识,希望对你有一定的参考价值。

Oracle性能优化:收缩临时表空间  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  当排序操作 重建索引等大型操作无法在内存中完成时 临时表空间将为排序提供便利 一般情况下临时表空间为多个用户 多个会话所共享 不能为会话分批空间配额 临时表空间耗用过度且在不能自动扩展的情形下将收到 ORA unable to extend temp segment 错误 下面

  描述了过度扩展后如何释放临时表空间

  一 临时表空间何时释放

  检索数据的会话游标关闭时 占用的临时空间即被释放

  数据库关闭 重启(一般情况) 会话 log off

  二 释放过大的临时表空间

  <span > 查看当前临时表空间的情况SQL> select * from v$version where rownum<

  BANNER

  

  Oracle Database g Release bit Production SQL> @temp_sort_segment

  +==================================================================================+ | Segment Name            The segment name is a concatenation of the             | |                           SEGMENT_FILE (File number of the first extent)         | |                           and the                                                | |                           SEGMENT_BLOCK (Block number of the first extent)       | | Current Users           Number of active users of the segment                  | | Total Temp Segment Size Total size of the temporary segment in MB              | | Currently Used Bytes    Bytes allocated to active sorts                        | | Extent Hits             Number of times an unused extent was found in the pool | | Max Size                Maximum number of MB ever used                         | | Max Used Size           Maximum number of MB used by all sorts                 | | Max Sort Size           Maximum number of MB used by an individual sort        | | Free Requests           Number of requests to deallocate                       | +==================================================================================+——>此时临时表空间go_temp中达到了 GB Tablespace  Segment Current Currently Pct    Extent      Max Max Used Max Sort     Free Name     Name   Users   Used MB Used     Hits  Size MB  Size MB  Size MB Requests

  

  TEMP           SYS                                                    GO_TEMP        SYS                                                 **************          —— ——      —— —— —— —— ——sum                                                                   

  SQL> col tbsname format a SQL> select s name tbsname t name (t bytes/ / ) mb t status   from v$tablespace s v$tempfile t   where s ts# = t ts#

  TBSNAME         NAME                                                       MB STATUS

  

  TEMP            /u /database/ORADB/temp/tempORADB dbf                  ONLINE GO_TEMP         /u /database/ORADB/temp/ORADB_tempORADB dbf          ONLINE

  SQL> @temp_usage       ——>此时temp已使用的为 MB 而GO_TEMP未使用

  TABLESPACE             MB_TOTAL    MB_USED    MB_FREE

  

  GO_TEMP                                 TEMP                                       

   观察及分析临时表空间的耗用情况SQL> select count(*) from big_table     ——>开启另一个session

  COUNT(*)

  

  

  SQL> select * from big_table order by desc   ——>对big_table 实施排序

  SQL> alter index pk_stock_tbl_arc rebuild       ——>开启另一个session重建索引

  SQL> @temp_sort_segment sql           ——>可以看到此时temp表空间耗用达到 MB go_temp的耗用达到 MB

  Tablespace  Segment Current Currently Pct    Extent      Max Max Used Max Sort     Free Name     Name   Users   Used MB Used     Hits  Size MB  Size MB  Size MB Requests

  

  TEMP           SYS                                                  GO_TEMP        SYS                                               **************          —— ——      —— —— —— —— ——sum                                                                 

  SQL> @temp_sort_users sql  ——>获得当前排序的会话

  INST_ID SID_SERIAL Username   OSUSER          SPID         MODULE     PROGRAM       MB_USED TABLESPACE STATEMENTS

  

     SCOTT      oracle                  SQL*Plus  oracle@SZD        TEMP                B (TNS V V )

     GO_ADMIN   oracle                   SQL*Plus  oracle@SZD        GO_TEMP           B (TNS V V )

   使用resize 缩小临时表空间 如不能缩小 转到下一步SQL> SELECT alter database tempfile || a name || resize || b siz || M   resize_mand   FROM v$tempfile a         (SELECT ceil(tmsize maxblk * bk value / / ) siz        FROM (SELECT nvl(MAX(segblk#) ) maxblk             FROM v$sort_usage) tmsize              (SELECT VALUE             FROM v$parameter             WHERE NAME = db_block_size ) bk) b

  RESIZE_MAND

  

  alter database tempfile /u /database/ORADB/temp/ORADB_tempORADB dbf resize M alter database tempfile /u /database/ORADB/temp/tempORADB dbf resize M

  ——>实际上此时占用 GB的临时数据文件已经缩小alter database tempfile /u /database/ORADB/temp/ORADB_tempORADB dbf resize M

  Database altered

  ——>为便于演示 此时假定TEMP为过大的临时表空间且不能释放——>下面调整表明已使用空间超出了分配的空间SQL> alter database tempfile /u /database/ORADB/temp/tempORADB dbf resize M alter database tempfile /u /database/ORADB/temp/tempORADB dbf resize M * ERROR at line ORA file contains used data beyond requested RESIZE value

  SQL> select count(*) from v$sort_usage where tablespace= TEMP    ——>当前有未释放的临时段

  COUNT(*)

  

  

  /**************************************************/ /* Author Robinson Cheng                         */ /* Blog   ;    */ /* MSN    robin              */ /* QQ                                    */ /**************************************************/

   新建一个中转临时表空间SQL> create temporary tablespace temp tempfile /u /database/ORADB/temp/ORADB_temp dbf   size m autoextend on

  Tablespace created

  ——>如果此时过大的临时表空间为缺省的临时表空间 则必须将缺省的临时表空间设置为新的临时表空间之后SQL> select property_name property_value from database_properties   where property_name like DEFAULT_TEMP_TABLESPACE

  PROPERTY_NAME                  PROPERTY_VALUE

  

  DEFAULT_TEMP_TABLESPACE        TEMP

  SQL> alter database default temporary tablespace temp

  Database altered

   转移用户到中转临时表空间——>过大临时表空间上的那些用户需要迁移到新建的临时表空间——>查询dba_users视图查询哪些用户位于过大的临时表空间之上——>并使用下面的命令将其切换到新的临时表空间alter user <username> temporary tablespace temp

   等到过大临时表空间上的没有临时段被使用 即已经全部释放即可删除过大的临时表空间

  SQL> show user     ——>由于当前用户为scott 所以临时表空间未能释放USER is SCOTT

  SQL> conn / as sysdba   ——>切换到sysdba Connected

  SQL> @temp_usage       ——>临时段已经被释放

  TABLESPACE             MB_TOTAL    MB_USED    MB_FREE

  

  GO_TEMP                                     TEMP                                       

  ——>如果没有释放在可以kill session的情况下kill session 利用前面获得的sid serial#来执行(前提是允许该情况发生)

  alter system kill session

   删除过大的临时表空间

  SQL> alter tablespace temp tempfile offline    ——>先将其脱机

  Tablespace altered

  SQL> drop tablespace temp including contents and datafiles    ——>删除临时表空间及相应的文件

  Tablespace dropped

  SQL> select s name tbsname t name (t bytes/ / ) mb t status   from v$tablespace s v$tempfile t   where s ts# = t ts#

  TBSNAME         NAME                                                       MB STATUS

  

  GO_TEMP       /u /database/ORADB/temp/ORADB_tempORADB dbf           ONLINE TEMP         /u /database/ORADB/temp/ORADB_temp dbf                ONLINE

  ——>也可以使用下面的命令来完成仅仅删除单个文件ALTER DATABASE TEMPFILE /u /database/ORADB/temp/tempORADB dbf DROP INCLUDING DATAFILES ——>删除单个文件

   根据需求可以创建原来的临时表空间并将切换出去用户切换到此临时表空间</span>

  三 总结

   关注alert_<sid> log文件中的ORA 错误并调查什么原因导致该错误 有些时候并不是由于当前的SQL 导致临时表空间不能扩展 很可能由于前一个SQL耗用了 %的临时表空间 而后一个SQL执行时即出现错误 对于此类情况应调查前一SQL并调整避免过多的磁盘排序

   如果基于空间压力应该关闭临时表空间的自动扩展 因此为临时表空间设定合理的大小就成了一个问题 个人的解决方案是首先检查ORA 其次是观察业务高峰期的峰值 如前面查询中的字段Max Size( Maximum number of MB ever used)的值来预估 如果大师们有更好的建议不妨拍砖

   通过重启数据库 临时表空间所耗用的大小有时候并不能缩小

   在Oracle g之前一般是通过创建中转临时表空间来达到缩小的目的 不是很完美 因为有些时候临时段未释放导致不能删除临时表空间及数据文件 在 g可以直接使用下面的命令来完成

  alter tablespace temp shrink space

  alter tablespace temp shrink tempfile <dir> keep n <mb/kb>

   系统缺省的临时表空间不能被删除 因此如果系统缺省的临时表空间过大删除前应该新置一个系统缺省的临时表空间

   删除过大临时表空间前其上的用户应该先将其设定到中转临时表空间 重建后再将其置回原状态

cha138/Article/program/Oracle/201311/17414

相关参考

知识大全 回收临时表空间ORA-03297解决

回收临时表空间ORA-03297解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!今天发现临时表空

知识大全 OracleTemp临时表空间处理

OracleTemp临时表空间处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Tempora

知识大全 Oracle10g临时表空间组

Oracle10g临时表空间组  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracleg引进

知识大全 Oracle临时表空间过大问题解决

Oracle临时表空间过大问题解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  查询数据库服务

知识大全 MYSQL使用心得(四)----临时表与内存表

MYSQL使用心得(四)----临时表与内存表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  m

知识大全 临时表更适合做插入和查询操作

  ORACLE数据库除了可以保存永久表外还可以建立临时表temporarytables这些临时表用来保存一个会话SESSION的数据或者保存在一个事务中需要的数据当会话退出或者用户提交mit和回滚r

知识大全 Oracle临时表 优化查询速度

Oracle临时表优化查询速度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前言    目前所

知识大全 ORACLE临时表的应用

ORACLE临时表的应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前言  目前所有使用Or

知识大全 Oracle中的临时表用法汇总

Oracle中的临时表用法汇总  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!语法  在Oracle

知识大全 Oracle临时表用法的经验心得

Oracle临时表用法的经验心得  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  文章主要介绍的是