ITPub博客

首页 > 数据库 > Oracle > 由ora-1652想到的.

由ora-1652想到的.

原创 Oracle 作者:jametong 时间:2005-03-29 10:11:23 0 删除 编辑
最近在itpub上看到这个帖子http://www.itpub.net/338792.html, 引发我下面要说的话.

1. :-)
楼主在描述问题的时候, 并没有将她/他遇到的问题描述清楚.
我在建实体化视图的时候个别create mv语句
总是报ORA-01652: unable to extend temp segment by 1024

楼主并没有将他操作中遇到的实际的错误信息展示给我们,实际的错误信息,应该是这样的吧:-)
下面我模拟一个空间不够的例子, 我们可以看到实际的错误应该是这样的.

SQL> select bytes from user_segments where segment_name = 'T';

BYTES
----------
4194304

SQL> create tablespace t1 datafile 'd:oracleoradatawebora9t101.dbf' size 2M;


Tablespace created.

SQL> create table t2 tablespace t1 as select * from t;
create table t2 tablespace t1 as select * from t
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace T1

楼主如果能够将实际遇到的问题/错误信息, 贴出来, 我相信, 这个问题可以很容易就得到解决.

2. 我先来对上面这个结果来进行一下解释.
Oracle在使用create table as select的时候, 差不多是这样的.
  • 读取远程的数据字典信息, 在本地创建对应的数据表, 表的命名方式使用数字表示, 具体的名称如何决定-- 不知道. 这个阶段数据段的类型为temp,存放在目标表空间中.目的是, 当创建对象失败以后,不需要额外的空间管理和数据字典负担.
  • 使用direct load模式往表中插入数据
  • 当数据成功处理完成以后, 修改对应的数据字典信息, 提交数据, 提示表创建成功.

3. 当我们不知道这个情况的时候, 我们怎么办呢.
a. 检查对应的临时表空间是否确实空间紧张, 是否有进程大量使用临时表空间.
1 select a.username,a.sid,a.serial#,b.tablespace,b.segtype,b.extents,b.blocks

2 from v$session a,v$sort_usage b
3* where a.saddr = b.session_addr
SQL> /

no rows selected

SQL>
没有任何session在使用临时表空间, 也就是所有的临时表空间都是空闲的, 当然, 在你们的问题中, 可能结果不是这样, 但是, 由此我们可以发现问题不是发生在临时表空间上面.
这是时候, 我们就可以考虑转向普通的表空间.
a. 通过dba_users找到用户的默认表空间.
SQL> select username,default_tablespace from dba_users where username = user;

USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SCOTT USERS

SQL>
b. 查询对应的表空间的剩余空间, 在我们的例子中查询表空间T1的剩余表空间.:-)
SQL> select tablespace_name,sum(bytes)/1024/1024 Mbytes
2 from dba_free_space
3 where tablespace_name in ('USERS','T1')
4 group by tablespace_name
5 /

TABLESPACE_NAME MBYTES
------------------------------ ----------
T1 1.9375
USERS 189.9375

SQL>

c. 查询需要创建的表, 所需的空间的大小.
在这个例子中我们可以这样查看.
SQL> col segment_name format a30
SQL> select segment_name,bytes,blocks
2 from user_segments
3 where segment_name = 'T'
4 /

SEGMENT_NAME BYTES BLOCKS
------------------------------ ---------- ----------
T 4194304 512

SQL>
对应的表需要4M的空间, 而我们的目标表空间只有2M不到的空间, 此时自然会报ora-01652的错误了.

最后将Oracle相应的错误信息代码再贴出来强调一下.:-)
[oracle@TzdbDataAnal ]$ oerr ora 1652
01652, 00000, "unable to extend temp segment by %s in tablespace %s"
// *Cause: Failed to allocate an extent for temp segment in tablespace.
// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
// files to the tablespace indicated.

如果没有指定对应的表空间, 就是对应数据段的目标表空间:)
[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/94317/viewspace-794278/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-11-23

  • 博文量
    47
  • 访问量
    283380