ORACLE 重建控制文件及重連DATAFILE
起因是非生产数据库被玩坏了,具体怎么坏的我也不知道,接手的时候已经是 ORA-03113:end-of-file on communication channel,并且ARCHIVE LOG归档模式被更改过,没有做过任何备份,日志也删除掉了,已经无力回天。
我的第一个错误:没有备份控制文件就开始测试,正确的做法是
sqlplus /nolog
conn /as sysdba
alter database backup controlfile to trace;
然后才是重建控制文件(本来应该是直接从备份的trace里面找到重建的SQL语句,但我不知道所以直接从网上抄的)(写成.sql使用@sqlfilepath一次性执行)
SQL> startup mount;
SQL>
CREATE CONTROLFILE REUSE DATABASE “TESTDB” RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘D:\app\Administrator\oradata\TESTDB\REDO01.LOG’ SIZE 50M,
GROUP 2 ‘D:\app\Administrator\oradata\TESTDB\REDO02.LOG’ SIZE 50M,
GROUP 3 ‘D:\app\Administrator\oradata\TESTDB\REDO03.LOG’ SIZE 50M
DATAFILE
‘D:\app\Administrator\oradata\TESTDB\EXAMPLE01.DBF’,
‘D:\app\Administrator\oradata\TESTDB\SYSAUX01.DBF’,
‘D:\app\Administrator\oradata\TESTDB\SYSTEM01.DBF’,
‘D:\app\Administrator\oradata\TESTDB\UNDOTBS01.DBF’,
‘D:\app\Administrator\oradata\TESTDB\USERS01.DBF’
CHARACTER SET ZHS16GBK ;
SQL> RECOVER DATABASE;
SQL> ALTER DATABASE OPEN RESETLOGS; //并且因为这次重置日志导致控制文件中未加入的DATAFILE的SCN与数据库不一致了,无法ONLINE DATAFILE
然后发现可以开启数据库了,PL/SQL登入正常,可是不能查看数据了!提示ORA-01180: can not create datafile !並且所有表、数据皆不能访问。
原因:控制文件中没有包含实际运行的DATAFILE,oracle强制将原有表空间的对应DBF文件改为MISSING0000XXX,意味连接丟失,全部OFFLINE,通过以下语句可以查到:
select ts#,file#,checkpoint_change#,t.* from v$datafile t –可查checkpoint、scn等
select * from dba_data_files —可查当前datafile的具体信息,NAME、对应ID、对应表空间等(很重要,要根据此对应关系去决定如何进行重命名)
经GOOGLE,接下来的方案是重命名丢失的DBF为实际的表空间对应DBF:
SQL> alter database rename file ‘D:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00006’ to ‘D:\oracle\oradata\Oracle11g\TESTDB_DATA.DBF’;
SQL> alter database rename file ‘D:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\MISSING00007’ to ‘D:\oracle\oradata\Oracle11g\XXXXX_DATA.DBF’;
……….
重命名完毕后,再次 alter database open,会发现仍旧访问不了表数据。
原因: 再次查看datafile状态,发现被重命名的文件从OFFLINE状态变为RECOVER,正常应该为ONLINE状态。
但是,尝试 SQL>alter database datafile 6 online; –激活datafile
出现错误
ORA-01190:controlfile or data file 6 is from before the last RESETLOGS
即之前resetlogs导致DATAFILE的SCN与数据库不一致了,无法ONLINE DATAFILE
这个问题网上众说纷纭,直接用RMAN恢复的(但我们这个非生产环境并没有任何备份,只是测试数据库,无法恢复的),有修改datafile header的,国外还有大神还有用bbed直接修改内存的,经过很长时间的测试才最终找到了合适的解决方案。
原理:控制文件或文件6不在同一个resetlogs版本,尝试手动调整SCN,手动调整SCN以后必须用resetlogs模式打开数据库,所以需要设置_allow_resetlogs_corruption=true
解决方案:
SQL> alter session set events ‘immediate trace name adjust_scn level 1’;
再次shutdown immediate,并startup mount
SQL> recover database until cancel; –这一步很重要, 虽然不做这个操作也能打开数据库,但是我们是要用RESETLOGS来打开数据库,然后将数据文件状态联机
SQL> alter database datafile 6 online; –将每个datafile逐一激活
Database altered.
…
SQL> alter database open resetlogs;
Database altered.
至此,再次进行表数据查询,发现数据已经被恢复,所有数据正常访问。
发表评论或回复