<b>2.6.1 備份類腳本</b>
俗話說得好,備份是救命的稻草。特别是重要的資料和代碼,這些都是公司的重要資産,是以備份是必須的。備份能在我們不慎執行了一些毀滅性的工作之後(比如不小心删除了資料),進行恢複工作。許多有實力的公司在國内好幾個地方都設有災備機房,而且用的都是價格不菲的emc高端存儲。可能會有朋友要問:如果我們沒有存儲怎麼辦?這點可以參考一下筆者公司的備份政策,即:在執行本地備份的同時,讓shell腳本自動上傳資料到另一台ftp備份伺服器中,這種異地備份政策成本比較小,無須存儲,而且安全系統高,相當于雙備份,本地和異地同時出現資料損壞的機率幾乎是不可能的。
此雙備份政策的具體步驟如下。
首先,做好準備工作。先安裝一台centos 6.4 x86_64的備份伺服器,并安裝vsftpd服務,稍微改動一下配置後啟動。另外,關于vsftpd的備份目錄,可以選擇做raid1或raid5的分區或存儲。
vsftpd服務的安裝如下,centos 6.4 x86_64下自帶的yum極為友善。
yum -y install
vsftpd
service vsftpd
start
chkconfig vsftpd
on
vsftpd的配置比較簡單,詳細文法略過,這裡隻給出配置檔案,可以通過組合使用如下指令直接得出vsftpd.conf中有效的檔案内容:
grep -v
"^#" /etc/vsftpd/vsftpd.conf | grep -v '^$'
local_enable=yes
write_enable=yes
local_umask=022
dirmessage_enable=yes
xferlog_enable=yes
connect_from_port_20=yes
xferlog_std_format=yes
listen=yes
chroot_local_user=yes
pam_service_name=vsftpd
userlist_enable=yes
tcp_wrappers=yes
chroot_local_user=yes這條語句需要重點強調一下。它的作用是對使用者登入權限進行限制,即所有本地使用者登入vsftpd伺服器時隻能在自己的家目錄下,這是基于安全的考慮,筆者在編寫腳本的過程中也考慮到了這點,如果大家要移植此腳本到自己的工作環境中,不要忘了這條語句,不然的話異地備份極有可能會失效。
另外,我們在備份伺服器上應該建立備份使用者,例如svn,并為其配置設定密碼,還應該将其家目錄更改為備份目錄,即/data/backup/svn-bakcup,這樣的話更友善備份工作,以下備份腳本依此類推。
1.版本控制軟體svn代碼庫的備份腳本
版本控制軟體svn的重要性在這裡就不再多說了,現在很多公司基本還是利用svn作為送出代碼集中管理的工具,是以做好其備份工作的重要性就不言而喻了。這裡的輪詢周期為30天一次,shell會自動删除30天以前的檔案。在vsftpd伺服器上建立相應的備份使用者svn的腳本内容如下(此腳本在centos
5.8 x86_64下已測試通過):
#!/bin/sh
svndir=/data/svn
svnadmin=/usr/bin/svnadmin
date=`date +%y-%m-%d`
olddate=`date
+%y-%m-%d -d '30 days'`
backdir=/data/backup/svn-backup
[ -d ${backdir}
] || mkdir -p ${backdir}
logfile=${backdir}/svnbak.log
[ -f ${logfile}
] || touch ${logfile}
mkdir
${backdir}/${date}
for project in
myproject official analysis mypharma
do
cd $svndir
$svnadmin hotcopy $project $backdir/$date/$project --clean-logs
cd $backdir/$date
tar zcvf ${project}_svn_${date}.tar.gz
$project > /dev/null
rm -rf $project
sleep 2
done
host=192.168.2.112
ftp_username=svn
ftp_password=svn101
cd
ftp -i -n -v
<< !
open ${host}
user
${ftp_username} ${ftp_password}
bin
cd ${olddate}
mdelete *
cd ..
rmdir ${olddate}
mkdir ${date}
cd ${date}
mput *
bye
!
2. mysql從資料庫備份腳本
主mysql腳本跟其比較類似,主要是用mysql自帶的指令mysqldump 進行備份的。這裡要說明的是,本地的輪詢周期為20天,vsftpd的輪詢周期為60天,備份後就算是用gzip壓縮,mysql的資料庫還是很大,大家可以根據實際需求來更改這個時間,注意不要讓資料庫撐爆你的備份伺服器。由于是内部開發環境,密碼設定得比較簡單,如果要将其移植到自己的公網伺服器上,就要在安全方面多注意一下了。另外附帶說明的是,--opt隻是一個快捷選項,等同于同時添加
--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓mysqldump很快地導出資料,并且導出的資料可以很快被導回。該選項預設是開啟的,可以用--skip-opt将其禁用。注意,如果運作mysqldump沒有指定 --quick 或 --opt 選項,則會将整個結果集放在記憶體中。如果導出的是大資料庫則可能會出現問題,腳本内容如下(此腳本在centos 5.8 x86_64下已測試通過):
#!/bin/bash
username=mysqlbackup
password=mysqlbackup
date=`date
+%y-%m-%d`
+%y-%m-%d -d '-20 days'`
ftpolddate=`date
+%y-%m-%d -d '-60 days'`
mysql=/usr/local/mysql/bin/mysql
mysqldump=/usr/local/mysql/bin/mysqldump
mysqladmin=/usr/local/mysql/bin/mysqladmin
socket=/tmp/mysql.sock
backdir=/data/backup/db
[ -d
${backdir}/${date} ] || mkdir ${backdir}/${date}
[ ! -d
${backdir}/${olddate} ] || rm -rf ${backdir}/${olddate}
for dbname in
mysql test report
${mysqldump} --opt -u${username}
-p${password} -s${socket} ${dbname} | gzip >
${backdir}/${date}/${dbname}-backup-${date}.sql.gz
echo "${dbname} has been backup
successful"
/bin/sleep 5
host=192.168.4.45
ftp_username=dbmysql
ftp_password=dbmysql
cd ${backdir}/${date}
cd ${ftpolddate}
rmdir
${ftpolddate}
3. mysql資料備份至s3檔案系統
這裡先來介紹下亞馬遜的分布式檔案系統s3,s3為開發人員提供了一個高可擴充(scalability)、高持久性(durability)和高可用(availability)的分布式資料存儲服務。它是一個完全針對網際網路的資料存儲服務,借助一個簡單的web服務接口就可以通過網際網路在任何時候通路s3上的資料。當然存放在s3上的資料要可以進行通路控制以保障資料的安全性。這裡所說的通路s3包括讀、寫、删除等多種操作。在腳本的最後,采用aws s3指令中的cp将mysql上傳至s3://example-shar這個bucket上面(s3詳細資料介紹http://aws.amazon.com/cn/s3/),腳本内容如下所示(此腳本在amazon linux ami x86_64下已測試通過):
#
# filename:
backupdatabase.sh
# description:
# backup cms
database and remove backup data before 7 days
# crontab
# 55 23 * * *
/bin/sh /yundisk/cms/crontab/backupdatabase.sh >>
/yundisk/cms/crontab/backupdatabase.log 2>&1
+%y-%m-%d -d '-7 days'`
#mysql=/usr/local/mysql/bin/mysql
#mysqldump=/usr/local/mysql/bin/mysqldump
#mysqladmin=/usr/local/mysql/bin/mysqladmin
backdir=/yundisk/cms/database
mysqldump
--default-character-set=utf8 --no-autocommit --quick --hex-blob
--single-transaction -uroot
cms_production | gzip >
${backdir}/${date}/cms-backup-${date}.sql.gz
echo
"database cms_production and bbs has been backup successful"
/bin/sleep 5
aws s3 cp
${backdir}/${date}/* s3://example-share/cms/databackup/