今天收到一个ticket,应用的人在做排序的时候,报错ora1630:
1 |
ORA-01630: max # extents (505) reached in temp segment in tablespace TEMP |
这是个8i的数据库,1630报错在oracle online document中解释的也比较明确:
1 2 3 4 5 |
ORA-01630 max # extents (string) reached in temp segment in tablespace string Cause: A temporary segment tried to extend past MAXEXTENTS. Action: If MAXEXTENTS for the tablespace is less than the system maximum, you can raise that. Otherwise, raise PCTINCREASE for the tablespace. |
这是因为在8i中,temp tablespace还是用数据字典管理,在创建的时候,如果是用create tablespace temp datafile<--注意这里是datafile,不是tempfile。且没有指定maxtenents的话,默认的maxextents就会是505,这是一个很小的数值。
我们可以来实验一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
C:\Documents and Settings\Administrator>sqlplus "/ as sysdba" SQL*Plus: Release 8.1.7.0.0 - Production on Tue Sep 27 16:38:52 2011 (c) Copyright 2000 Oracle Corporation. All rights reserved. Connected to: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production SQL> create tablespace temp2 datafile 'E:\ora8i\oracle\oradata\ora8i\temp2_01.dbf' size 2m; Tablespace created. SQL> alter user test temporary tablespace temp2; User altered. SQL> conn test/test Connected. SQL> SQL> --我们看到创建之后,默认的maxextents是505。 SQL> select MAX_EXTENTS from dba_tablespaces where tablespace_name='TEMP2'; MAX_EXTENTS ----------- 505 SQL> --我们将这个值改的小一些: SQL> alter tablespace temp2 default storage (maxextents 5); Tablespace altered. SQL> SQL> --这个时候,如果需要temp表空间,需要extend的时候,无法extend超过5个,就会报错了: SQL> select * from t2 order by object_id; select * from t2 order by object_id * ERROR at line 1: ORA-01630: max # extents (5) reached in temp segment in tablespace TEMP2 SQL> SQL> --为了方便,我们可以将该值设置为unlimited。 SQL> alter tablespace temp2 default storage (maxextents unlimited); Tablespace altered. SQL> --或者新建一个用local管理的temp表空间就不会有这样的问题了。 SQL> create temporary tablespace temp3 tempfile 'E:\ora8i\oracle\oradata\ora8i\temp03_01.dbf' size 2m; Tablespace created. SQL> alter user test temporary tablespace temp3; User altered. SQL> SQL> select tablespace_name,extent_management,MAX_EXTENTS from dba_tablespaces; TABLESPACE_NAME EXTENT_MAN MAX_EXTENTS ------------------------------ ---------- ----------- TEMP2 DICTIONARY 2147483645 TEMP3 LOCAL 9 rows selected. SQL> |
如果你还在用8i的数据库,那么在创建temp表空间的时候要小心了,默认的maxextents是505。