Oracle 10G DG 修复从库-磁盘空间爆满导致从库无法工作

一、背景

由于近期在做应用升级和系统改造,导致几天没怎么观察DG库的状态。这几天归档日志暴涨导致磁盘空间用尽,从库无法接收主库的归档日志,且从库无法工作。经过检查,发现从库所需要的日志在主库均存在。所以当前文档使用归档日志的方式进行恢复

二、DG从库基于归档日志恢复

1、临时手动删除

  • 手动删除无用文件、超过保留期限且占用空间大的备份文件、归档日志、数据库日志、审计日志等。

2、从库取消日志同步

sql 复制代码
 SQL>alter database recover managed standby database cancel;

3、查询未同步的日志

bash 复制代码
# 主库查询归档日志序号
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    YES
    115212 27-MAR-25    27-MAR-25    YES
    115213 27-MAR-25    27-MAR-25    NO
    
# 从库检查归档日志物理存储
注意:此处可以根据归档日志产生时间以及编号,来交叉验证缺少的归档日志
$ cd /data/oracle/archive

4、主库查询

注意:此处需要校验从库缺少的归档日志是否存在。如果存在则可以使用归档进行直接恢复。如果不存在则需要考虑使用其它方法恢复。但是当前文档是基于归档日志进行恢复的。

  • 基于SCN增量备份进行恢复
  • 使用完全备份直接恢复
bash 复制代码
注意:此处可以根据归档日志产生时间以及编号,来确认从库缺少的归档日志是否存在,
$ cd /data/oracle/archive

# 经检查,从库缺失的归档日志在主库还存在

5、从库查看归档日志

注意:这里查看归档日志的目的,是看从库从哪个归档日志断开的,最后应用的归档日志可能未完全应用。

经确认从库 115213 号归档日志仅应用了一半,所以此处先移动该日志到其它路径下,主库发送完整日志到该路径下 ,同时更改权限

6、从库重启日志同步

注意:由于10G DG在自动断开同步的情况下,重启MRP进程后,需要在主库执行从库归档路径参数关闭再开启

bash 复制代码
# 主库发送归档日志到从库
$ 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、主库执行参数更改

注意:此处需要查看主库指定的从库归档参数是哪个,才能准确重启归档参数

bash 复制代码
# 主库中指定的从库归档参数
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、查看归档应用

注意:此处明确看到正在恢复,所以只需要等待恢复完成即可

bash 复制代码
$ tail -f alert_ORCL.log

2025-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:00
 rfs (PID:31442): Opened log for T-1.S-115214 dbid 1148449189 branch 1056118119

三、永久解决磁盘爆满的方案

上述临时解决磁盘空间爆满的方式,显然这不是我们DBA的风格,DBA的风格都是追求自动化,所有的一切只需要经过简单的手动处理就可以达到一劳永逸

1、定期自动化删除

  • 创建删除脚本
  • 加入crontab,实现定期自动化执行

定期自动化的操作流程

1、创建删除脚本

注意:此处根据归档保留策略而定即可。如果确定可以删除,那么可直接删除保留策略前的日志。或者将这部分日志移动、发送到其它路径或者服务器保存。

bash 复制代码
#!/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
#fi

pad=$(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、加入定时计划

bash 复制代码
[oracle@hekdwdg ~]$ crontab -e
00 22 * * * sh /data/scripts/del_file_list_30.sh

# 重启定时任务即可
[oracle@hekdwdg ~]$service crond restart

3、一劳永逸

实现自动化检查、删除,就可以释放双手了。去干想干的事情。

相关推荐
我有医保我先冲3 小时前
SQL复杂查询与性能优化:医药行业ERP系统实战指南
数据库·sql·性能优化
阳光_你好4 小时前
详细说明Qt 中共享内存方法: QSharedMemory 对象
开发语言·数据库·qt
喝醉酒的小白5 小时前
MySQL响应慢是否由堵塞或死锁引起?
数据库
Pasregret5 小时前
04-深入解析 Spring 事务管理原理及源码
java·数据库·后端·spring·oracle
jnrjian5 小时前
归档重做日志archived log (明显) 比redo log重做日志文件小
数据库·oracle
TDengine (老段)5 小时前
TDengine 中的命名与边界
大数据·数据库·物联网·oracle·时序数据库·tdengine·iotdb
谁家有个大人6 小时前
MYSQL中对行与列的操作
数据库·mysql
0000ysl6 小时前
数据库基础-函数&约束
数据库
JavaPub-rodert7 小时前
Etcd用的是Raft算法
数据库·github·etcd·raft
编程乐趣7 小时前
FlexLabs.Upsert:EF Core插件推荐,支持多数据库的Upsert功能
数据库