Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1115681
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: Oracle

2011-06-01 12:58:46

今天客户在QQ上发了个错误给我看:
ORA-10922: Temporary tablespace group is empty

错误的意思大概是临时表空间组为空导致的。

模拟了一个该错误的情况。
新建了一个临时表空间
create temporary tablespace temp2 tempfile 'E:\oradata\ora10g\dbfile\temp02.dbf' size 2m;
将这个表空间属于group1组。
alter tablespace temp2 tablespace group group1;
修改用户的临时表空间
alter user ldy temporary tablespace group1;

这时做一个需要排序的操作:
SQL> insert into t003 select * from t003 order by 1,2,3,4,5;
insert into t003 select * from t003 order by 1,2,3,4,5
*
第 1 行出现错误:
ORA-01652: 无法通过 128 (在表空间 TEMP2 中) 扩展 temp 段

可以看到这时临时表空间不足是报ORA-01652错误。

将temp2表空间删除,再执行同样的操作,就报了ORA-10922错误
ORA-10922: Temporary tablespace group is empty


关于临时表空间组的内容,可以参考metalink文档ID 245645.1
该文档解释了为什么创建以及如何创建临时表空间组。
临时表空间组是10g引入的新特性。
将临时表空间分组为单个组,可以让用户使用多个表空间的临时空间。

主要内容
------------
1.临时表空间组包含至少1个表空间。没有限制一个组最多可以包含多少表空间。
2.临时表空间组共享表空间的命名空间,所以它不能和任何表空间同名。
3.临时表空间组的名称可以和临时表空间的名称一样,分配给数据库或一个用户。
4.临时表空间组不能直接创建。它通过,将第一个临时表空间指定到该组时创建,将该组最后一个临时表空间删除时删除组。
5.任何一个临时表空间都可以:
 - 从一个组移到另一个组(如果组不存在,将会创建)
 - 从组中移除
 - 如果它是独立的可以增加到一个组
6.临时表空间组的意义:
  - 避免了1个表空间不适当地持有了排序的结果,尤其是分区表的问题。
  - 当一个用户同时连接了多个会话,可以使用不同的临时表空间。
  - 在并行操作中可以并行使用多个临时表空间。

例子
------------
1.SQL> create temporary tablespace LMTEMP 1
       tempfile 'D:\ORACLE10\ORCL\temp1_01.dbf' size 50M
       tablespace group GROUP1;
 在创建LMTEMP1临时表空间之前,GROUP1不存在。LMTEMP1是属于该组的第一个临时表空间。
 SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP1                         LMTEMP1

2. SQL> create temporary tablespace lmtemp2
         tempfile 'D:\ORACLE10\ORCL\temp1_02.dbf' size 2M
         tablespace group group1;

   Tablespace created.

   一个新的临时表空间LMTEMP2增加到已存在的组GROUP1中。

   SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP1                         LMTEMP1
   GROUP1                         LMTEMP2

3. 临时表空间可以移动到一个新的或另一个组中。
 
   SQL> alter tablespace LMTEMP1  tablespace group GROUP2 ;
   Tablespace altered.

   SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP2                         LMTEMP1
   GROUP1                         LMTEMP2

4. 一个临时表空间可以移出组,使之成为孤立的临时表空间。

   SQL> alter tablespace LMTEMP1  tablespace group '';
   Tablespace altered.

   SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP1                         LMTEMP2

   SQL> select tablespace_name from dba_tablespaces where contents='TEMPORARY';

   TABLESPACE_NAME              
   ------------------------------
   TEMP                          
   LMTEMP1                       
   LMTEMP2                       

   该孤立的表空间仍然是可以重新合并入一个组中:

   SQL> alter tablespace LMTEMP1  tablespace group GROUP1;
   Tablespace altered.

5. SQL> create temporary tablespace lmtemp5
         tempfile 'D:\ORACLE10\ORCL\temp1_05.dbf' size 50M
         tablespace group lmtemp5;
   create temporary tablespace lmtemp5
   *
   ERROR at line 1:
   ORA-10918: TABLESPACE GROUP name cannot be the same as tablespace name

   由于共享命名空间,所以组名不能和表空间名相同。

6. 如果将GROUP1中的所有临时表空间都删除,该组也会自动移除:
  
   SQL> create temporary tablespace LMTEMP3
         tempfile 'D:\ORACLE10\ORCL\temp1_03.dbf' size 2M
         tablespace group GROUP2;

   Tablespace created.

   SQL> create temporary tablespace LMTEMP4
         tempfile 'D:\ORACLE10\ORCL\temp1_04.dbf' size 2M
         tablespace group GROUP2;

   Tablespace created.

   SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP1                         LMTEMP1
   GROUP1                         LMTEMP2
   GROUP2                         LMTEMP3
   GROUP2                         LMTEMP4

   SQL> drop tablespace lmtemp3 including contents and datafiles;
   Tablespace dropped.

   SQL> drop tablespace lmtemp4 including contents and datafiles;
   Tablespace dropped.

   SQL> select * from dba_tablespace_groups;

   GROUP_NAME                     TABLESPACE_NAME
   ------------------------------ ------------------------------
   GROUP1                         LMTEMP1
   GROUP1                         LMTEMP2
 
7. 可以分配给用户一个默认的临时表空间组:

   SQL> alter user scott temporary tablespace GROUP1;
   User altered.

8. 临时表空间组也可以在数据库级别分配默认的临时表空间组:

   SQL> alter database  default temporary tablespace GROUP1;
   Database altered.

   需要注意的,现在任何属于这个分配给数据库默认表空间组的临时表空间,都不能被删除:

   SQL> drop  tablespace LMTEMP2 including contents and datafiles;
   drop  tablespace lmtemp2 including contents and datafiles
   *
   ERROR at line 1:
   ORA-10921: Cannot drop tablespace belonging to default temporary tablespace
   group

9. 该新特性对用户是有好处的,各自会话的并行的几个排序操作,可以使用不同的临时表空间:

   -- DBA 会话 --

      SQL> select username, session_num, tablespace from v$sort_usage;
      no rows selected

   -- SCOTT 会话1 --

      SQL> select a.table_name, b.table_name from dict A, dict B;

   -- SCOTT 同时发生的会话2--

      SQL> select a.table_name, b.table_name from dict A, dict B;

   -- DBA 会话 --

      SQL> select username, session_num, tablespace from v$sort_usage;

      USERNAME                       SESSION_NUM TABLESPACE
      ------------------------------ ----------- -------------------------------
      SCOTT                                   97 LMTEMP2
      SCOTT                                  150 LMTEMP1

      用户SCOTT分别在2个不同的临时表空间进行排序操作。

阅读(1773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~