天天看点

Linux集群和自动化维2.6.1 备份类脚本

<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  &gt; /dev/null

  rm -rf $project

sleep 2

done

host=192.168.2.112

ftp_username=svn

ftp_password=svn101

cd

ftp -i -n -v

&lt;&lt; !

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 &gt;

${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 &gt;&gt;

/yundisk/cms/crontab/backupdatabase.log 2&gt;&amp;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 &gt;

${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/