Oracle数据库归档日志日常管理与建议1.简介近日,项目组偶有发生归档日志占满归档目录空间导致数据库hang住(无响应),导致系统不能正常应用的情况。
针对此类问题,笔者从Oracle数据库归档模式、归档模式的优缺点、归档日志日常管理方法等各方面浅析并整理出归档日志日常管理与建议。
请各项目组依据实际情况,规范管理归档日志,排查相关隐患,以保证系统的正常高效运营。
另外,对于已开启数据库归档模式的项目组,若数据库管理权限不在我方,可将相关归档管理建议与当地运维部门充分沟通,避免归档的不当管理引起事故。
2.数据库归档模式与归档日志2.1数据库运行模式简介Oracle数据库包括归档模式与非归档模式两种运行模式。
一般情况下Oracle数据库的联机重做日志会记录对数据库所做的所有的修改,如创建对象;插入、删除、更新对象;删除对象等,这些操作都会记录在联机重做日志里。
Oracle 数据库至少要有2个联机重做日志组。
当一个联机重做日志组被写满(假设为1)的时候,就会发生日志切换,这时联机重做日志组2(假设为2)成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,这样反复进行。
如果数据库处于非归档模式,联机日志在切换时就会被丢弃。
而在归档模式下,当发生日志切换的时候,被切换的联机日志会被归档。
如当前在使用联机重做日志1,当1被写满时,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到一个指定的目录下。
这个目录为归档目录,这个过程称之为归档,拷贝的文件叫归档日志。
2.2归档模式优点与归档日志作用数据库运行在归档模式时,后台进程ARCH会将联机日志的内容拷贝到归档目录生成归档日志。
当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。
因此,开启归档模式及归档日志的益处与作用是非常明显的:1.可以进行完全、不完全恢复。
由于对数据库所做的全部改动都记录在日志文件中,如果发生硬盘故障等导致数据文件丢失的故障,则可以利用物理备份和归档日志完全恢复数据库,不会丢失任何数据。
2.可以进行联机热备。
所谓联机热备,就是在数据库运行状态下,对数据库进行备份,备份时用户对数据库的使用基本不受影响(不可避免的会对性能有负面影响)。
3.可以实施Data Guard。
可以部署1个或多个备用数据库,从而最大限度地提供灾难保护手段。
4.可以实施Stream。
利用Stream技术,可以实现单向复制、双向复制、多向复制及提供更加灵活的数据冗余方案。
5.表空间可以脱机并通过归档日志再成功使其联机。
可以备份部分数据库,如重要的表空间,并能在归档日志完整的情况下实现成功的联机。
6.能够轻松实现增量备份。
只需做一次完全备份,以后只备份发生改变的数据,可以提高备份速度。
2.3归档模式缺点数据库运行在归档模式时,后台进程ARCH会将联机日志的内容拷贝到归档目录生成归档日志。
这样的一个过程不仅可以使得归档模式具有以上优点,同样具有以下缺点:1.增加数据库服务器负载。
在拷贝联机日志的同时必然带来IO、磁盘空间等方面的压力。
2.增加系统维护难度。
增加了归档日志、归档目录等方面的管理与维护,以及系统hang住的隐患。
3.归档日志的连续性要求高。
归档日志的连续性是归档模式优点实现的前提,也就是说如果归档模式下只是简单定期删除归档日志将使得归档模式本身的优点无法发挥。
综上,当数据库运行为归档模式时,为确保归档模式的优点正常发挥对归档日志的妥善管理极为重要!3.管理归档日志由于归档日志具有生成速度较快且不可覆盖等特性,如果对归档日志的管理不妥当,很可能导致归档日志所在归档目录的磁盘无储存空间的情况,进而报ORA-00257错误。
一旦发生该错误,数据库将处于hang住状态,所有对数据库的变更操作都将陷于等待,最终导致应用将被异常停止!因此这类问题我们应该引起足够的重视!日常管理中应该:1.制定合理归档日志管理策略,以备份、归档、删除归档日志;2.定期(每天)监控系统的归档日志的生成量,并根据归档日志判定既有归档日志管理策略是否合理;3.定期(每天)监控归档目录所在磁盘的使用情况,并根据使用情况做出相应处理;4.掌握应急处理方法,即当快要发生或已经发生的故障的处理方法。
以下我们简单讨论以上几点:3.1制定合理的归档日志管理策略管理归档日志最重要的是制定合理的归档日志管理策略,并定期监控策略的有效性与合理性。
制定归档日志的管理策略一般需要注意以下几点:1.前期归档日志生成量及备份耗时的调研;2.合理确定归档目录的空间大小;3.合理制定数据库及归档日志的备份策略;4.后期观察归档日志生成量及备份耗时,并对现有管理策略提出相关建议。
由于各项目组归档日志生成量及备份耗时情况不尽相同,本文档提出一个归档日志管理策略供参考,具体请参见附录。
3.2监控归档日志日生成量根据相关sql语句查询出归档日志的日生成量,并根据日归档日志生成量对归档目录大小做出相应建议。
如遇归档日志生成量某天出现异常,请及时联系公司总部管理员获取技术协助。
sql语句及查询数据参考如下:SELECT TRUNC(FIRST_TIME) "日期",TRUNC(SUM(BLOCKS*BLOCK_SIZE)/1024/1024/1024,2) "大小(GB/DAY)"FROM V$ARCHIVED_LOGGROUP BY TRUNC(FIRST_TIME)ORDER BY 1 DESC;日期大小(GB/day)2011-08-17 4.792011-08-16 16.242011-08-15 19.482011-08-14 21.532011-08-13 22.602011-08-12 4.822011-08-11 11.392011-08-10 51.892011-08-09 19.442011-08-08 47.232011-08-07 5.74(说明:以上数据为某生产库查询结果,不同环境查询结果可能会相差较大,这与生产环境的业务量有较大关系)3.3监控归档目录所在磁盘的使用情况根据相关OS命令查询出归档目录所在磁盘的使用情况,并根据使用情况做出相应处理(建议:归档目录空间大小确保能存放一个备份周期的归档日志)。
相关命令参考如下:df –hl,显示格式为:文件系统容量已用可用已用% 挂载点/dev/hda5 487M 120M 342M 27% //dev/hda1 981M 21M 911M 3% /bootnone 125M 0 125M 0% /dev/shm/dev/hda2 29G 4.9G 23G 18% /home/dev/hda3 20G 4.8G 14G 27% /usr/dev/hda7 24G 510M 22G 3% /var/dev/hdb2 75G 75G 0 100% /(说明:以上数据为测试环境的查询结果,不同平台查询命令与显示结果不尽相同)。
3.4应急处理方法采用归档模式会爆发的问题种类较多,但最为常见的是归档目录空间不足。
这里简单介绍下如果发生归档目录空间不足的情况的应急处理方法(仅仅为应急处理方法,使用该方法处理过后,建议立即执行一次全库备份,以确保数据的安全)。
当发现归档目录磁盘空间不能再保存一天内的归档日志,或报错如下时:ORA-00257: archiver error. Connect internal only, until freed,即说明磁盘空间已严重不足。
可参考以下步骤处理:1.登录RMAN;[root@sha3 oracle]# rman target /Recovery Manager: Release 10.2.0.4.0 - Production on Tue Jan 20 01:41:26 2009Copyright (c) 1982, 2007, Oracle. All rights reserved.connected to target database: cwgkvpd (DBID=4147983671)2.归档日志交叉检查;RMAN> crosscheck archivelog all;3.备份后(直接物理备份即可),删除过期的归档或删除10天前的归档日志;RMAN> delete expired archivelog all;delete archivelog until time 'sysdate-10' ;4.观察磁盘空间使用率是否恢复正常;至此,如果归档日志所占的空间都已释放,则问题得以解决。
但因查明归档日志占满空间的原因,确定是否需要调整备份策略或者归档目录大小。
4.归档日志管理的相关建议1.制定合理备份策略;2.使用磁带库归档备份文件;3.使用VERITAS等第三方备份软件实现自动备份;4.定期(每天)监控系统的归档日志的生成量,并根据归档日志判定既有归档日志管理策略是否合理;5.定期(每天)监控归档目录所在磁盘的使用情况,并根据使用情况做出相应处理;6.制定应急策略。
附录:归档日志管理参考策略提供一套既有归档日志管理策略供参考(仅供参考, 摘录自《循序渐进 ORACLE》作者:盖国强):1.定时设置。
在Linux/UNIX下,通过crontab来制定定时任务,以下示例来自Linux生产环境:[oracle@localhost ~]$ crontab -l# start rman backup on 1:00 every day0 1 * * 0-6 /oracle/rman/start_rman.sh2.备份调度脚本。
本例通过start_rman.sh脚本进行调用执行,此脚本执行前先调用执行Oracle用户的环境变量,以获得执行环境:[oracle@localhost rman]$ cat start_rman.sh. /opt/oracle/.bash_profileSH_HOME=/oracle/rmanexport SH_HOMEDATE='date +"%Y%m%d"'week='date +"%w"'# confirm whether the oracle is runningps -ef|grep dbw0_$ORACLE_SID |grep -v grep >>/dev/null# begin to backupif [ $? -eq 0 ]; thenif [ $week = "0" ]||[ $week = "3"]; thenrman target / @$SH_HOME/fullback.sql log=$SH_HOME/logs/rmanfullback'date +"%Y%m%d"'.logelserman target / @$SH_HOME/archback.sql log=$SH_HOME/logs/rmanarchback'date +"%Y%m%d"'.logfifi备份在每周三和日执行全备份,其余每天执行归档日志的备份。