断电引起ora-01200的数据库恢复

一个10g的库断电后,打开时出现ora-01200的错误:
SQL> connect / as sysdba;
已连接到空闲例程。
SQL> startup;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01122: 数据库文件 17 验证失败
ORA-01110: 数据文件 17: 'D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF'
ORA-01200: 255360 的实际文件大小小于 264960 块的正确大小

ORA-01200错误的官方解释如下:

ORA-01200 actual file size of string is smaller than correct size of string blocks

Cause: The size of the file as returned by the operating system is smaller than the size of the file as indicated in the file header and the control file. Somehow the file has been truncated. Maybe it is the

result of a half completed copy.

Action: Restore a good copy of the datafile and do recovery as needed.

意思是说只有找备份进行恢复.看来问题比较严重, 这个文件中保存中ZLHIS的病历数据,丢失了对客户的损失太大. 操作系统的文件大小小于数据文件头记录的大小,我们可否在数据文件末尾"增加"一段空的字节呢?在linux下可以使用dd命令产生这种文件,再附加到数据文件末尾.windows下也提供了一个fsutil命令,可以用来产生指定字节数的空文件.

--1.首先需要计算,空文件的字节数:
(264960-255360) * 8192 = 78643200
--2.产生一个指定字节数的空文件.
C:Documents and SettingsAdministrator>fsutil file createnew c:append.dbf 78643200
已创建文件 c:append.dbf
--3.附加到数据文件末尾
C:Documents and SettingsAdministrator>type c:append.dbf >>D:ORACLEPRODUCT
10.2.0ORADATAORCLZL9EPRDAT.DBF

经过这么处理后,数据库已经可以mount起来了:

SQL> startup;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01172: 线程 1 的恢复停止在块 259285 (在文件 17 中)
ORA-01151: 如果需要, 请使用介质恢复以恢复块和还原备份
 

在打开数据库时候,发觉无法做实例恢复,提示恢复的文件就是刚才损坏的数据文件:


SQL> select name from v$datafile where file#=17;

NAME
--------------------------------------------------------------------------------
D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF


尝试介质恢复, 出现了讨厌的ORA-00600错误:

SQL> recover database;
ORA-00283: 恢复会话因错误而取消
ORA-12801: 并行查询服务器 P000 中发出错误信号
ORA-10562: Error occurred while applying redo to data block (file# 17, block#
258754)
ORA-10564: tablespace ZL9EPRDAT
ORA-01110: data file 17: 'D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF'
ORA-10560: block type '0'
ORA-00600: internal error code, arguments: [4552], [1], [0], [], [], []

 

某些数据文件块已经损坏,无法应用redo中的日志,这部分数据可能已经损坏,决定舍弃这部分数据.使用_allow_resetlogs_corruption参数跳过redo日志文件


SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

系统已更改。

SQL> shutdown immediate;
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。


直接做不完全恢复,会提示归档日志找不到,不用理会,尝试用resetlogs打开数据库,还是失败!! fuck!!


SQL> recover database until cancel;
ORA-00279: 更改 181426480 (在 06/11/2009 18:15:23 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1_
8980_%U_.ARC
ORA-00280: 更改 181426480 (用于线程 1) 在序列 #8980 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1
_8980_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


ORA-00308: 无法打开归档日志
'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1
_8980_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'


SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结束


这时候,查看后台的alertORCL.log文件,有如下错误:
Thu Jun 11 22:59:58 2009
Errors in file e:oracleproduct10.2.0adminorclbdumporcl_smon_2064.trc:
ORA-00600: internal error code, arguments: [4193], [34756], [34760], [], [], [], [], []

查询metalink得到上述错误主要是跟undo有关:
PURPOSE:
This article discusses the internal error "ORA-600 [4193]", what
it means and possible actions. The information here is only applicable
to the versions listed and is provided only for guidance.

ERROR:
ORA-600 [4193] [a] [b]

VERSIONS:
versions 6.0 to 10.1

DESCRIPTION:

A mismatch has been detected between Redo records and Rollback (Undo)
records.

We are validating the Undo block sequence number in the undo block against
the Redo block sequence number relating to the change being applied.

This error is reported when this validation fails.

ARGUMENTS:
Arg [a] Undo record seq number
Arg [b] Redo record seq number

FUNCTIONALITY:
KERNEL TRANSACTION UNDO

IMPACT:
PROCESS FAILURE
POSSIBLE ROLLBACK SEGMENT CORRUPTION

 

设置undo表空间为手动管理,再打数据库成功!!!

 

SQL> connect / as sysdba;
已连接到空闲例程。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> show parameter undo;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1

SQL> alter system set undo_management=manual scope=spfile;

系统已更改。

SQL> shutdown immediate;
ORA-01109: 数据库未打开


已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> alter database open;

数据库已更改。

SQL> alter user system identified by his;

用户已更改。

最后就是export数据,重建数据库.

你可能感兴趣的:(oracle,职场,休闲,断电,ora-01200)