美文网首页
VPS定时自动备份数据及数据库到远程FTP(LNMP)

VPS定时自动备份数据及数据库到远程FTP(LNMP)

作者: 程序员的自我修养 | 来源:发表于2020-05-28 15:00 被阅读0次

    VPS定时自动备份数据及数据库到远程FTP(LNMP)

    即使是经济发展到现在,还是有很多服务器没有Raid0备份磁盘。而且尤其是像咱一样的草根,首先租不起昂贵的中高端服务器,其次很多人都是租的vps,尤其是现在海外服务器白菜价的时期(虽然白菜也很贵)。

    因为自己的几个vps几乎死掉了一半,而自己又不注意备份问题,就网上搜了些教程,做个自己的定时备份程序。为提高性能,笔者用的都是lnmp系统,kloxo有自带备份的,其他系统原理类似,centos应该都可以用,感兴趣可以通过本文进一步研究。具体如下:

    1,首先vps要支持lftp,安装lftp

    yum install lftp

    如果要使用下面的发送邮件功能,则需要安装mutt的email发送组件

    yum install sendmail mutt

    2,设置备份文件夹,笔者是在/home下新建的一个backup的文件夹,下面的脚步都是基于/home/backup这个备份文件夹的。

    3,建立备份脚本backup.sh(请给该文件添加执行权限,777好了),建议使用Winscp软件进行sftp操作,用Putty进行SSH操作。(这个脚本缺点在于备份的MYSQL是直接打包数据库文件夹的,而不是导出sql最下面有个优化版本,)

    #!/bin/bash

    #这里需要您修改下

    FTP_USER=root #你的上传ftp用户名

    FTP_PASS=123456 #你的上传ftp密码

    FTP_IP=127.0.0.1 #你上传ftp的地址

    FTP_backup=backup #ftp上存放备份文件的目录(ftp主目录即为空)

    #MAIL_TO=suwubee@gmail.com #数据库发送到的邮箱,如需使用请先安装mutt并去掉注释

    WEB_DATA=/home/wwwroot #要备份的网站数据

    mysql_DATA=/usr/local/mysql/var #要备份的数据库目录

    yuming_DATA=/usr/local/nginx/conf #要备份的域名信息

    #下面一般可以默认

    #定义数据库的名字和旧数据库的名字

    DataBakName=Data_$(date +"%Y%m%d").tar.gz

    WebBakName=Web_$(date +%Y%m%d).tar.gz

    yumingName=yuming_$(date +%Y%m%d).tar.gz

    OldData=Data_$(date -d -5day +"%Y%m%d").tar.gz

    OldWeb=Web_$(date -d -5day +"%Y%m%d").tar.gz

    Oldyuming=yuming_$(date -d -5day +"%Y%m%d").tar.gz

    #以上的-5day即最下面的删除ftp空间中5天前的数据,可自定义。

    #删除本地3天前的数据

    rm -rf /home/backup/Data_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/Web_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/yuming_$(date -d -3day +"%Y%m%d").tar.gz

    #你可以修改3为其他数字,即自定义删除几天前的数据

    cd /home/backup

    #停止mysql,是为了防止数据读取过程中备份出错

    service mysql stop

    #打包mysql目录

    cd $mysql_DATA

    tar zcf /home/backup/$DataBakName ./*

    #运行mysql

    service mysql start

    #压缩网站数据

    cd $WEB_DATA

    tar zcf /home/backup/$WebBakName ./*

    #压缩域名信息,建议LNMP整个VPS迁移的话备份下这些子域名配置文件

    cd $yuming_DATA

    tar zcf /home/backup/$yumingName ./*

    #如果需要将数据库备份到邮箱,请去掉前面注释,如果数据库过大,不建议使用此功能

    #echo "主题:数据库备份" | mutt -a /home/backup/$DataBakName -s "内容:数据库备份" $MAIL_TO

    #上传到FTP空间,删除FTP空间5天前的数据

    cd /home/backup

    ftp -v -n $FTP_IP << END

    user $FTP_USER $FTP_PASS

    type binary

    cd $FTP_backup

    delete $OldData

    delete $OldWeb

    delete $Oldyuming

    put $DataBakName

    put $WebBakName

    put $yumingName

    bye

    END

    4,设置linux的crontab定时任务自动执行备份上传,ssh里输入

    crontab -e

    会出来个vi编辑框,按i就可以编辑添加一条。

    00 00 * * * /home/backup.sh

    然后按Esc和:wq保存退出即可,上面的意思即每天0点0分自动执行/home/backup.sh这个文件。

    上面的00 00 * * * /home/back.up的前五个是自定义时间的,如果你不希望每天0点执行,可以自己写。

    前五个分别代表:minutes(0-59),hour(0-23),mday(1-31), month(1-12), wday(0-7);即分别代表分、时、日、月份、星期(0和7都代表星期天)。

    小时位中的如果是*,则表示每小时,天位置里面如果是*,则表示每天,以此类推。栏目中也可以使用“-”来表示范围,比如在小时里写1-5,则表示执行的时间是1,2,3,4,5,一共执行5次。

    栏目里也可以用“,”来表示,比如星期里写,1,3,5,就表示在周一周三周五各执行一次。于是我们也可以在日期里写1-2,10-12,表示每月的1,2,10,11,12五天各执行一次。

    另外,也可以用/后面的数字表示没几分钟执行一次,比如在分里面写0-23/2,就表示1-22分之间,每隔2分钟执行一次,也就是0,2,4,6,8,10,12,14,16,18,20,22。如果在分的栏目上写*/5,就表示每5分钟执行一次。

    除此之外,也可以用一个开头为@的字符串来表示下面的意义:

    字符串表示意义

    @reboot开机的时候运行一次。

    @yearly每年运行一次,等于 “0 0 1 1 *”。

    @annually和 @yearly一样。

    @monthly每月跑一次,等于 “0 0 1 * *”。

    @weekly每周跑一次,等于 “0 0 * * 0″。

    @daily每天跑一次,等于 “0 0 * * *”。

    @midnight和 @daily 一样。

    @hourly每小時跑一次,等于 “0 * * * *”。

    自动备份好像说了不少了,还有一点忘了说,如果/home/backup.sh执行不了,或者写完了crontab无法保存,那就在/home/backup.sh前面加个/bin/bash ,即执行的时候

    [root@localhost ~]# /bin/bash /home/backup.sh

    写定时任务的时候

    0 2 * * * /bin/bash /home/backup.sh

    上面的意思是每天2点备份。

    对于备份FTP我想这个我就不多说了,godaddy随便买个域名就有10G的空间送。把那个做FTP空间一般都够了哈。

    附:VPS定时自动备份数据及数据库到远程FTP 优化版本

    #!/bin/bash

    #这里需要您修改下(添加备份导出sql)

    MYSQL_USER=root #mysql用户名(最好是使用可以导出所有数据库文件权限的账号,比如root)

    MYSQL_PASS=123456 #mysql密码

    FTP_USER=root #你的上传ftp用户名

    FTP_PASS=123456 #你的上传ftp密码

    FTP_IP=127.0.0.1 #你上传ftp的地址

    FTP_backup= #ftp上存放备份文件的目录(ftp主目录即为空)

    #MAIL_TO=suwubee@gmail.com #数据库发送到的邮箱,如需使用请先安装mutt并去掉注释

    WEB_DATA=/home/wwwroot #要备份的网站数据

    mysql_DATA=/usr/local/mysql/var #要备份的数据库目录

    yuming_DATA=/usr/local/nginx/conf #要备份的域名信息

    #下面一般可以默认

    #定义数据库的名字和旧数据库的名字

    DataBakName=Data_$(date +"%Y%m%d").tar.gz

    WebBakName=Web_$(date +%Y%m%d).tar.gz

    yumingName=yuming_$(date +%Y%m%d).tar.gz

    OldData=Data_$(date -d -3day +"%Y%m%d").tar.gz

    OldWeb=Web_$(date -d -3day +"%Y%m%d").tar.gz

    Oldyuming=yuming_$(date -d -3day +"%Y%m%d").tar.gz

    #以上的-5day即最下面的删除ftp空间中3天前的数据,可自定义。

    #删除本地3天前的数据

    rm -rf /home/backup/Data_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/Web_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/yuming_$(date -d -3day +"%Y%m%d").tar.gz

    #你可以修改3为其他数字,即自定义删除几天前的数据

    cd /home/backup

    #使用命令导出SQL数据库,并且按数据库分个压缩

    for db in `/usr/local/mysql/bin/mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do

    (/usr/local/mysql/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 - > ${db}.sql.gz)

    done

    #压缩数据库文件合并为一个压缩文件

    tar zcf /home/backup/$DataBakName /home/backup/*.sql.gz

    rm -rf /home/backup/*.sql.gz

    #压缩网站数据

    cd $WEB_DATA

    tar zcf /home/backup/$WebBakName ./*

    #压缩域名信息,建议LNMP整个VPS迁移的话备份下这些子域名配置文件

    cd $yuming_DATA

    tar zcf /home/backup/$yumingName ./*

    #如果需要将数据库备份到邮箱,请去掉前面注释,如果数据库过大,不建议使用此功能

    #echo "主题:数据库备份" | mutt -a /home/backup/$DataBakName -s "内容:数据库备份" $MAIL_TO

    #上传到FTP空间,删除FTP空间3天前的数据

    cd /home/backup

    ftp -v -n $FTP_IP << END

    user $FTP_USER $FTP_PASS

    type binary

    cd $FTP_backup

    delete $OldData

    delete $OldWeb

    delete $Oldyuming

    put $DataBakName

    put $WebBakName

    put $yumingName

    bye

    END

    这个再压缩数据库过程中可能会提示出错,本人测试可以略过,看最终是否打包成功即可。可能是root权限无法打包导出部分数据库。

    相关文章

      网友评论

          本文标题:VPS定时自动备份数据及数据库到远程FTP(LNMP)

          本文链接:https://www.haomeiwen.com/subject/xbhuohtx.html