UNDO表空间的ORA-01110错误解决(一)

前一段时间解决了一个ORA-1122错误,正好本机的数据库环境由于Windows的自动重起,导致数据库无法打开,出现错误信息也是ORA-1122

这次出现错误的表空间是UNDO表空间。


首先看一下问题,尝试打开数据库,则会报错:

SQL> CONN /@TEST AS SYSDBA已连接到空闲例程。
SQL> STARTUP MOUNT
ORACLE 
例程已经启动。

Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 
位于第 1 :
ORA-01122: 
数据库文件 2 验证失败

ORA-01110: 
数据文件 2: 'F:ORACLEORADATATESTUNDOTBS01.DBF'
ORA-01200: 25600
的实际文件大小小于26880块的正确大小

数据库是处于归档模式:

SQL> SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE
------------
ARCHIVELOG

解决问题最简单的方法莫过于使用备份和归档日志进行数据库的恢复。由于是本机的测试数据库,因此没有设置备份策略,不过还是在本机找到一个一年前的数据库冷备份,而且发现数据库的所有归档都存在,那么使用归档恢复则是最方便、最稳妥的方法。

首先仍然是备份当前的环境,一方面是为了一会的恢复如果出现意外,至少可以恢复到没有操作前的状态,不会导致数据库的问题进一步复杂。另一方面是为了保留错误现场,这样在尝试正常方法恢复后还可以有环境来尝试一下其他的恢复方式。

备份完现场环境后,可以进行数据库的恢复:

SQL> HOST COPY F:ORACLEBACKUPTEST20061110UNDOTBS01.DBF F:ORACLEORADATATESTUNDOTBS01.DBF

SQL> RECOVER TABLESPACE UNDOTBS1
ORA-00279: 
更改 55747341 ( 11/11/2006 22:11:26 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00306.001
ORA-00280: 
更改 55747341 对于线程 1 是按序列 # 306 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 55773423 ( 11/12/2006 08:34:23 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00307.001
ORA-00280: 
更改 55773423 对于线程 1 是按序列 # 307 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00306.001'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 55793564 ( 11/12/2006 23:24:46 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00308.001
ORA-00280: 
更改 55793564 对于线程 1 是按序列 # 308 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00307.001'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: 更改 55793630 ( 11/12/2006 23:28:00 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00309.001
ORA-00280: 
更改 55793630 对于线程 1 是按序列 # 309 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00308.001'

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: 
更改 55793693 ( 11/12/2006 23:30:10 生成对于线程 1 是必需的

ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00310.001
ORA-00280: 
更改 55793693 对于线程 1 是按序列 # 310 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00309.001'


ORA-00279: 
更改 55815674 ( 11/13/2006 08:29:33 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00311.001
ORA-00280: 
更改 55815674 对于线程 1 是按序列 # 311 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00310.001'

.
.
.
ORA-00279: 
更改 58975589 ( 05/13/2007 21:36:37 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00444.001
ORA-00280: 
更改 58975589 对于线程 1 是按序列 # 444 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00443.001'


ORA-00279: 
更改 58988027 ( 05/13/2007 21:38:39 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00445.001
ORA-00280: 
更改 58988027 对于线程 1 是按序列 # 445 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00444.001'


ORA-00279: 
更改 59004640 ( 05/13/2007 21:40:16 生成对于线程 1 是必需的
ORA-00289: 
建议: F:ORACLEORADATATESTARCHIVEARC00446.001
ORA-00280: 
更改 59004640 对于线程 1 是按序列 # 446 进行的

ORA-00278: 
此恢复不再需要日志文件 'F:ORACLEORADATATESTARCHIVEARC00445.001'

已应用的日志。完成介质恢复。
SQL> ALTER DATABASE OPEN;

数据库已更改。

SQL> SELECT COUNT(*) FROM YANGTK.T;

COUNT(*)
----------
636807

可以看到,虽然表空间的备份已经是1年多以前的,虽然需要恢复归档的日志有100多个,只要备份和归档都没有被损坏,数据库就可以轻松的恢复。

这种方法显然是最简单可靠的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误一般是由于 undo 空间损坏或不存在导致的。 首先,你可以检查一下数据库中是否存在该 undo 空间,可以通过执行以下 SQL 语句进行检查: ``` SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name='<undo_tablespace_name>'; ``` 其中 `<undo_tablespace_name>` 应该替换成你要检查的 undo 空间的名称。 如果查询结果为空,说明该空间不存在,你需要创建一个新的 undo 空间。如果查询结果不为空,则需要进一步检查该 undo 空间是否正常。 你可以执行以下 SQL 语句检查 undo 空间是否正常: ``` SELECT status FROM v$rollstat WHERE segment_name='<undo_tablespace_name>'; ``` 其中 `<undo_tablespace_name>` 应该替换成你要检查的 undo 空间的名称。 如果查询结果为 `ONLINE`,则说明该 undo 空间正常。如果查询结果为 `OFFLINE` 或者其他异常状态,则说明该 undo 空间存在问题,需要进行修复或者重建。 如果你需要创建一个新的 undo 空间,可以执行以下 SQL 语句: ``` CREATE UNDO TABLESPACE <undo_tablespace_name> DATAFILE '<path_to_undo_datafile>' SIZE <size_in_MB>; ``` 其中 `<undo_tablespace_name>` 是你要创建的 undo 空间名称,`<path_to_undo_datafile>` 是你要指定的 undo 数据文件路径,`<size_in_MB>` 是你要指定的 undo 空间大小,单位为 MB。 如果你需要修复一个存在问题的 undo 空间,可以参考以下步骤: 1. 首先备份该 undo 空间对应的数据文件,以防止数据丢失。 2. 尝试在线修复该 undo 空间,你可以执行以下 SQL 语句: ``` ALTER TABLESPACE <undo_tablespace_name> BEGIN BACKUP; ALTER TABLESPACE <undo_tablespace_name> END BACKUP; ``` 这两条 SQL 语句可以将该 undo 空间置于备份模式,然后再退出备份模式。如果该 undo 空间存在一些逻辑损坏,这两条 SQL 语句可能会修复这些问题。 3. 如果在线修复失败,你可以尝试离线修复该 undo 空间,你可以执行以下 SQL 语句: ``` ALTER DATABASE DATAFILE '<path_to_undo_datafile>' OFFLINE; RECOVER DATAFILE '<path_to_undo_datafile>'; ALTER DATABASE DATAFILE '<path_to_undo_datafile>' ONLINE; ``` 这三条 SQL 语句可以将该 undo 数据文件置为离线状态,然后进行数据文件恢复,最后再将该数据文件置为在线状态。 4. 如果无法修复该 undo 空间,你可以考虑重建该 undo 空间,你可以执行以下 SQL 语句: ``` DROP TABLESPACE <undo_tablespace_name> INCLUDING CONTENTS AND DATAFILES; CREATE UNDO TABLESPACE <undo_tablespace_name> DATAFILE '<path_to_undo_datafile>' SIZE <size_in_MB>; ``` 这两条 SQL 语句可以先删除存在问题的 undo 空间,然后重新创建一个新的 undo 空间。请注意,这个操作会删除该 undo 空间中的所有数据,所以请务必提前备份数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值