一、背景
由于近期在做应用升级和系统改造,导致几天没怎么观察DG库的状态。这几天归档日志暴涨导致磁盘空间用尽,从库无法接收主库的归档日志,且从库无法工作。经过检查,发现从库所需要的日志在主库均存在。所以当前文档使用归档日志的方式进行恢复
二、DG从库基于归档日志恢复
1、临时手动删除
- 手动删除无用文件、超过保留期限且占用空间大的备份文件、归档日志、数据库日志、审计日志等。
2、从库取消日志同步
SQL>alter database recover managed standby database cancel;
3、查询未同步的日志
# 主库查询归档日志序号
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/oracle/archive
Oldest online log sequence 115312
Next log sequence to archive 115314
Current log sequence 115314# 从库查询归档日志应用情况
SQL>select SEQUENCE#,FIRST_TIME,NEXT_TIME ,APPLIED from v$archived_log order by 1;SEQUENCE# FIRST_TIME NEXT_TIME APPLIED
---------- ------------ ------------ ---------115211 27-MAR-25 27-MAR-25 YES115212 27-MAR-25 27-MAR-25 YES115213 27-MAR-25 27-MAR-25 NO# 从库检查归档日志物理存储
注意:此处可以根据归档日志产生时间以及编号,来交叉验证缺少的归档日志
$ cd /data/oracle/archive
4、主库查询
注意:此处需要校验从库缺少的归档日志是否存在。如果存在则可以使用归档进行直接恢复。如果不存在则需要考虑使用其它方法恢复。但是当前文档是基于归档日志进行恢复的。
- 基于SCN增量备份进行恢复
- 使用完全备份直接恢复
注意:此处可以根据归档日志产生时间以及编号,来确认从库缺少的归档日志是否存在,
$ cd /data/oracle/archive# 经检查,从库缺失的归档日志在主库还存在
5、从库查看归档日志
注意:这里查看归档日志的目的,是看从库从哪个归档日志断开的,最后应用的归档日志可能未完全应用。
经确认从库 115213 号归档日志仅应用了一半,所以此处先移动该日志到其它路径下,主库发送完整日志到该路径下 ,同时更改权限
6、从库重启日志同步
注意:由于10G DG在自动断开同步的情况下,重启MRP进程后,需要在主库执行从库归档路径参数关闭再开启
# 主库发送归档日志到从库
$ scp 115213.arc [从库IP]:/data/oracle/archive# 从库更改权限
$ chown oracle:dba 115213.arc# 从库重启MRP进程
SQL>alter database recover managed standby database using current logfile disconnect from session;
7、主库执行参数更改
注意:此处需要查看主库指定的从库归档参数是哪个,才能准确重启归档参数
# 主库中指定的从库归档参数
log_archive_dest_2='SERVICE=ORCL LGWR ASYNC VALID_FOR=(all_logfiles,all_roles) DB_UNIQUE_NAME=DGS'# 根据指定参数重启开关
SQL>alter system set log_archive_dest_state_2=defer;
SQL>alter system set log_archive_dest_state_2=enable;
8、查看归档应用
注意:此处明确看到正在恢复,所以只需要等待恢复完成即可
$ tail -f alert_ORCL.log2025-03-27T11:28:47.526421+08:00
PR00 (PID:2359): Media Recovery Log /data/oracle/archive/oatest_1_115213_1056118119.arc
PR00 (PID:2359): Media Recovery Waiting for T-1.S-115213 (in transit)
2025-03-27T11:29:22.175855+08:00rfs (PID:31442): Opened log for T-1.S-115214 dbid 1148449189 branch 1056118119
三、永久解决磁盘爆满的方案
上述临时解决磁盘空间爆满的方式,显然这不是我们DBA的风格,DBA的风格都是追求自动化,所有的一切只需要经过简单的手动处理就可以达到一劳永逸
1、定期自动化删除
- 创建删除脚本
- 加入crontab,实现定期自动化执行
定期自动化的操作流程
1、创建删除脚本
注意:此处根据归档保留策略而定即可。如果确定可以删除,那么可直接删除保留策略前的日志。或者将这部分日志移动、发送到其它路径或者服务器保存。
#!/bin/bash
#############################################################################
#
#Author:Albert
#Date:27-Mar-25
#
# Main purpose:This script is used to delete expired files.
#
#
#############################################################################
# Parameter
logpath="/data/scripts/scripts_db"
CURTIME=`date +%Y%m%d%H%M%S`
delF_log="$logpath/del_file_list_30.log"export week=`date +%w`if [ ! -f $delF_log ]; then
touch $delF_log
chmod 777 $delF_log
else
rm -rf $delF_log
touch $delF_log
chmod 777 $delF_log
fi#if [ $week -ne 0 ] ; then
# echo "Today cannot Sunday:$week" >> $delF_log
# exit 0
#fipad=$(printf '%0.1s' "-"{1..60})folList[0]="[需要删除的文件的路径]"echo "Delete 30 days before file " >> $delF_log
echo "Perform Date :"$CURTIME >> $delF_log
echo "$pad" >>$delF_log
for i in ${folList[@]}
do
echo "Location is : $i " >>$delF_log
find $i -type d -mtime +30 >> $delF_log
find $i -type f -mtime +30 >> $delF_log
find $i -type f -mtime +30 -exec rm -rf {} \;
done
echo "$pad" >>$delF_log
echo "Complete Time :"$CURTIME >> $delF_log
2、加入定时计划
[oracle@hekdwdg ~]$ crontab -e
00 22 * * * sh /data/scripts/del_file_list_30.sh# 重启定时任务即可
[oracle@hekdwdg ~]$service crond restart
3、一劳永逸
实现自动化检查、删除,就可以释放双手了。去干想干的事情。