ORA-25153: Temporary Tablespace is Empty

本文记录了一次因临时表空间为空导致的Oracle数据库错误,并详细介绍了如何通过添加新的临时文件来解决这一问题。同时,还模拟了物理数据文件丢失的情况,并演示了如何正确地删除已丢失的临时文件。

测试现象:

SQL> exec dbms_tts.transport_set_check('USERS',TRUE);

BEGIN dbms_tts.transport_set_check('USERS',TRUE); END;

*

ERROR at line 1:

ORA-25153: Temporary Tablespace is Empty

SQL> select * from dba_objects order by object_name;

select * from dba_objects order by object_name

*

ERROR at line 1:

ORA-25153: Temporary Tablespace is Empty

检查原因:

看了一下DBA_TABLESPACES,嗯...TEMPstatusonline....不过是假象。

www.ixdba.net


SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES;

TABLESPACE_NAME STATUS

------------------------------ ---------

SYSTEM ONLINE

UNDOTBS1 ONLINE

TEMP ONLINE

CWMLITE ONLINE

DRSYS ONLINE

EXAMPLE ONLINE

INDX ONLINE

ODM ONLINE

TOOLS ONLINE

SQL> select tablespace_name, file_name from dba_temp_files;

no rows selected

dba_temp_files里可是空空如也~~

解决问题:

我们会遇到两种情况,一种是OS levelphysical datafile不见了,一种是logical tempfile不见了,我不知道我之前曾做了 啥,不过似乎遇到的是第二种情况,验证一下。

$ ls -al

total 11642092

drwxr-xr-x 5 oracle dba 1024 Sep 2 16:43 .

drwxrwxrw- 8 oracle dba 512 Sep 24 17:55 ..

-rw-r----- 1 oracle dba 1925120 Oct 5 13:56 control01.ctl

-rw-r----- 1 oracle dba 1925120 Oct 5 13:56 control02.ctl

-rw-r----- 1 oracle dba 1925120 Oct 5 13:56 control03.ctl

-rw-r----- 1 oracle dba 20979712 Oct 5 13:17 cwmlite01.dbf

-rw-r--r-- 1 oracle dba 415486976 Aug 5 18:01 dba.dmp

-rw-r----- 1 oracle dba 20979712 Oct 5 13:17 drsys01.dbf

-rw-r----- 1 oracle dba 144842752 Oct 5 13:17 example01.dbf

-rw-r----- 1 oracle dba 69476352 Oct 5 13:17 indx01.dbf

-rw-r----- 1 oracle dba 20979712 Oct 5 13:17 odm01.dbf

-rw-r----- 1 oracle dba 52445184 Oct 5 13:17 oem_repository.dbf

-rw-r----- 1 oracle dba 20979712 Mar 3 2004 ram_01.dbf

drwxrjkr-x 2 oracle dba 512 Dec 17 2003 redo01

drwxr-xr-x 2 oracle dba 512 Dec 17 2003 redo02

drwxr-xr-x 2 oracle dba 512 Dec 17 2003 redo03

-rw-r----- 1 oracle dba 20979712 Oct 5 13:17 rman_tbs01.dbf

-rw-r--r-- 1 oracle dba 664 Aug 5 18:03 sqlnet.log

-rw-r----- 1 oracle dba 429924352 Oct 5 13:49 system01.dbf

-rw-r----- 1 oracle dba 99622912 Aug 16 14:16 temp01.dbf

-rw-r----- 1 oracle dba 38019072 Oct 5 13:17 tools01.dbf

-rw-r----- 1 oracle dba 351281152 Oct 5 13:56 undotbs01.dbf

-rw-r----- 1 oracle dba 1048584192 Oct 5 13:17 users01.dbf

-rw-r----- 1 oracle dba 1048584192 Oct 5 13:17 users02.dbf

-rw-r----- 1 oracle dba 47194112 Oct 5 13:17 xdb01.dbf

-rw-r----- 1 oracle dba 5251072 Oct 5 13:17 xyz.dbf

temp01.dbf datafile最后access时间怎么还停留在8月勒...可见我两个月没上来数据库玩了,都没发现到。不管了,先救回来再说。

SQL> alter tablespace temp add tempfile '/oradata/elife02/temp01.dbf'

Tablespace altered.

SQL> select FILE_NAME,TABLESPACE_NAME,STATUS from dba_temp_files;

FILE_NAME TABLESPACE_NAME STATUS

----------------------------------- ------------------------------ ---------

/oradata/elife02/temp01.dbf TEMP AVAILABLE

模拟现象:

现在来恶搞,先模拟第一种drop physical datafile

#rm temp01.dbf

SQL> select file_name , TABLESPACE_NAME, STATUS from dba_temp_files;

FILE_NAME

------------------------------------------------------------------------------

TABLESPACE_NAME STATUS

------------------------------ ---------

/oradata/elife02/temp01.dbf

TEMP AVAILABLE

此时temp file还是保留 AVAILABLE

SQL> select * from dba_objects order by object_name;

select * from dba_objects order by object_name

*

ERROR at line 1:

ORA-01116: error in opening database file 201

ORA-01110: data file 201: '/oradata/elife02/temp01.dbf'

ORA-27041: unable to open file

SVR4 Error: 2: No such file or directory

Additional information: 3

不过只要有process在进行sorting,就会出现错误了,那此时数据库仍可正常开关机吗?

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 337086968 bytes

Fixed Size 731640 bytes

Variable Size 318767104 bytes

Database Buffers 16777216 bytes

Redo Buffers 811008 bytes

Database mounted.

Database opened.

SQL> select file_name , TABLESPACE_NAME, STATUS from dba_temp_files;

select file_name , TABLESPACE_NAME, STATUS from dba_temp_files

*

ERROR at line 1:

ORA-01157: cannot identify/lock data file 201 - see DBWR trace file

ORA-01110: data file 201: '/oradata/elife02/temp01.dbf'

显然是可以,不过在开机时候,DBWR会把找不到temp file的信息写入trace file内。

由于我只是砍掉physical file,对于Oracle来说他仍然认为这个tempfile需要存在,故原本我想 依照文件所说,先drop掉仍然存在的metadata,只是当我下这指令时,系统似乎会hang住不动。

SQL> alter database tempfile '/oradata/elife02/temp01.dbf' drop;

....................

我只好先把他offline,再试试看可不可以drop

SQL> alter database tempfile '/oradata/elife02/temp01.dbf' offline;

Database altered.

SQL> alter database tempfile '/oradata/elife02/temp01.dbf' drop;

^Calter database tempfile '/oradata/elife02/temp01.dbf' drop

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation

还是不能drop,好吧,重新启动试试 看。

SQL> startup force

ORACLE instance started.

Total System Global Area 337086968 bytes

Fixed Size 731640 bytes

Variable Size 318767104 bytes

Database Buffers 16777216 bytes

Redo Buffers 811008 bytes

Database mounted.

Database opened.

SQL> alter database tempfile '/oradata/elife02/temp01.dbf' drop;

Database altered.

可以了,我不知道为什么,但后来我不死心又一次砍掉tempfile再立刻drop掉却又是可行的~~

$ rm temp02.dbf

$ sqlplus '/ as sysdba'

SQL*Plus: Release 9.2.0 .5.0 - Production on 星期二 10 5 14:42:46 2004

Connected to:

Oracle9i Enterprise Edition Release 9.2.0 .5.0 - 64bit Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0 .5.0 - Production

SQL> alter database tempfile '/oradata/elife02/temp02.dbf' drop;

Database altered. (又可以了)

SQL> alter tablespace temp add tempfile '/oradata/elife02/temp01.dbf' size 5m ;

Tablespace altered.

<think>好的,我现在需要解决用户关于Oracle 23c Free版遇到ORA-02180错误的问题。首先,用户提到这个错误是“create tablespace选项已禁用”,所以我要先理解这个错误的具体原因和可能的解决方案。 首先,我应该回忆一下ORA-02180的错误代码。ORA-02180通常与创建表空间时使用了无效的选项有关。但在Oracle的不同版本中,某些功能可能被禁用或修改,尤其是在免费版本中可能存在限制。用户提到的是Oracle 23c Free版,我需要确认这个版本是否对创建表空间的某些选项做了限制,或者是否有权限问题。 接下来,我需要考虑可能的原因。可能包括: 1. **权限不足**:用户可能没有创建表空间的必要权限,比如需要SYSDBA权限或者特定的系统权限如CREATE TABLESPACE。 2. **语法错误**:用户可能在CREATE TABLESPACE语句中使用了不支持的选项,或者在Free版中被禁用的功能,比如某些存储选项或加密选项。 3. **版本限制**:Oracle的免费版本可能限制了某些高级功能,比如表空间的管理选项,导致某些CREATE TABLESPACE的参数不可用。 4. **配置问题**:数据库的初始化参数可能禁用了某些表空间创建选项,例如某些存储参数被限制。 然后,我需要验证这些可能性。首先检查权限,用户需要具有CREATE TABLESPACE权限。可以通过查询DBA_SYS_PRIVS视图来确认用户的权限。如果权限不足,需要授予相应的权限。 接下来,检查用户使用的SQL语句是否有语法错误或不支持的选项。例如,Oracle 23c Free版是否支持特定的数据文件路径、大小设置,或者是否允许使用某些扩展选项。可能需要查阅Oracle 23c Free的官方文档,确认CREATE TABLESPACE的可用选项。 另外,考虑到Free版通常用于开发和测试,可能有一些限制。例如,可能不支持某些高级存储选项,或者最大文件大小的限制,导致创建表空间时出错。需要确认用户尝试的选项是否符合Free版的限制。 可能的解决方案步骤包括: 1. **检查权限**:确认用户是否有CREATE TABLESPACE权限,如果没有,使用SYSDBA账户授予权限。 2. **简化SQL语句**:尝试使用最基本的CREATE TABLESPACE语法,排除可能的选项冲突。 3. **查阅文档**:查看Oracle 23c Free版的文档,确认支持的选项和已知限制。 4. **错误日志分析**:检查数据库的告警日志,获取更详细的错误信息,帮助定位问题。 5. **联系支持**:如果以上步骤无效,建议用户向Oracle社区或官方支持寻求帮助。 另外,可能用户在使用CREATE TABLESPACE时,无意中启用了某些需要额外许可的功能,比如高级压缩或加密,这在免费版中可能不可用,导致选项被禁用。 最后,需要确保用户的环境配置正确,例如数据文件路径是否存在,存储空间是否足够等,但这些可能更多导致其他错误,如ORA-01119或ORA-27040,而不是ORA-02180。 总结,处理这个问题的步骤应该是先检查权限和SQL语法,排除简单问题,然后考虑版本限制和配置问题,逐步排查可能的原因。</think>以下是关于Oracle 23c Free版中**ORA-02180: create tablespace选项已禁用**的逐步分析与解决方案: --- ### **1. 错误背景** - **ORA-02180**表示在`CREATE TABLESPACE`语句中使用了当前环境不支持的选项。 - **Oracle 23c Free版**作为免费开发版,可能对某些高级功能进行了限制。 --- ### **2. 可能原因** #### **(1) 权限不足** - 用户缺少`CREATE TABLESPACE`权限。 - **验证方法**: ```sql SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = '当前用户名'; ``` - **解决方案**: ```sql GRANT CREATE TABLESPACE TO 用户名; ``` #### **(2) 语法或选项不兼容** - 使用了Free版禁用的选项(如加密、特定存储参数)。 - **示例**: ```sql CREATE TABLESPACE tbs1 DATAFILE 'file.dbf' SIZE 100M ENCRYPTION USING 'AES256'; -- 若加密功能被禁用 ``` - **解决方法**:简化语句,仅使用基础选项: ```sql CREATE TABLESPACE tbs1 DATAFILE 'file.dbf' SIZE 100M; ``` #### **(3) 版本功能限制** - Free版可能禁用以下功能: - 高级压缩 (`COMPRESS`) - 加密 (`ENCRYPTION`) - 特定文件存储类型(如`BIGFILE`)。 - **验证方法**:查阅[Oracle 23c Free文档](https://www.oracle.com/database/technologies/)确认支持的功能。 #### **(4) 初始化参数限制** - 检查是否禁用了某些存储选项: ```sql SHOW PARAMETER enable_pluggable_database; -- 若使用PDB需确认配置 ``` --- ### **3. 排查步骤** 1. **检查权限**: - 使用`SYSDBA`账户验证权限是否授予。 2. **简化SQL语句**: - 移除所有非必要选项(如加密、压缩),逐步测试。 3. **查阅日志**: - 检查`alert.log`获取详细错误信息: ``` SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace'; -- 获取日志路径 ``` 4. **确认Free版限制**: - 对比[官方文档](https://docs.oracle.com/en/database/oracle/oracle-database/23/)中的功能列表。 --- ### **4. 示例解决方案** ```sql -- 步骤1: 授予权限 CONNECT / AS SYSDBA; GRANT CREATE TABLESPACE TO scott; -- 步骤2: 尝试最简语法 CREATE TABLESPACE tbs_test DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_test01.dbf' SIZE 100M AUTOEXTEND ON; ``` --- ### **5. 若问题仍存在** - **联系支持**: - 访问[Oracle社区](https://community.oracle.com/)提交问题。 - 提供完整错误信息、SQL语句及日志片段。 --- ### **总结** ORA-02180通常由权限或功能限制引起。在Oracle 23c Free版中,建议优先使用基础语法,逐步排查选项兼容性。若需高级功能,需升级至企业版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值