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、一劳永逸

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

相关推荐
likangbinlxa5 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k32 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn3 小时前
【Redis】渐进式遍历
数据库·redis·缓存