新增数据文件导致dataguard同步异常
前天一朋友发来一问题,一台服务器的归档目录快满了,不清楚是否可以清理掉,因为它是一台备机。这里记录一下当时指导他的处理过程:
确定主备关系
经了解,这是一套physical standby结构的dataguard。通常情况下,物理standby需要两边节点的物理结构也相同,否则需要通过参数db_file_name_convert、log_file_name_convert明确指定。
日志应用情况
要确定是否可以清除那些归档,需要查看,传递到备库的这些日志是否完全应用了。让他查询之后,结构如下,显然是没有应用完的。
为什么没有应用
竟然堆积了两百多个归档没有apply,那么想必是出现了什么异常,遗憾的是他并没有在alert日志找到相关的信息。(我觉得肯定会报出来,他没有找到而已)
看看dataguard相关的进程情况:
select process,status,client_process,sequence# from v$managed_standby;
正常情况下应该有MRP0进程处于WAIT_FOR_LOG状态或WRITING状态。但实际没有。
那么只能再应用一遍,看看报什么错吧。
alter database recover managed standby database disconnect from session;
立马报错了:
看样子是主库那边新增了数据文件,但是备端同步应用的时候发现无法新增,然后自动生成了一个文件名并放到默认的dbs路径下。这也就是导致日志无法应用的原因了。导致归档日志不断堆积。
看看主备库上的24号文件
主库:
备库:
从这里看,因为主备使用了裸设备,所以在主库新增数据文件的时候,备库无法正常创建。如果使用的filesystem或者asm存储,那么可以避免该问题的发生。
恢复过程
参照主库端的24号文件对应的裸设备大小在备端创建相同的裸设备文件。
mklv -y ora_users01 -t raw -ex -TO -w n -s n -r n datavg 10000m
chown oracle:oinstall /dev/rora_users01
修改参数standby_file_management
将standby_file_management设为手动模式
alter system set standby_file_management='MANUAL' scope=both;
--重新创建24号文件
alter database create datafile '/oracle/app/product/10g/db_1/dbs/UNNAMED00024' as '/dev/rora_users01';
再次应用归档
alter database recover managed standby database disconnect from session;
随着归档日志的apply,24号文件状态将从RECOVER变为ONLINE。
归档日志已恢复正常应用。
未应用的日志越来越少。
当日志完全应用完毕后,即可清理这些归档以便回收空间。