日期:2014-05-16  浏览次数:20702 次

不同备份策略不兼容引起的磁盘空间故障解决实例


应用系统生命周期是一个整体,除了最开始的需求调研、开发测试和上线,更长的时期是在运维方面。应用系统的价值体现也就是在运维阶段,一个经常报错故障的系统运维环境,是很难获得良好的用户体验的。

在实践中,软件开发商和运维方面如果没有完善的沟通交流,新系统是不容易融入原有的运维体系中的,更有甚者会引起很多其他故障。本篇就介绍一个由于备份策略冲突引起的磁盘空间故障。



1、环境介绍和故障



笔者最近接收一个系统,上线运维一年余。交接时候,业务部门反映曾经出现磁盘空间占满故障。当时引起整个系统瘫痪,最后联系开发商介入才解决问题。但是当时反馈也没有彻底解决,只能定时找开发商进行处理。

由于资料信息渠道有限,笔者只能实地观察分析。数据库服务器版本为红帽Linux 6.2,数据库版本为11.2.0.3。



[root@DB ~]# cat /etc/RedHat-release

Red Hat Enterprise Linux Server release 6.1 (Santiago)



SQL> select * from v$version;



BANNER

---------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE    11.2.0.3.0      Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production



故障是从磁盘空间相关的,所以当前磁盘状态df如下。



[root@DB ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda3              59G  8.4G  48G  15% /

tmpfs                3.9G  288K  3.9G  1% /dev/shm

/dev/sda2            194M  41M  143M  23% /boot

/dev/sda1            200M  256K  200M  1% /boot/efi

/dev/sda8            1.4T  351G  976G  27% /data

/dev/sda4              59G  23G  34G  40% /home

/dev/sda5              59G  180M  56G  1% /tmp

/dev/sda6              59G  5.9G  50G  11% /var



系统空间分布比较典型,资源相对来说是比较富裕的。最大容量分区/data目录将近1.4T数据量,使用了351G。从oracle用户环境变量上,数据库软件是安装在/home文件夹下,而数据文件是在/data里面。



[oracle@DB]/home/oracle>env | grep ORA

ORACLE_BASE=/home/oracle/app

ORACLE_HOME=/home/oracle/app/product/11.2.0/db_1

ORACLE_OWNER=oracle

ORACLE_SID=db



业务系统数据shema数据量极小,只有77M。根据业务分析,系统的业务数据只保存在数据库中,而且没有删除的机制。这种情况下,由于业务数据突然膨胀引发的磁盘空间爆满的机率是很低的。

分析重点在于,/data中超过300G的空间消耗是如何出现的?



2、问题分析



进入/data目录,我们发现应用程序在这个目录中进行RMAN备份。



[root@DB rman]# pwd

/data/db/rman

[root@DB rman]# ls -l

total 1312

drwxr-xr-x. 2 oracle oinstall 409600 Mar  7 01:02 bak

-rw-r--r--. 1 oracle oinstall      0 Aug 21  2013 get

drwxr-xr-x. 2 oracle oinstall 921600 Mar  7 01:01 logs

-rwxr-x---. 1 oracle oinstall  1037 Jul  1  2013 rman_full.sh



显然,/data/db/rman目录是应用系统内部的备份机制。目前很多系统都有自带的数据库备份模块,从现在看,系统是计划使用RMAN程序进行备份。

目录中的rman_full.sh脚本是主要执行脚本。



[root@DB rman]# cat rman_full.sh

#!/bin/ksh

#set env

(篇幅原因,有省略……)

$BIN/rman log $BACKUP_LOG/$TARGET_SID.full.$DATE_3.log <<EOF

connect target /

run{

allocate channel c1 type disk ;

allocate channel c2 type disk ;

backup full database format '$BAC