現在維護的配置文件/表都是人手工備份,上次某機器宕機,想在別的機器上拉起應用,去找備份的時候,發現最近的備份還是去年的,因此有了這個想法寫這麼一個小工具才進行定期備份。其實細極思恐,每天備份一下還是很有必要的,出事了,也能找到是哪天開始的不是? 設計的思路還是先把哪些機器的文件、哪個資料庫的表需要備 ...
現在維護的配置文件/表都是人手工備份,上次某機器宕機,想在別的機器上拉起應用,去找備份的時候,發現最近的備份還是去年的,因此有了這個想法寫這麼一個小工具才進行定期備份。其實細極思恐,每天備份一下還是很有必要的,出事了,也能找到是哪天開始的不是?
設計的思路還是先把哪些機器的文件、哪個資料庫的表需要備份,放入資料庫中,然後弄一個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 先拷貝到別的目錄,再下載。不知道還有其他好辦法沒?
需要詳細腳本的可以留言獲取。