A TEMPORARY segment may be from:
1) A SORT Used for a SELECT or for DML/DDL
2) CREATE INDEX The index create performs a SORT in the users default TEMP tablespace and ALSO uses a TEMP segment to build the final index in the INDEX tablespace.
Once the index build is complete the segment type is changed.
3) CREATE PK CONSTRAINT
4) ENABLE CONSTRAINT
5) CREATE TABLE New tables start out as TEMPORARY segments.
Eg: If MINEXTENTS is > 1 or you issue CREATE table as SELECT.
6) Accessing a GLOBAL TEMPORARY TABLE When you access a global temporary table a TEMP segment is instantiated to hold the temporary data.
3、TROUBLESHOOTING ORA-01652(Reference Doc ID 1267351.1)
#下面是无法扩展临时段的2种情形
EXAMPLE 1:
Temporary tablespace TEMP is being used and is 50gb in size (a recommended minimum for 11g)
TIME 1 : Session 1 starts a long running query
TIME 2 : Session 2 starts a query and at this point in time Session 1 has consumed 48gb of TEMP's free space
TIME 3 : Session 1 and Session 2 receive an ORA-1652 because the tablespace has exhausted of of its free space
Both sessions fail .. and all temp space used by the sessions are freed (the segments used are marked FREE for reuse)
TIME 4 : SMON cleans up the temporary segments used by Session 1 and Session 2 (deallocates the storage)
TIME 5 : Queries are run against the views V$SORTSEG_USAGE or V$TEMSEG_USAGE and V$SORT_SEGMENT ... and it is found that no space is being used (this is normal)
EXAMPLE 2:
Permanent tablespace INDEX_TBS is being used and has 20gb of space free #此时无法扩展临时表空间的问题当属第2种情形
TIME 1 : Session 1 begins a CREATE INDEX command with the index stored in INDEX_TBS
TIME 2 : Session 1 exhausts all of the free space in INDEX_TBS as a result the CREATE INDEX abends
TIME 3 : SMON cleans up the temporary segments that were used to attempt to create the index
TIME 4 : Queries are run against the views V$SORTSEG_USAGE or V$TEMSEG_USAGE ... and it is found that the INDEX_TBS has no space used (this is normal)
#下面是Solution部分
First it is important to forget what is known about past behavior of the instance as the current tablespace size is insufficient to handle the demand by current sessions
There are three recommended methods of supplying sufficient storage space to meet the needs of current sessions by increasing the size of your temporary tablespace
1) Set one or more of the tempfiles datafiles for the tablespace to AUTOEXTEND with MAXSIZE set ... so that you do not exhaust all available disk volume space
(discuss this with a System Administrator)
After a month or so of having this setting ... AUTOEXTEND can be disabled .. as it is likely that the system has found its true high watermark for temporary segment usage
(This is the most recommended method as it allows the database instance to find its own high watermark)
2) Monitor the temporary segment usage via queries like
SELECT sum(blocks)*<block size of the temporary tablespace>
FROM v$tempseg_usage
WHERE tablespace = '<name of the temporary tablespace>';
and resize one or more of the tempfiles datafiles for the tablespace as the tablespace becomes close to exhausted
3) Add a tempfile datafile to the temporary tablespace with the problem and monitor usage as described in #2
Another good idea is to monitor temporary tablespace usage over time to determine what queries are consuming the temporary space space
For example: How Can Temporary Segment Usage Be Monitored Over Time? (Doc ID 364417.1)
This note was written to monitor temporary tablespaces .. but may be able to be modified to also monitor permanent tablespaces
SQL> @temp_sort_segment.sql
+==================================================================================+
Segment Name : The segment nameis 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 sizeof the temporary segment in bytes
Currently Used Bytes : Bytes allocated to active sorts
Extent Hits : Number of times an unused extent was found in the pool
MaxSize : Maximum number of bytes ever used
Max Used Size : Maximum number of bytes used byall sorts
Max Sort Size : Maximum number of bytes used by an individual sort
Free Requests : Number of requests todeallocate
+==================================================================================+
Tablespace Segment Current Total Temp Currently Pct. Extent MaxMax Used Max Sort Free
NameName Users Segment Size Used Bytes Used Hits SizeSizeSize Requests
-------------- -------- ------- ---------------- ---------------- ---- -------- ---------------- ---------------- ---------------- --------
TEMP SYS.0.0 0 29,570,891,776 0 0 17,230 29,570,891,776 29,570,891,776 29,569,843,200 0
GOEX_TEMP SYS.0.0 12 24,135,073,792 12,582,912 0 214,932 24,135,073,792 4,908,384,256 2,960,130,048 0
************** ------- ---------------- ---------------- -------- ---------------- ---------------- ---------------- --------
sum 12 53,705,965,568 12,582,912 232,162 53,705,965,568 34,479,276,032 32,529,973,248 0
--从上面的查询中可知,当前实例的temp临时表空间曾耗用量达到29,570,891,776,等于Total Temp Segment Size
--当前我们使用sys帐户来rebulid index,sys帐户使用的是默认的临时表空间temp。
SQL> @temp_sort_users.sql
Tablespace Name Username SID Serial# Contents Segment Type Extents Blocks Bytes
--------------- --------------- ------ --------- --------- ------------ -------- -------- ------------
GOEX_TEMP GOEX_WEBUSER 1079 39023 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1078 22320 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1075 15301 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1056 22505 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1046 17617 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1042 30925 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1041 10180 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1038 20315 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1034 19147 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1028 6362 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1027 12614 TEMPORARY LOB_DATA 1 128 1,048,576
GOEX_WEBUSER 1022 23077 TEMPORARY LOB_DATA 1 128 1,048,576
*************** -------- -------- ------------
sum 12 1,536 12,582,912
--那我们来看看GX_ARCHIVE_IDX表空间上索引的情形
SQL> SELECT *
2 FROM ( SELECT segment_name, bytes / 1024 / 1024 / 1024 AS size_g, extents
3 FROM dba_segments
4 WHERE tablespace_name = 'GX_ARCHIVE_IDX'
5 ORDERBY 2 DESC) t
6 WHERE ROWNUM < 3;
SEGMENT_NAME SIZE_G Extents
----------------------------------------------------------------- ---------- --------
PK_ACC_POS_STOCK_ARCH_TBL 25.9765625 540
PK_ACC_POS_CASH_PL_ARCH_TBL 3.97167969 177
--上面的这个查询尽然有一个接近26GB的大索引,问题应该是由于这个大索引引起的。至于这个这么大的索引是另外一个话题,不再次描述。
--根据当前的临时表空间的情形来看应该是够的。
--查看前面描述的 临时段被使用的情形2 CREATE INDEX部分在INDEX tablespace上也会有temp segment
--所以alert日志报告无法在GX_ARCHIVE_IDX 上extend temp segment
SQL> @tbs_free_single.sql
Enter value for input_tablespace_name: GX_ARCHIVE_IDX
old 22: AND T.TABLESPACE_NAME=upper('&input_tablespace_name')
new 22: AND T.TABLESPACE_NAME=upper('GX_ARCHIVE_IDX')
TABLESPACE_NAME USED_MB FREE_MB TOTAL_MB PER_FR
------------------------------ -------- -------- -------- ------
GX_ARCHIVE_IDX 45,912 19,037 64,949 29 %
SQL> @tbs_free_by_file_id.sql
Enter value for input_tbsname: GX_ARCHIVE_IDX
old 26: AND t.tablespace_name = UPPER ('&input_tbsname')
new 26: AND t.tablespace_name = UPPER ('GX_ARCHIVE_IDX')
TABLESPACE_NAME FILE_ID USED_MB FREE_MB TOTAL_MB PER_FR
------------------------------ ---------- -------- -------- -------- ------
GX_ARCHIVE_IDX 25 29,328 2,916 32,244 9 %
GX_ARCHIVE_IDX 40 16,584 16,121 32,705 49 %
SQL> select file_id,file_name,autoextensible from dba_data_files where file_id in(25,40);
FILE_ID FILE_NAME AUT
---------- ------------------------------------------------------------ ---
25 /u02/database/CABO3/oradata/CABO3_archive_idx.dbf NO
40 /u02/database/CABO3/oradata/CABO3_archive_idx2.dbf YES
--根据1267351.1的solution,我们为GX_ARCHIVE_IDX表空间添加一个新的数据文件
SQL> alter tablespace GX_ARCHIVE_IDX add datafile '/u02/database/CABO3/oradata/CABO3_archive_idx3.dbf'
2 size 2g autoextend on;
Tablespace altered.
--为该表空间增加数据文件后,无此异常