每部主机的任务都不相同,重要的数据也不相同,重要性也不一样,因此,每个人的备份思考角度都不一样!
有些备份策略是非常有趣的,包括使用多个磁带机与磁带来自动备份企业数据哩 (注3) 。
就鸟哥的想法来说,鸟哥并没有想要将整个系统完整的备份下来,因为太耗时间了!而且就鸟哥的立场而言,似乎也没有这个必要,
所以通常鸟哥只备份较为重要的文件而已!不过,由於鸟哥需要备份 /home 与网页数据,如果天天都备份,我想,系统迟早会受不了
(因为这两个部分就已经占去数 10 GB 的磁盘空间...),所以鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据,
一个则是每周备份就不常变动的资讯。这个时候我就写了两个简单的 scripts ,分别来储存这些数据。
所以针对鸟哥的『鸟站』来说,我的备份策略是这样的:
- 主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
- 每日进行:目前仅备份 MySQL 数据库;
- 每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
- 自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
- 异地备援:每月定期的将数据分别 (a)烧录到光盘上面 (b)使用网络传输到另一部机器上面。
那就来看看鸟哥是怎么备份的吧! ^_^
每周系统备份的 script
底下提供鸟哥的备份的 scripts ,希望对大家有点帮助!鸟哥假设你已经知道如何挂载一个新的
filesystem 到 /backup 去,所以格式化与挂载这里就不再强调罗。
[root@www ~]# vi /backup/backupwk.sh
#!/bin/bash
# ====================================================================
# 使用者参数输入位置:
# basedir=你用来储存此脚本所预计备份的数据之目录(请独立文件系统)
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
[root@www ~]# chmod 700 /backup/backupwk.sh
[root@www ~]# /backup/backupwk.sh <==记得自己试跑看看!
|
上面的 script 主要均使用 CentOS 5.x (理论上, Red Hat 系列的 Linux 都是用) 默认的服务与目录,
如果你有配置某些服务的数据在不同的目录时,那么上面的 script 是还需要修改的!不要只是拿来用而已喔!
上面 script 可以在底下的连结取得。
每日备份数据的 script
再来,继续提供一下每日备份数据的脚本程序!请注意,鸟哥这里仅有提供 MySQL 的数据库备份目录,
与 WWW 的类似留言版程序使用的 CGI 程序与写入的数据而已。
如果你还有其他的数据需要每日备份,请自行照样造句罗! ^_^
[root@www ~]# vi /backup/backupday.sh
#!/bin/bash
# =========================================================
# 请输入,你想让备份数据放置到那个独立的目录去
basedir=/backup/daily/ <==你只要改这里就可以了!
# =========================================================
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(date +%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 程序 (如果有使用 CGI 程序的话)
cd /var/www
tar -jpc -f $basefile2 cgi-bin
[root@www ~]# chmod 700 /backup/backupday.sh
[root@www ~]# /backup/backupday.sh <==记得自己试跑看看!
|
上面的脚本可以在底下的连结取得。这样一来每天的 MySQL 数据库就可以自动的被记录在 /backup/daily/
目录里头啦!而且还是文件名称会自动改变的呦!呵呵!我很喜欢!OK!再来就是开始让系统自己跑啦!
怎么跑?就是 /etc/crontab 呀!提供一下我的相关配置呦!
[root@www ~]# vi /etc/crontab
# 加入这两行即可 (请注意你的文件目录!不要照抄呦!)
30 3 * * 0 root /backup/backupwk.sh
30 2 * * * root /backup/backupday.sh
|
这样系统就会自动的在每天的 2:30 进行 MySQL 的备份,而在每个星期日的
3:30 进行重要文件的备份!呵呵!你说,是不是很容易呢!但是请千万记得呦!还要将
/backup/ 当中的数据 copy 出来才行耶!否则整部系统死掉的时候...那可不是闹著玩的!
所以鸟哥大约一个月到两个月之间,会将 /backup 目录内的数据使用 DVD 复制一下,然后将 DVD
放置在家中保存!这个 DVD 很重要的喔!不可以遗失,否则系统的重要数据 (尤其是帐号资讯)
流出去可不是闹著玩的!
Tips: 有些时候,你在进行备份时,被备份的文件可能同时间被其他的网络服务所修改喔!
举例来说,当你备份 MySQL 数据库时,刚好有人利用你的数据库发表文章,此时,
可能会发生一些错误的信息。要避免这类的问题时,可以在备份前,将该服务先关掉,
备份完成后,再启动该服务即可!感谢讨论区 duncanlo 提供这个方法!
| |
远程备援的 script
如果你有控管两部以上的 Linux 主机时,那么互相将对方的重要数据保存一份在自己的系统中也是个不错的想法!
那怎么保存啊?使用 U盘 复制来去吗?当然不是啦!你可以透过网络来处置啦!我们假设你已经有一部主机,
这部主机的 IP 是 192.168.1.100 ,而且这部主机已经提供了 FTP 与 sshd 这两个网络服务,
同时你已经做好了 FTP 的帐号,sshd 帐号的免口令登陆功能等
(这部分请参考服务器篇的介绍),接下来你可以这样做:
假设你要上传的数据是将 /backup/weekly/ 目录内的文件统整为一个 /backup/weekly.tar.bz2 ,
并且上传到服务器端的 /home/backup/ 底下,使用的帐号是 dmtsai ,口令是 dmtsai.pass 。
那么你可以这样做看看:
[root@www ~]# vi /backup/ftp.sh
#!/bin/bash
# ===========================================
# 先输入系统所需要的数据
host="192.168.1.100" # 远程主机
id="dmtsai" # 远程主机的 FTP 帐号
pw='dmtsai.pass' # 该帐号的口令
basedir="/backup/weekly" # 本地端的欲被备份的目录
remotedir="/home/backup" # 备份到远程的何处?
# ===========================================
backupfile=weekly.tar.bz2
cd $basedir/..
tar -jpc -f $backupfile $(basename $basedir)
ftp -n "$host" > ${basedir}/../ftp.log 2>&1 <<EOF
user $id $pw
binary
cd $remotedir
put $backupfile
bye
EOF
|
另一个更简单的方法就是透过 rsync ,但是你必须要在你的服务器上面取得某个帐号使用权后,
并让该帐号可以不用口令即可登陆才行!这部分得要先参考服务器篇的远程连线服务器才行!
假设你已经配置好 dmtsai 这个帐号可以不用口令即可登陆远程服务器,而同样的你要让 /backup/weekly/
整个备份到 /home/backup/weekly 底下时,可以简单这样做:
[root@www ~]# vi /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=dmtsai
# 底下为程序阶段!不需要修改喔!
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}
|
由於 rsync 可以透过 ssh 来进行镜像备份,所以没有变更的文件将不需要上传的!相当的好用呢!
好了!大家赶紧写一个适合自己的备份 script 来进行备份的行为吧!重要重要喔!