ShellスクリプトMySQLをFTPに自動的にバックアップし、期限切れのバックアップを定期的にクリーンアップする

4038 ワード

以前、会社がネットで探していたMySQLをFTPのShellスクリプトに自動的にバックアップして、ずっと使っていました.しかし問題は,バックアップファイルが多くなるにつれて,FTP上の古いバックアップファイルを定期的にクリーンアップせざるを得なくなり,非常に不便であることである.
実際にMySQLバックアップはあまり長く保持する必要はありませんが、古いバックアップファイルを自動的にクリーンアップする機能があればいいです.ネットで探してみましたが、この方面のシナリオもありますが、私のニーズに合わないかもしれません.そこで自分で手動で以前のシェルスクリプトを変更して実現するしかありません.
まず、バックアップを保持する時間を決めます.1ヶ月のバックアップを保持すれば十分だと思います.1ヶ月後に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 < 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 < close
bye
!
EOF
 
sh ftpcc.sh
rm ftpcc.sh

このようなShellスクリプトを実行すると、各MySQLライブラリの独立したバックアップファイルが得られ、gz形式で圧縮されてスペースを節約できます.