首页 > 代码库 > 配置文件和配置表定期备份小工具
配置文件和配置表定期备份小工具
现在维护的配置文件/表都是人手工备份,上次某机器宕机,想在别的机器上拉起应用,去找备份的时候,发现最近的备份还是去年的,因此有了这个想法写这么一个小工具才进行定期备份。其实细极思恐,每天备份一下还是很有必要的,出事了,也能找到是哪天开始的不是?
设计的思路还是先把哪些机器的文件、哪个数据库的表需要备份,放入数据库中,然后弄一个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 先拷贝到别的目录,再下载。不知道还有其他好办法没?
需要详细脚本的可以留言获取。
配置文件和配置表定期备份小工具