欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Shell脚本自动备份MySQL到FTP并定期清理过期备份

程序员文章站 2022-06-13 17:26:41
以前公司用的一个网上找的mysql自动备份到ftp的shell脚本,一直用着不错。但是问题就是随着备份文件的越来越多,不得不定期清理ftp上的老备份文件,十分的不便。...

以前公司用的一个网上找的mysql自动备份到ftp的shell脚本,一直用着不错。但是问题就是随着备份文件的越来越多,不得不定期清理ftp上的老备份文件,十分的不便。

实际上mysql备份无需保留太长时间的,如果能有自动清理旧的备份文件的功能就好了。不过网上找了一下,虽然也有这方面的脚本,不过可能不太符合我的需求吧。于是只能自己手动改下以前的那个shell脚本来实现咯。

首先我们要确定保留备份的时间,我觉得一个月的备份保留就足够了。因为基本不会出现1个月后要恢复1个月之前备份的情况。(如果有请自己手动备份,毕竟自动备份还是不能取代手动备份的部分)。那么我们的思路就出来了:在上传以当天日期为文件名的备份的时候,顺便删除下一个月之前的同日期备份,就可以确保服务器上保留的是最近一个月的备份了。

然后我们需要知道linux下的一个命令:date。这是个可以查看当前服务器的时间日期信息的命令。当然这里我们需要知道的是这个命令的参数,毕竟我们需要得到的是日期部分。

输入下面这个命令,可以看到“年-月-日”的输入,类似“2011-09-09”:

复制代码 代码如下:

date +%y-%m-%d

那么,如果我们要得到1个月之前的日期怎么办呢?使用下面的这条命令就可以得到:

复制代码 代码如下:

date -d last-month +%y-%m-%d

怎么样?简单吧。实际备份的时候,因为之前脚本使用的是“m-d-y”的形式,也就是“月-日-年”的形式,所以我稍微做了下调整。但是下面这个shell脚本中的是按照“年-月-日”来产生文件名的。

于是,给出整个备份shell脚本,需要的朋友只需要填写下有中文说明的部分,即可在自己的linux服务器上使用。使用办法:复制到某个目录下,然后给予执行权限,再在cron中设置每天指定时间运行即可。(关于这部分,请自行查找相关说明,这里不再复述)

带自动清理功能的mysql备份到ftp的shell脚本如下:

复制代码 代码如下:

#!/bin/bash
 
myuser="db_username"     # 数据库用户名,建议使用root账户或者拥有全局权限的用户名
mypass="db_password"       # 数据库密码
myhost="localhost"          # 数据库服务器
 
# linux bin paths, change this if it can't be autodetected via which command
mysql="$(which mysql)"
mysqldump="$(which mysqldump)"
chown="$(which chown)"
chmod="$(which chmod)"
gzip="$(which gzip)"
 
# 数据库备份的路径
dest="/home/backup"
 
# main directory where backup will be stored
mbd="$dest/mysql"
 
# get hostname
host="$(hostname)"
 
# get data in dd-mm-yyyy format
now="$(date +%d-%m-%y)"
old="$(date -d last-month +%d-%m-%y)"
 
# file to store current backup file
file=""
# store list of databases
dbs=""
 
# do not backup these databases
iggy="test"
 
rm -rf $mbd
 
[ ! -d $mbd ] && mkdir -p $mbd || :
 
# only root can access it!
$chown 0.0 -r $dest
$chmod 0600 $dest
 
# get all database list first
dbs="$($mysql -u $myuser -h $myhost -p$mypass -bse 'show databases')"
 
cat > ftpcc.sh <<eof
cd $mbd
ftp -i -n<<!
open blog.renhao.org #在这里填写ftp服务器的域名或ip
user ftp_user ftp_pass #在这里填写ftp用户名和密码,注意空格分隔
binary
mput *.gz
eof
 
for db in $dbs
do
    skipdb=-1
    if [ "$iggy" != "" ];
    then
        for i in $iggy
        do
            [ "$db" = "$i" ] && skipdb=1 || :
        done
    fi
 
    if [ "$skipdb" = "-1" ] ; then
        file="$mbd/$db.$host.$now.gz"
        echo "delete $db.$host.$old.gz" >> ftpcc.sh
        # do all inone job in pipe,
        # connect to mysql using mysqldump for select mysql database
        # and pipe it out to gz file in backup dir :)
        $mysqldump -u $myuser -h $myhost -p$mypass $db | $gzip -9 > $file
    fi
done
 
cat >> ftpcc.sh <<eof
close
bye
!
eof
 
sh ftpcc.sh
rm ftpcc.sh

这样的shell脚本运行后,可以得到每个mysql库的独立备份文件,且以gz格式压缩以便节省空间。