首页 > 代码库 > 配置文件和配置表定期备份小工具

配置文件和配置表定期备份小工具

 

 现在维护的配置文件/表都是人手工备份,上次某机器宕机,想在别的机器上拉起应用,去找备份的时候,发现最近的备份还是去年的,因此有了这个想法写这么一个小工具才进行定期备份。其实细极思恐,每天备份一下还是很有必要的,出事了,也能找到是哪天开始的不是?

 

设计的思路还是先把哪些机器的文件、哪个数据库的表需要备份,放入数据库中,然后弄一个shell,在某个机器上启动这个shell,使用ftp去备份配置文件,使用exp去dmp数据库文件,完成备份。

 

首先是数据库设计部分,需要两张表:

“机器表”:

create table MONI_SYS_MACHINE

(

  machine_id    NUMBER not null, 

  machine_type  CHAR(1),   

  machine_info  VARCHAR2(20),

  machine_name  VARCHAR2(20),

  machine_class VARCHAR2(10),

  shortname     VARCHAR2(10),

  username      VARCHAR2(20),

  userpasswd    VARCHAR2(100)

)

comment on column MONI_SYS_MACHINE.machine_id

  is ‘机器编号,‘;

comment on column MONI_SYS_MACHINE.machine_type

  is ‘机器类型,M代表主机 D代表数据库‘;

comment on column MONI_SYS_MACHINE.machine_info

  is ‘机器信息,填oracle ,AIX,linux等,便于将来shell等玩意儿扩展用‘;

comment on column MONI_SYS_MACHINE.machine_name

  is ‘机器名,对于主机,填写IP,对于数据库,填写TNS‘;

comment on column MONI_SYS_MACHINE.machine_class

  is ‘机器分类,用于批量执行脚本‘;

comment on column MONI_SYS_MACHINE.shortname

  is ‘机器别名,用于机器无密码登录‘;

comment on column MONI_SYS_MACHINE.username

  is ‘用户名‘;

comment on column MONI_SYS_MACHINE.userpasswd

  is ‘加密密码‘;

注:对于这个工具,机器分类,机器别名,机器信息无实际意义。

                       

 

 

备份配置表:

create table MONI_BACKINFO_CFG

(

  cfg_id       NUMBER not null,

  machine_id   NUMBER,

  backpath     VARCHAR2(1024),

  backcycle    NUMBER,

  lastbacktime DATE

)

comment on column MONI_BACKINFO_CFG.cfg_id

  is ‘配置ID‘;

comment on column MONI_BACKINFO_CFG.machine_id

  is ‘机器ID‘;

comment on column MONI_BACKINFO_CFG.backpath

  is ‘备份目录,对于主机,可以为备份目录名或者文件名,对于数据库,则为表名‘;

comment on column MONI_BACKINFO_CFG.backcycle

  is ‘备份周期,按天‘;

comment on column MONI_BACKINFO_CFG.lastbacktime

  is ‘最后备份日期‘;

 

 

SHELL部分:

1:从数据库中读取配置,读取的逻辑如下:

select a.cfg_id||‘##‘||trim(a.backpath)||‘##‘||trim(b.machine_name)||‘##‘||trim(b.username)||‘##‘||trim(b.userpasswd)||‘##‘||trim(b.machine_type)

from moni_backinfo_cfg  a , moni_sys_machine b  where a.machine_id = b.machine_id  and sysdate - nvl(a.lastbacktime,sysdate-1) >= a.backcycle 

获取数据后,用你的解密方法将密文密码解密。

 

2:对于主机文件目录/文件备份,我使用的是wget工具来进行的(还有其他的,看你自己的爱好和机器上装了什么了)。

wget ftp://${machine_name}/${backpath} --ftp-user=${username} --ftp-password=${userpasswd} -r -T 2 -t 1 -P ${thislocalpath}/data >>${WGETLOG} 2>&1

 

3:对于数据库,我这里只有oracle,就使用的是exp工具dump文件出来:

exp  ${username}/${userpasswd}@${machine_name} tables=${backpath} file=./${backpath}.dmp >>${DMPLOG} 2>&1

4:完成备份后,将备份压缩打包,移动进分日期的备份目录。

 

 

整体效果如下:

21_billxxx%cfg_bakfile.sh

20161222 备份开始

建立目录 /data05/cfg_bakfile/20161222

开始备份 172.20.31.98:/app/billxxx/template

开始打包 172.20.31.98:template

结束备份 172.20.31.98:/app/billxxx/template

开始备份 ACCTDB_JF_OLDCRM:moni_sys_machine

开始打包 ./moni_sys_machine.dmp.tar.gz

结束备份 ACCTDB_JF_OLDCRM:moni_sys_machine

20161222 备份结束

 

21_billxxx%pwd

/data05/cfg_bakfile/20161222/ACCTDB_JF_OLDCRM

21_billxxx%ls

moni_sys_machine.dmp.tar.gz

 

另外,需要说明的是wget这个工具,因为使用的其实是ftp,对已经上锁的文件没法下载(比如计费的xfer配置文件),遇到这种情况,我的办法是在主机上弄个crontab 先拷贝到别的目录,再下载。不知道还有其他好办法没?

 

需要详细脚本的可以留言获取。

配置文件和配置表定期备份小工具