一、背景
由于近期在做應用升級和系統改造,導致幾天沒怎么觀察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、一勞永逸
實現自動化檢查、刪除,就可以釋放雙手了。去干想干的事情。