情况描述:
朋友的测试环境,程序调用的时候提示ORA-00376:file 6 cannot be read at this time;
我先用shutdown abort停库,然后startup时候提示ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
发现有个数据文件没了!
尝试把这个datafile offline
SQL>alter database datafile 6 offline;
报错ORA-01145: offline immediate disallowed unless media recovery enabled
看网上说数据库是非归档模式的,尝试开启归档
SQL>ALTER DATABASE ARCHIVELOG;
报错ORA-00265: instance recovery required, cannot set ARCHIVELOG mode
原来是因为我shutdown abort停的库(如果shutdown immediate停的话当时应该就会直接报错的,被我完美跳过了。。)
于是使用offline drop(网上查的)
SQL>alter database datafile 6 offline drop;
然后
SQL>alter database open; 数据库顺利打开
总结处理这个问题时出现错误的地方:
1.不应该盲目停库
2.不细心 之前一直没有发现是数据文件丢了,在数据文件夹下面看到个dbf我就以为是有问题的那个dbf,其实我看到的那个是临时表空间的dbf..只是因为命名太接近了,就把我迷住了。
3.停库之前查v$datafile时发现了datafile 6的checkpoint_change#的和其他的不一致,但是这个线索没有追踪下去
网上查了一下 offline drop和offline没什么本质的区别,都是只改写了control文件,不会更新file$和ts$,但是对数据文件的offline只能在数据库是归档模式下才能执行;
对一个datafile执行offline和offline drop的区别
1、对一个datafile执行offline或offline drop本质上是一回事;但对一个datafile执行offline只能在归档模式下,而对一个datafile执行offline drop则既可以在归档模式也可 以在非归档模式下;
2、对一个datafile无论是执行offline还是offline drop,都是只改写了control文件,不会更新file$和ts$,这就是为什么可以在mount状态下对某个datafile执行offline/offline drop的本质原因;
3、只有当对datafile所在的表空间执行offline normal的时候,才会既改写control文件,又更新ts$和seg$,oracle这里会把ts$的online$字段的值由1改为2,但依然不会去更新file$;
4、只有当对datafile所在的表空间执行drop操作的时候,oracle才会去更新ts$和file$,oracle这里会把ts$的online$字段的值由1改为3,会把file$的status$字段由2改为1;
注 意,无论是file$的file#还是ts$的ts#,它们都是连续的!并且oracle会重用file$的file#,但是不会重用ts$里的ts#, 这本质上是因为ts$里会记录tablespace的名字,而file$里并没有记录datafile的名字,所以file$里的记录可以重用而ts$则 不能。
5、只要你对一个datafile执行了offline或者offline drop操作,则oracle在open的时候就不会去存储上(无论是文件系统、裸设备还是ASM)校验这个文件了,所以即使这个文件已经在存储上被删掉了,此时库依然可以open。
6、 无论你是在归档模式还是在非归档模式,且无论你对某个datafile是执行了offline还是offline drop操作,只要归档日志还在(对应于归档模式)或者相关的online redo log没有被logfile switch覆盖(对应于非归档模式),则这个datafile始终是可以online的,里面的数据都还在。当然,即使归档日志不在了,online redo log被logfile switch覆盖了,这个datafile也是可以online的,只是里面的数据可能会不一致。(从http://blog.chinaunix.net/uid-25960404-id-3828859.html这搬运过来)
通过一个案例知道了了offline drop
最新推荐文章于 2021-11-18 17:52:54 发布