Oracle数据库RMAN清理归档日志笔记

1 归档日志清理的必要性

当Oracle数据库运行在归档模式(ARCHIVELOG)下时,重做日志文件在切换后会被归档保存为归档日志。这些归档日志对于数据库的恢复操作至关重要,可以实现基于时间点的恢复并保障数据安全。然而,如果不加管理,归档日志会持续积累,最终导致存储空间耗尽,引发数据库挂起或无法正常运作的严重问题。

定期清理归档日志成为Oracle数据库管理的一项关键任务。使用Oracle的恢复管理器(RMAN)工具可以安全、有效地完成这项任务,因为它不仅删除物理文件,还会同步更新控制文件中的相关信息,避免因记录不一致导致的问题。

2 清理前的准备工作

在开始清理归档日志之前,进行必要的检查以确保操作的安全性和准确性至关重要。

2.1 检查归档日志状态

首先需要确认数据库是否处于归档模式,并了解归档日志的当前状态:

-- 连接数据库
sqlplus / as sysdba

-- 检查数据库归档模式
archive log list;

-- 查看归档日志列表
SELECT name, sequence#, thread#, completion_time, applied
FROM v$archived_log
ORDER BY completion_time DESC;

-- 使用RMAN检查归档日志
RMAN> list archivelog all;
sql

2.2 确认归档日志存储路径和空间使用

确定归档日志的存储位置和空间占用情况:

-- 查看归档日志目标参数
show parameter db_recovery_file_dest;
show parameter log_archive_dest;

-- 检查归档日志目录大小
-- Linux/Unix环境下
df -h /u01/app/oracle/fast_recovery_area/

-- 查看目录内归档日志文件详情
ls -lh /u01/app/oracle/fast_recovery_area/<ORACLE_SID>/archivelog/
sql

下表总结了清理前需要确认的关键信息:

检查项目 命令/方法 说明
归档模式 archive log list 确认数据库处于归档模式
归档路径 show parameter db_recovery_file_dest 确定归档日志存储位置
空间使用 df -h或文件管理器 检查磁盘空间情况
日志列表 list archivelog all 查看所有归档日志详细信息
最近日志 SELECT * FROM v$archived_log; 确认最近可用的归档日志

3 手动清理归档日志步骤

以下是使用RMAN手动清理归档日志的标准流程,适用于临时需要释放空间或维护的情况。

3.1 连接到RMAN

# 切换到oracle用户
su - oracle

# 启动RMAN并连接目标数据库
rman target /

# 或者使用sysdba用户连接
rman target sys/<password>@<service_name>
bash

3.2 执行交叉检查(Crosscheck)

交叉检查是重要的一步,它将RMAN资料库中记录的归档日志信息与实际物理文件进行比对,标记出那些记录中存在但物理上已经不存在的归档日志为"EXPIRED"状态。

RMAN> crosscheck archivelog all;
sql

执行后,RMAN会报告每个归档日志文件的验证结果,状态可能是"AVAILABLE"(可用)或"EXPIRED"(已过期)。

3.3 删除过期日志

删除那些已被标记为"EXPIRED"状态的归档日志:

RMAN> delete expired archivelog all;
sql

此命令仅删除RMAN中标记为过期的归档日志记录,不会影响可用的归档日志。

3.4 按时间条件清理归档日志

根据时间条件删除旧的归档日志是最常用的方法:

-- 删除7天前已备份的归档日志
RMAN> delete noprompt archivelog all completed before 'sysdate-7';

-- 删除所有3天前的归档日志(无论是否备份)
RMAN> delete noprompt archivelog until time 'sysdate-3';
sql

注意noprompt选项表示无需确认直接执行删除,在脚本中使用此选项可实现自动化。如果省略,RMAN会提示确认删除操作。

3.5 验证清理结果

清理完成后,验证操作结果:

-- 再次检查归档日志
RMAN> list archivelog all;

-- 检查过期日志是否已清理
RMAN> list expired archivelog all;

-- 交叉检查确认
RMAN> crosscheck archivelog all;
sql

4 自动清理方案与脚本配置

对于生产环境,配置自动化的归档日志清理任务是必要的,可以防止因疏忽导致的存储空间问题。

4.1 Linux/Unix Shell自动清理脚本

以下是一个功能完善的自动清理脚本示例:

#!/bin/bash
# archivelog_clear.sh - Oracle归档日志自动清理脚本

# 设置环境变量
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# 脚本变量设置
BACK_DIR=/home/oracle/clear_archlog/data
export DATE=`date +%F`
mkdir -p $BACK_DIR/$DATE
LOG_FILE=$BACK_DIR/$DATE/rman_backup.log

# 记录开始时间
echo "--------------------------------`date`-------------------------------" >> $LOG_FILE

# 执行RMAN清理
rman target / >> $LOG_FILE <<EOF
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate-7';
exit
EOF

# 记录结束时间
echo "------------------------------ FINISHED ----------------------------" >> $LOG_FILE
bash

授予脚本执行权限并测试:

chmod +x archivelog_clear.sh
./archivelog_clear.sh
bash

4.2 Windows批处理自动清理脚本

对于Windows环境,可以使用类似的批处理脚本:

@echo off
REM del_archive.bat - Windows下归档日志清理脚本

set ORACLE_SID=ORCL
set BACKUPDATE=%date:~0,4%-%date:~5,2%-%date:~8,2%
set LOG_DIR=C:\oracle\scripts\log
set LOG_NAME=%LOG_DIR%\del_archive_%BACKUPDATE%.log

(
echo ====================cleaning  %date% %time%  =========================
rman target / cmdfile=C:\oracle\scripts\del_archive.sql
echo =====================  finish %date% %time%  =========================
)>>%LOG_NAME%
batch

对应的RMAN命令文件del_archive.sql

crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate-7';
exit;
sql

4.3 配置定时任务

配置操作系统级的定时任务,实现定期自动执行清理:

Linux/Unix环境下

# 编辑oracle用户的crontab
crontab -e

# 添加以下行,表示每天凌晨1点执行清理脚本
0 1 * * * /home/oracle/scripts/archivelog_clear.sh

# 查看当前定时任务
crontab -l
bash

Windows环境下

使用任务计划程序(Task Scheduler)创建一个定期执行del_archive.bat的任务。

5 注意事项与最佳实践

清理归档日志时需要注意以下关键点,以避免意外数据丢失或数据库问题:

5.1 清理策略制定

  • 保留期限:根据业务需求和恢复要求确定合理的归档日志保留时间,通常为3-7天
  • 备份验证:确保在删除归档日志之前,相应的RMAN备份已经完成且验证成功。
  • 监控机制:设置定期监控,确保自动清理任务正常运行。

5.2 关键注意事项

下表总结了清理归档日志时的重要注意事项:

注意事项 说明 推荐做法
备份保护 确保归档日志在删除前已备份 使用completed before条件只删除已备份的日志
空间预留 不要清理所有归档日志 至少保留最近1-2天的日志用于紧急恢复
恢复要求 考虑数据恢复和审计需求 根据SLA确定保留策略,必要时长期存档重要时段日志
参数调整 调整归档日志空间限制 适当设置db_recovery_file_dest_size
监控验证 定期检查清理日志 通过RMAN或操作系统验证清理结果

6 故障处理与常见问题

6.1 归档日志已满导致数据库挂起

当归档日志目录已满,数据库可能会挂起,无法处理新事务:

紧急处理步骤

  1. 立即增加归档目标空间:

    alter system set db_recovery_file_dest_size=50G; -- 根据实际情况调整大小
    sql
  2. 如果空间无法立即扩展,可临时启用其他归档目标:

    alter system set log_archive_dest_1='location=/new/path/archive';
    sql
  3. 尽快执行归档日志清理:

    rman target /
    DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
    sql
  4. 检查数据库状态:

    archive log list;
    select * from v$recovery_file_dest;
    sql

6.2 归档日志验证失败

如果交叉检查发现大量"EXPIRED"状态的归档日志:

-- 重新检查归档日志
RMAN> crosscheck archivelog all;

-- 删除所有过期日志
RMAN> delete expired archivelog all;

-- 如果问题持续,检查归档日志目录权限和路径
sql

6.3 自动化脚本故障排查

当自动化清理脚本失败时:

  1. 检查日志文件获取详细错误信息
  2. 验证环境变量设置是否正确
  3. 确认RMAN连接字符串和身份验证
  4. 检查定时任务服务是否正常运行
  5. 验证磁盘空间和文件权限
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐