20.5 鸟哥的备份策略

每部主机的任务都不相同,重要的数据也不相同,重要性也不一样,因此,每个人的备份思考角度都不一样! 有些备份策略是非常有趣的,包括使用多个磁带机与磁带来自动备份企业数据哩 [3]

就鸟哥的想法来说,鸟哥并没有想要将整个系统完整的备份下来,因为太耗时间了!而且就鸟哥的立场而言,似乎也没有这个必要, 所以通常鸟哥只备份较为重要的文件而已!不过,由于鸟哥需要备份 /home 与网页数据,如果天天都备份,我想,系统迟早会受不了 (因为这两个部分就已经占去数 10 GB 的硬盘空间…),所以鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据, 一个则是每周备份就不常变动的信息。这个时候我就写了两个简单的 scripts ,分别来储存这些数据。

所以针对鸟哥的“鸟站”来说,我的备份策略是这样的:

  • 主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
  • 每日进行:目前仅备份 MySQL 数据库;
  • 每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
  • 自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
  • 异地备援:每月定期的将数据分别 (a)烧录到光盘上面 (b)使用网络传输到另一部机器上面。
    那就来看看鸟哥是怎么备份的吧! ^_^

20.5.1 每周系统备份的 script

下面提供鸟哥的备份的 scripts ,希望对大家有点帮助!鸟哥假设你已经知道如何挂载一个新的 filesystem 到 /backup 去,所以格式化与挂载这里就不再强调啰。

  1. [root@study ~]# vi /backup/backupwk.sh
  2. #!/bin/bash
  3. # ====================================================================
  4. # 使用者参数输入位置:
  5. # basedir=你用来储存此脚本所预计备份的数据之目录(请独立文件系统)
  6. basedir=/backup/weekly <==您只要改这里就好了!
  7. # ====================================================================
  8. # 下面请不要修改了!用默认值即可!
  9. PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
  10. export LANG=C
  11. # 设置要备份的服务的配置文件,以及备份的目录
  12. named=$basedir/named
  13. postfixd=$basedir/postfix
  14. vsftpd=$basedir/vsftp
  15. sshd=$basedir/ssh
  16. sambad=$basedir/samba
  17. wwwd=$basedir/www
  18. others=$basedir/others
  19. userinfod=$basedir/userinfo
  20. # 判断目录是否存在,若不存在则予以创建。
  21. for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
  22. do
  23. [ ! -d "$dirs" ] && mkdir -p $dirs
  24. done
  25. # 1\. 将系统主要的服务之配置文件分别备份下来,同时也备份 /etc 全部。
  26. cp -a /var/named/chroot/{etc,var} $named
  27. cp -a /etc/postfix /etc/dovecot.conf $postfixd
  28. cp -a /etc/vsftpd/* $vsftpd
  29. cp -a /etc/ssh/* $sshd
  30. cp -a /etc/samba/* $sambad
  31. cp -a /etc/{my.cnf,php.ini,httpd} $wwwd
  32. cd /var/lib
  33. tar -jpc -f $wwwd/mysql.tar.bz2 mysql
  34. cd /var/www
  35. tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
  36. cd /
  37. tar -jpc -f $others/etc.tar.bz2 etc
  38. cd /usr/
  39. tar -jpc -f $others/local.tar.bz2 local
  40. # 2\. 关于使用者参数方面
  41. cp -a /etc/{passwd,shadow,group} $userinfod
  42. cd /var/spool
  43. tar -jpc -f $userinfod/mail.tar.bz2 mail
  44. cd /
  45. tar -jpc -f $userinfod/home.tar.bz2 home
  46. cd /var/spool
  47. tar -jpc -f $userinfod/cron.tar.bz2 cron at
  48. [root@study ~]# chmod 700 /backup/backupwk.sh
  49. [root@study ~]# /backup/backupwk.sh <==记得自己试跑看看!

上面的 script 主要均使用 CentOS 7.x (理论上, Red Hat 系列的 Linux 都适用) 默认的服务与目录, 如果你有设置某些服务的数据在不同的目录时,那么上面的 script 是还需要修改的!不要只是拿来用而已喔! 上面 script 可以在下面的链接取得。

再来,继续提供一下每日备份数据的脚本程序!请注意,鸟哥这里仅有提供 Mariadb 的数据库备份目录, 与 WWW 的类似留言版程序使用的 CGI 程序与写入的数据而已。 如果你还有其他的数据需要每日备份,请自行照样造句啰! ^_^

  1. [root@study ~]# vi /backup/backupday.sh
  2. #!/bin/bash
  3. # =========================================================
  4. # 请输入,你想让备份数据放置到那个独立的目录去
  5. basedir=/backup/daily/ <==你只要改这里就可以了!
  6. # =========================================================
  7. PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
  8. export LANG=C
  9. basefile1=$basedir/mysql.$date +%Y-%m-%d).tar.bz2
  10. basefile2=$basedir/cgi-bin.$date +%Y-%m-%d).tar.bz2
  11. [ ! -d "$basedir" ] && mkdir $basedir
  12. # 1\. MysQL (数据库目录在 /var/lib/mysql)
  13. cd /var/lib
  14. tar -jpc -f $basefile1 mysql
  15. # 2\. WWW 的 CGI 程序 (如果有使用 CGI 程序的话)
  16. cd /var/www
  17. tar -jpc -f $basefile2 cgi-bin
  18. [root@study ~]# chmod 700 /backup/backupday.sh
  19. [root@study ~]# /backup/backupday.sh <==记得自己试跑看看!

上面的脚本可以在下面的链接取得。这样一来每天的 Mariadb 数据库就可以自动的被记录在 /backup/daily/ 目录里头啦!而且还是文件名称会自动改变的呦!呵呵!我很喜欢!OK!再来就是开始让系统自己跑啦! 怎么跑?就是 /etc/crontab 呀!提供一下我的相关设置呦!

这样系统就会自动的在每天的 2:30 进行 Mariadb 的备份,而在每个星期日的 3:30 进行重要文件的备份!呵呵!你说,是不是很容易呢!但是请千万记得呦!还要将 /backup/ 当中的数据 copy 出来才行耶!否则整部系统死掉的时候…那可不是闹着玩的! 所以鸟哥大约一个月到两个月之间,会将 /backup 目录内的数据使用 DVD 复制一下,然后将 DVD 放置在家中保存!这个 DVD 很重要的喔!不可以遗失,否则系统的重要数据 (尤其是帐号信息) 流出去可不是闹着玩的!

鸟哥的图示

Tips 有些时候,你在进行备份时,被备份的文件可能同时间被其他的网络服务所修改喔! 举例来说,当你备份 Mariadb 数据库时,刚好有人利用你的数据库发表文章,此时, 可能会发生一些错误的讯息。要避免这类的问题时,可以在备份前,将该服务先关掉, 备份完成后,再启动该服务即可!感谢讨论区 duncanlo 提供这个方法!

20.5.3 远端备援的 script

如果你有控管两部以上的 Linux 主机时,那么互相将对方的重要数据保存一份在自己的系统中也是个不错的想法! 那怎么保存啊?使用 USB 复制来去吗?当然不是啦!你可以通过网络来处置啦!我们假设你已经有一部主机, 这部主机的 IP 是 192.168.1.100 ,而且这部主机已经提供了 sshd 这个网络服务了,接下来你可以这样作:

  • 使用 rsync 上传备份数据
    要使用 rsync 你必须要在你的服务器上面取得某个帐号使用权后, 并让该帐号可以不用密码即可登陆才行!这部分得要先参考服务器篇的远端连线服务器才行! 假设你已经设置好 dmtsai 这个帐号可以不用密码即可登陆远端服务器,而同样的你要让 /backup/weekly/ 整个备份到 /home/backup/weekly 下面时,可以简单这样做:
  1. [root@study ~]# vi /backup/rsync.sh
  2. #!/bin/bash
  3. remotedir=/home/backup/
  4. basedir=/backup/weekly
  5. host=127.0.0.1
  6. id=dmtsai
  7. # 下面为程序阶段!不需要修改喔!
  8. rsync -av -e ssh $basedir ${id}@${host}:${remotedir}

由于 rsync 可以通过 ssh 来进行镜像备份,所以没有变更的文件将不需要上传的!相当的好用呢! 好了!大家赶紧写一个适合自己的备份 script 来进行备份的行为吧!重要重要喔!

鸟哥的图示

Tips 因为 rsync 搭配 sshd 真的很好用!加上它本身就有加密~近期以来大家对于数据在网络上面跑都非常的在乎安全性, 所以鸟哥就取消了 FTP 的传输方式啰~

原文: https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/178.html