学无止境
分类: 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个不同的临时表空间进行排序操作。