一次诡异的ORA-1157异常与恢复

上周,应用人员在数据库Dataguard端进行查询操作时发现ORA-1157错误,当时应用发送过来的报错截图如下,

501-501

什么是ORA-01157错误:

501-13数据库无法访问数据库对应数据文件或被LOCK,可以看到Alert日志中同样出现了一致错误并伴随了ORA-1186与ORA-1110错误

 

 

501-3501-5

错误中提到,无法访问501号数据库文件,我们看一下501号文件是什么?

501-4

很诡异的是,数据库中最大的文件号为6,也就是说没有501号的数据文件存在。无奈之举,决定Dump了一下Controlfile内容尝试看看能找到有什么线索(alter session set events ‘immediate trace name controlf level 9’;),再次产生疑问,501号文件是什么?

501-5

从控制文件中得到了信息,可以看到,External File 501文件,数据库文件号为File #1,正是数据库中的TEMP文件。

501-7

该数据库Dataguard环境为文件系统,但是从数据库中查询到该TEMP文件名称同主库一致为’+DG_DATA‘,经过分析,从主库中发现了如下异常现象:

501-8

在主库中db_file_name_convert参数中,只看到了数据文件的convert指定,并没有tempfile的指定,也就是导致了搭建DG时,TEMPFILE被建立在了备库不存在的位置“+DG_DATA”,但是控制文件中已记录了该文件的位置与信息,但是真实文件实际没有创建成功,也就是备库中根本不存在TEMPFILE,应用在备库中进行了查询,因数据量较大,有很多GORUP BY,ORDER BY 的需求,排序等操作从PGA溢出到了临时表空间中,引发了此问题。

现在,已经清除了问题的来龙去脉,那么,如果解决这个问题?

尝试了各种删除数据文件的方式均未果,无奈之举,只有重建备库Controlfile,重建方法依照Oracle Mos中的Step By Step Guide On How To Recreate Standby Control File When Datafiles Are On ASM And Using Oracle Managed Files (文档 ID 734862.1)。

(1)从主库中备份standby controlfile:

501-10

(2)shutdown 备库并且将控制文件传输至备库:

(3)修改备库参数文件:

alter system set db_file_name_convert='+DG_DATA/SIDNAME/datafile/','
/oracle/oradata_sidname/sidname','+DG_DATA/sidname/tempfile/','/oracle
/oradata_sidname/sidname' scope=spfile sid='*';

(4)将备库中恢复Standby Controlfile并alter database mount或open(备库)

(5)临时文件已恢复正常,应用SQL可在备库正常运行查询。

501-11