# 鸟哥的备份策略

关于备份来说,需要根据场景,数据的重要程度,成本等方式来综合考虑,而作者这里将备份分为两大部分:

  • 每日备份经常性变化的重要数据
  • 每周备份不常变动的信息

编写两个简单的 scripts 来完整这两项工作。

这里针对作者的网站来说,备份策略如下:

  1. 主机硬件:使用一个独立的 filesystem 来存储备份数据,此 filesystem 挂载到 /backup 中
  2. 每日进行:目前仅备份 MySql 数据库
  3. 每周进行:包括 /home/var/etc/boot/boot/usr/local 等目录与特殊服务的目录
  4. 自动处理:利用 /etc/crontab 来自动提供备份的功能
  5. 异地备份:每月定期的将数据分别
    1. 刻录到光盘上
    2. 使用网络传输到另一台数据上

下面演示作者对以上需求编写的 script

# 每周系统备份的 script

/backup/backupwk.sh

#!/bin/bash
# 用户输入位置,用来存储此脚本所预计备份的数据目录(使用独立文件系统较好)
basedir=/backup/weekly

PATH=/bin:/usr/bin:/sbin:/usr/sbin; 
export PATH
export LANG=C

# 设置要备份的服务的配置文件,以及备份目录
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo

# 判断目录是否存在,若不存在则建立
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
	[ ! -d "$dirs" ] && mkdir -p $dirs
done

# 1. 将系统主要的服务配置文件分别备份下来,同时也备份 /etc/ 全部
cp -a /var/named/chroot/{etc,var} $named
cp -a /etc/postfix /etc/dovecot.conf $postfixd
cp -a /etc/vsftpd/* $vsftpd
cp -a /etc/ssh/* $sshd
cp -a /etc/samba/* $sambad
cp -a /etc/{my.cnf,php.ini,httpd} $wwwd

cd /var/lib
tar -jpc -f $wwwd/mysql.tar.bz2 mysql
cd /var/www
tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
cd /
tar -jpc -f $others/etc/tar.bz2 etc
cd /usr/
tar -jpc -f $others/local.tar.bz2 local

# 2. 关于使用者方面
cp -a /etc/{passwd,shadow,group} $userinfod
cd /var/spool
tar -jpc -f $userinfod/mail.tar.bz2 mail
cd /
tar -jpc -f $userinfod/home.tar.bz2 home
cd /var/spool
tar -jpc -f $userinfod/cron.tar.bz2 cron at

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

更改脚本权限与执行

chmod 700 /backup/backupwk.sh
/backup/backupwk.sh
1
2

# 每日备份数据的 script

/backup/backupday.sh

#!/bin/bash
# 备份到的目录
basedir=/backup/daily

PATH=/bin:/usr/bin:/sbin:/usr/sbin; 
export PATH
export LANG=C

basefile1=$basedir/mysql.$(data +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(data +%Y-%m-%d).tar.bz2

[ -d "$basedir" ] && mkdir $basedir

# 1. mysql 数据库目录咋 /var/lib/mysql
cd /var/lib
tar -jpc -f $basefile1 mysql

# 2. www 的 CGI 程序
cd /var/www
tar -jpc -f $basefile2 cgi-bin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

下面提供每周与每日的 crontab 配置

vim /etc/crontab
# 每周日的 3:30 进行重要文件备份
30 3 * * 0 root /backup/backupwk.sh
# 每天 2:30 进行数据库的备份
30 2 * * * root /backup/backupday.sh
1
2
3
4
5

在这个备份方案中有一个问题就是:当你备份的时候,如果恰巧有有人发表文章(mysql 数据变更了),那么就有可能导致出现一些错误信息,这里只能是先停掉 mysql 服务,在开始备份

# 远程备份 script

如果你有两台 Linux 主机时,那么互相将对方的重要数据保存一份在自己的系统中也是一个不错的办法,可以用 sshd 服务来完成主机之间的数据传输

# 使用 rsync 上传备份数据

使用 rsync 必须要在你的服务器上取得某个账户的使用权后,并让该账户可用不用密码即可登录才可以。

假设你已经设置好 mrcode 免密登录远程服务器,需要将 /backup/weekly 整个备份到 /home/backup/weekly 时,可以简单这样做

vim /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=mrcode

# 下面为实际的指令
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}
1
2
3
4
5
6
7
8
9

rsync 可以通过 ssh 来进行镜像备份,所以没有变更的文件将不需要上传,非常的方便