Oracle数据库RMAN清理归档日志笔记
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 归档日志已满导致数据库挂起
当归档日志目录已满,数据库可能会挂起,无法处理新事务:
紧急处理步骤:
-
立即增加归档目标空间:
alter system set db_recovery_file_dest_size=50G; -- 根据实际情况调整大小sql -
如果空间无法立即扩展,可临时启用其他归档目标:
alter system set log_archive_dest_1='location=/new/path/archive';sql -
尽快执行归档日志清理:
rman target / DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';sql -
检查数据库状态:
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 自动化脚本故障排查
当自动化清理脚本失败时:
- 检查日志文件获取详细错误信息
- 验证环境变量设置是否正确
- 确认RMAN连接字符串和身份验证
- 检查定时任务服务是否正常运行
- 验证磁盘空间和文件权限
更多推荐

所有评论(0)