问题现象:① 表空间新增数据文件时,文件名出错,且归档过期或已无在线日志文件;② 异常断电时,导致数据文件头中的scn与控制文件中的scn不一致;
1、查看当前数据文件信息
SQL> set pagesize 20000
set linesize 180
set pause off
set serveroutput on
set feedback on
set echo on
set numformat 999999999999999
Spool recovery_info.txt
select file#,substr(name, 1, 50), status,checkpoint_change#,checkpoint_time from v$datafile;
select substr(name,1,50), recover, fuzzy, checkpoint_change# from v$datafile_header;
select GROUP#,substr(member,1,60) from v$logfile;
select * from v$recover_file;
select distinct status from v$backup;
select hxfil FILENUMBER, fhsta STATUS, fhscn SCN, FHAFS ABSSCN , fhrba_Seq SEQUENCE from x$kcvfh;
select distinct (fuzzy) from v$datafile_header;
spool off
exit;
2、停库
sql> shutdown immediate
-----下面使用bbed工具查看、修改数据文件,该操作风险极大,操作前请备份数据库!
(需要关注四个偏移量offset点,分别为484、492、140和148
a、datafile 的file header 存储在第一个block里
b、Oracle considers four attributes of this data structure when determining if a datafile is sync with the other data files of the database:(不同oracle版本offset可能不同)
(1)kscnbas (at offset 484) – SCN of last change to the datafile.
(2)kcvcptim (at offset 492) -Time of the last change to the datafile.
(3)kcvfhcpc (at offset 140) – Checkpoint count.
(4)kcvfhccc (at offset 148) – Unknown, but is always 1 less than thecheckpoint point count.
Oracle有4个属性来判断datafile 是否和其他的datafile 一致,如果都一致,可以正常操作,如果不一致,那么会报ORA-01113错误)
3、查看某个正确文件的数据文件头,偏移量484
双击bbed.bat
bbed> set filename '这里是filelist文件中的地址/user01.dbf'
bbed> set block 2
--window下块从2开始,linux下块从1开始
bbed> map
bbed> set offset 484
bbed> set count 128
bbed> dump
--照片记录这个偏移量484的信息,后续修改需要使用
4、切换查看异常文件的数据文件头,偏移量484
bbed> set filename '这里是filelist文件中的地址/异常的文件名.dbf'
bbed> set block 2
bbed> map
bbed> set offset 484
bbed> set count 128
bbed> dump
--照片记录这个偏移量484的信息,如果有误后续需要改回去
bbed> m /x 正确的偏移量值 484
回车后输入y,确认修改
----按照步骤3、步骤4修改其他需要修改的偏移量----
----492\140\148的偏移量
bbed> sum apply
这个步骤表示提交修改
bbed> verify
这步表示提交验证
5、cmd下,登录sqlplus / as sysdba,启动数据库到mount状态
sql> startup mount;
sql> select file#,name,checkpoint_change#,checkpoint_time from v$datafile;
sql> select file#, recover, fuzzy, CHECKPOINT_CHANGE# from v$datafile_header;
6、手动去数据库文件目录下将数据文件名修改为符合规则的
然后使用命令调整数据字典信息
alter database rename file 'D:\app\administrator\oradata\orcl\d_01.DBF' to 'D:\app\administrator\oradata\orcl\d01.DBF';
7、尝试将数据库open
alter database open;
select tablespace_name,file_name from dba_data_files;
8、如果直接open不开,重建控制文件、需使用隐含参数打开
SQL> alter database backup controlfile to trace as 'd:\app\control';
复制文件中startup nomount下create controlfile 的内容,将内容复制到nomount状态下执行
SQL> create pfile='d:\app\pfile' from spfile;
-------d:\app\pfile中加上----------
_allow_resetlogs_corruption= TRUE
------------------------------------
SQL> startup mount pfile='d:\app\pfile' force
SQL> alter database open resetlogs;
SQL> alter system set "_allow_resetlogs_corruption"=false scope=spfile;




