ORA-10922 Temporary tablespace group is empty错误
Feb292016
今天开发人员在运行一个大SQL的时候,遇到了ORA-10922错误。
ERROR at line 41: ORA-10922: Temporary tablespace group is empty
这个错误是由于该SQL需要大量的排序,而内存中的排序区满足不了排序的需求,需要使用临时表空间,而临时表空间组不存在导致的,这套数据库是从2节点的RAC生产库通过RMAN恢复而成的测试环境,源数据库使用临时表空间组,同事在恢复这套环境时,删除掉了临时表空间组,重新建了新的临时表空间。
SQL> select FILE_NAME,TABLESPACE_NAME from dba_temp_files; FILE_NAME TABLESPACE_NAME ---------------------------------------- ------------------------------ /u01/app/oracle/oradata/ivldb/temp01.dbf TEMP_IVLDB
此时,临时表空间组已经删除。
SQL> select * from dba_tablespace_groups; no rows selected
起初以为同事没有将这个新创建的临时表空间设置为数据库的默认临时表空间导致的。
SQL> alter database default temporary tablespace TEMP_IVLDB; alter database default temporary tablespace TEMP_IVLDB * ERROR at line 1: ORA-12907: tablespace TEMP_IVLDB is already the default temporary tablespace
可是在将这个临时表空间设置为数据库的默认表空间时,提示已经设置成数据库级的默认临时表空间了。那么导致这个问题的原因就是用户级的临时表空间没有修改导致的。
SQL> select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='CHGSHS'; USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ------------------------------ ------------------------------ ------------------------------ CHGSHS TS_BSC IVALUE_TEMP
经查询,这个用户还的默认临时表空间还是之前被删掉的临时表空间组,将这个用户的默认临时表空间设置为新创建的临时表空间,问题解决。
SQL> alter user CHGSHS temporary tablespace TEMP_IVLDB; User altered.
查看是否还有其他用户使用原先的被删掉的临时表空间组。
查看是否还有其他用户使用原先的被删掉的临时表空间组。 SQL> select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where TEMPORARY_TABLESPACE='IVALUE_TEMP'; USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ------------------------------ ------------------------------ ------------------------------ ZT TS_BSC IVALUE_TEMP MIGSP MIGSP IVALUE_TEMP VOUCHER TS_BSC IVALUE_TEMP CHGSHSIF TS_FUL_IF IVALUE_TEMP
将以上用户的默认临时表空间修改为新创建的临时表空间,以免这些用户也遇到这个问题。
SQL> alter user CHGSHSIF temporary tablespace TEMP_IVLDB; User altered. SQL> alter user VOUCHER temporary tablespace TEMP_IVLDB; User altered. SQL> alter user MIGSP temporary tablespace TEMP_IVLDB; User altered. SQL> alter user ZT temporary tablespace TEMP_IVLDB; User altered. SQL> select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where TEMPORARY_TABLESPACE='IVALUE_TEMP'; no rows selected
至此,问题解决。