日志自动备份经验谈
数据库技术
前言:在网管系统中通常采用代理设备 (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用户不能执行定时任务,则需要完成相关设置。