SQL> select name,status from v$datafile;
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\SYSTEM01.DBF
SYSTEM
E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\UNDOTBS01.DBF
ONLINE
E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\SYSAUX01.DBF
ONLINE
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF
ONLINE
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> insert into arch select 'ok' from dba_objects;
已创建49749行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> l
1* alter system switch logfile
SQL> insert into arch select 'ok' from dba_objects;
已创建49749行。
SQL> commit;
提交完成。
SQL> insert into arch select 'no' from dba_objects;
已创建49748行。
SQL> commit
2 ;
提交完成。
SQL> select count(*) from arch group by status;
COUNT(*)
----------
99498
49748
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
ok,现在把users表空间的数据文件手动修改,破坏数据文件
然后检查数据文件
C:\Documents and Settings\zhangli>dbv file = E:\oracle\product\10.2.0\db_1\oradata\orcl\USERS01.DBF blocksize = 8192
...................
页 635 流入 - 很可能是介质损坏
Corrupt block relative dba: 0x0800027b (file 538976288, block 635)
Fractured block found during dbv:
Data in bad block:
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x00000000
check value in block header: 0x0
block checksum disabled
页 636 流入 - 很可能是介质损坏
Corrupt block relative dba: 0x0800027c (file 538976288, block 636)
Fractured block found during dbv:
Data in bad block:
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x00000000
check value in block header: 0x0
block checksum disabled
页 637 流入 - 很可能是介质损坏
Corrupt block relative dba: 0x0800027d (file 538976288, block 637)
Fractured block found during dbv:
Data in bad block:
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x00000000
check value in block header: 0x0
block checksum disabled
页 638 流入 - 很可能是介质损坏
Corrupt block relative dba: 0x0800027e (file 538976288, block 638)
Fractured block found during dbv:
Data in bad block:
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x00000000
check value in block header: 0x0
block checksum disabled
页 639 流入 - 很可能是介质损坏
Corrupt block relative dba: 0x0800027f (file 538976288, block 639)
Fractured block found during dbv:
Data in bad block:
type: 0 format: 0 rdba: 0x00000000
last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x00000000
check value in block header: 0x0
block checksum disabled
DBVERIFY - 验证完成
检查的页总数: 639
处理的页总数 (数据): 0
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 0
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 0
标记为损坏的总页数: 639
流入的页总数: 612
最高块 SCN : 0 (0.0)
确保数据文件损坏,然后启动数据库
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF'
SQL> alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF' offline drop;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> drop tablespace users including contents;
drop tablespace users including contents
*
第 1 行出现错误:
ORA-12919: 不能删除默认永久表空间
SQL> recover database;
ORA-00283: 恢复会话因错误而取消
ORA-01124: 无法恢复数据文件 1 - 文件在使用中或在恢复中
ORA-01110: 数据文件 1:
'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover datafile 'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF' ;
ORA-00279: 更改 606705 (在 11/11/2006 12:14:14 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1_
MF_1_4_%U_.ARC
ORA-00280: 更改 606705 (用于线程 1) 在序列 #4 中
指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 607096 (在 11/11/2006 12:25:03 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1_
MF_1_1_%U_.ARC
ORA-00280: 更改 607096 (用于线程 1) 在序列 #1 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1
_MF_1_4_2OBN5FN0_.ARC'
ORA-00279: 更改 608375 (在 11/11/2006 12:42:57 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1_
MF_1_2_%U_.ARC
ORA-00280: 更改 608375 (用于线程 1) 在序列 #2 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1
_MF_1_1_2OBO6L6C_.ARC'
ORA-00279: 更改 608476 (在 11/11/2006 12:45:27 生成) 对于线程 1 是必需的
ORA-00289: 建议:
E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1_
MF_1_3_%U_.ARC
ORA-00280: 更改 608476 (用于线程 1) 在序列 #3 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\PRODUCT\10.2.0\DB_1\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2006_11_11\O1
_MF_1_2_2OBOC85V_.ARC'
已应用的日志。
完成介质恢复。
SQL> select count(*) from arch;
select count(*) from arch
*
第 1 行出现错误:
ORA-00376: 此时无法读取文件 4
ORA-01110: 数据文件 4: 'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF'
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> recover database ;
ORA-00283: 恢复会话因错误而取消
ORA-00264: 不要求恢复
SQL> alter database open;
数据库已更改。
SQL> select count(*) from arch;
select count(*) from arch
*
第 1 行出现错误:
ORA-00376: 此时无法读取文件 4
ORA-01110: 数据文件 4: 'E:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01.DBF'
SQL> alter tablespace users online;
表空间已更改。
SQL> select count(*) from arch;
COUNT(*)
----------
149246
SQL> select count(*) from arch group by status;
COUNT(*)
----------
99498
49748
SQL>
ok!数据完全恢复,问题解决