日志自动备份经验谈

数据库技术

前言:在网管系统中通常采用代理设备 (Agent)采集被管理对象数据。随着时间的推移,将会存在日志文件占满磁盘空间的问题,因此需要定时对日志进行备份、删除,避免由于磁盘空间不够引起系统出现问题。如果由维护人员手工来完成这样的操作,不但增加了工作量,而且也可能由于操作失误造成不可挽回的损失。因此笔者结合自己的经验在本文中给出一种利用UNIX系统实现日志自动备份的方法。读者可以参照这个例子,再结合自己系统的实际情况稍作修改就可加以应用。

Agent: 网络管理代理。它是驻留在网络设备中的软件模块,这里的设备可以是UNIX工作站、网络打印机,也可以是其它的网络设备。管理代理软件可以获得本地设备的运转状态、设备特性、系统配置等相关信息。

备份前的系统状况

在谈到具体的备份前,首先需要了解系统的状况,我们才好根据现场具体情况进行备份策略的探讨。系统的具体情况如下:

1.Agent安装的操作系统为UNIX系统,比如UNIXWARE。

2.日志文件存放在各个代理设备用户目录下的$HOME/data/orig里面,日志文件命名符合如下规律:

*YYYYMMDD*

其中:

YYYY表示四位的年,MM表示两位的月份,DD表示两位的日期。

例如:20041105

3.代理设备主机名有如下规则:

agent01、agent02、agent03、agent04……

4.需要在某个指定代理设备(如agent11)上进行所有代理设备的日志备份。

5.在某台设备上(如manager01)安装有磁带机,已建立/backup目录。

6.所有代理设备的登录用户名为agent,用户目录为/home/agent。

7.日志备份策略为:日志保存周期为6个月。

备份实现步骤

1.创建月份生成源码GetFormerOne Month.c和GetFormerSixMonth.c,其中GetFormerOneMonth.c完成输出上一个月月份的日志,GetFormerSixMonth.c完成输出前六个月月份的日志。比如当前月为200411,则GetFormerOneMonth.c输出月份是200410,GetFormerSixMonth.c输出月份是200404。

其中GetFormerOneMonth.c代码如下:

#include

#include

#include

#include

#include

#include

#include

void main()

{

struct tm *PresentTime;

long Present_lTime;

char DateString[128];

memset(DateString,0,sizeof(DateString));

Present_lTime = time(NULL)-3600*24*30*1;

PresentTime = localtime(&Present_lTime);

sprintf(DateString,"%04d%02d",1900+PresentTime->tm_year,PresentTime->tm_mon+1);

printf("%s",DateString);

exit(0);

}

GetFormerSixMonth.c代码如下:

#include

#include

#include

#include

#include

#include

#include

void main()

{

struct tm *PresentTime;

long Present_lTime;

char DateString[128];

memset(DateString,0,sizeof(DateString));

Present_lTime = time(NULL)-3600*24*30*6;

PresentTime = localtime(&Present_l Time);

sprintf(DateString,"%04d%02d",1900+PresentTime->tm_year,PresentTime->tm_mon+1);

printf("%s",DateString);

exit(0);

}

2.将上面两个C源码分别用标准C进行编译得到可执行文件GetFormerOne Month和GetFormerSixMonth。

3.采用vi编辑器创建脚本文件backup,内容如下:

#!/usr/bin/ksh

clear

echo "\n\n\n\n"

# 根据参数确定文件存放路径的取值,如果无路径参数则要求输入,否则直接将

# 路径参数传给变量

if [ $# = 0 ]

then

echo " 请指定备份文件存放路径::"

read FilePath

echo $FilePath

else

FilePath=$1

fi

# 获得当前月的前一个月的信息,如当前月为10月,则OneMonthDATESTRING

# 的值应该为09

OneMonthDATESTRING=`./GetFormer

OneMonth`

# 获得当前月的前六个月的信息,如当前月为10月,则OneMonthDATESTRING

# 的值应该为04

SixMonthDATESTRING=`./GetFormerSi

xMonth`

echo "正在备份代理设备agent01上的日志..... "

if [ -r "./ComFile" ]

then

rm ./ComFile

fi

# 生成命令文件,根据代理设备名称,打包的文件名为agentXX_YYYYMM

echo "tar cvf $HOME/data/agent01_$OneMonthDATESTRING.tar $HOME/data/orig/*$OneMonthDATESTRING*\n" > ./ComFile

chmod 777 ./ComFile

# 将命令文件传到相应代理设备上

rcp ./ComFile agent@agent01:/home/agent/data

# 远程改变命令文件的权限设置

rsh -l agent agent01 chmod 777 /home/agent/data/ComFile

# 远程执行命令文件

rsh -l agent agent01 $HOME/data/ComFile

# 将代理设备上打包好的tar文件传到本机上

rcp agent@agent01:$HOME/data/agent

01_$OneMonthDATESTRING.tar $FilePath

# 删除代理设备上的tar文件

rsh -l agent agent01 rm $HOME/data/AGENT01_$OneMonthDATESTRING.tar

# 删除代理设备上的命令文件

rsh -l agent agent01 rm $HOME/data/ComFile

# 删除原始日志目录下的前六个月的文件

rsh -l agent agent01 rm $HOME/data/orig/*$SixMonthDATESTRING*

……

(根据实际情况添加agent02、agent03……等代理设备日志备份脚本内容)

echo "正在将日志备份到远程磁带机上…"

# 将各代理设备传过来的tar文件传到远程磁带机主机上

rcp $FilePath/*.tar agent@managet:/backup

if [ -r "./backuptocd" ]

then

rm ./backuptocd

fi

# 生成将tar文件备份到磁带机主机上的命令文件

echo "cd /backup" > ./backuptocd

echo "tar rvf /dev/rmt/0m *.tar" >> ./backuptocd

# 将命令文件传到磁带机主机上

rcp ./backuptocd agent@manger01:/backup

# 更改命令文件权限

rsh -l agent manager01 chmod 777 /backup/backuptocd

# 远程执行命令文件

rsh -l agent manager01 /backup/backu

ptocd

# 远程删除磁带机主机的tar文件

rsh -l agent manager01 rm /backup/*.tar

# 删除远程磁带机主机上命令文件

rsh -l agent manager01 rm /backup/backuptocd

4.以agent用户在代理设备agent11上建立日志备份文件目录logBackup;

5.将可执行文件GetFormerOneMonth、GetFormerSixMonth和脚本backup传到代理设备agent11上$HOME/logBackup目录下,并修改他们的权限。

$chmod 700 $HOME/logBackup/GetFo

rmerOneMonth

$chmod 700 $HOME/logBackup/GetFo

rmerSixMonth

$chmod 700 $HOME/logBackup/backup

6.将代理设备agent11与其它需要备份日志的代理设备建立友好用户。

(1)检查友好用户方法(UNIXWARE)

$rlogin –l agent 代理设备主机名

如果提示输入密码,则不是友好用户关系。

(2) 添加友好用户(UNIXWARE)

以agent用户的身份登录代理设备agentXX

用vi编辑器对友好用户文件.rhosts文件进行编辑

$vi .rhosts

在.rhosts 文件中加入代理设备agent11的主机名和用户,输入格式为:

agent11 agent

保存退出。

7.设置定时。

Cron是一个永久进程,它检查/var/spool/cron/crontabs/目录中的文件,找到所要执行的任务和执行任务的时间。

Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、 command)组成,域之间用空格或Tab分开,其中:

说明:

1.如果一个域是*,表明命令可以在该域所有可能的取值范围内执行。

2.如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字本身)。

3.如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。

4.如果日期域和星期域都有值,则这两个域都有效。

以用户agent登录代理设备agent11,建立定时文件crontabfile,并在文件中添加如下内容:

30 3 10 * * csh -c "/home/agent/log

Backup/backup

/home/agent/logBackup >>& /home/ag

ent/logBackup /log"

然后启动定时:

$crontab crontabfile

注意事项

要顺利地完成好备份的工作,我们在操作前后还有一些重要的事项要特别加以注意。

1.如果指定的存放路径不存在,系统将默认为远程拷贝的文件,将造成文件互相覆盖。

2.如果agent用户已经设置了其它定时,则需要在已经使用的定时文件后面进行追加。查看方法如下:

$crontab –l

3.维护人员每月九号将磁带机更换好,并做好标记,10号查看日志文件或磁带内容确定是否远程完全备份成功,如果成功则删除代理设备agent11上的tar文件,否则手工执行一次,再删除tar文件。

4.确保磁带容量足够。

5.如果agent用户不能执行定时任务,则需要完成相关设置。