mysql備份與恢復-mysqldump使用

對於任何一個項目數據庫備份都很重要,雖然平時不容易出問題,但是一出問題如果沒有事先準備的話,基本就蒙逼了再見

這次主要說說一種比較基本簡單的備份策略,適合一些小項目,大了的項目也不用我們操心DB了

這裏使用的是mysql自帶的mysqldump工具,自帶的就是好!

備份和恢復的思路其實很簡單,就是把需要備份的數據導出來,在出問題的時候在導回去。

操作很簡單,直接貼代碼:

db.backups.sh

#!/bin/bash
DB_NAME="demo demo1"
DB_USER=root
DB_PASS=123456
BAKDIR=/var/backups/mysql
LOGDIR=/var/log/mysql/backups
DATE=`date +"%Y%m%d"`

for db in $DB_NAME
do
    tables=`mysql -u$DB_USER -p$DB_PASS -e "show tables from $db" | sed '1d'`
    sqlDIR=$BAKDIR/$DATE/$db
    mkdir -p $sqlDIR
    for table in $tables
    do
        mysqldump -u$DB_USER -p$DB_PASS -F --master-data=2 --single-transaction --events $db $table > $sqlDIR/$table.sql
    done
    cd $BAKDIR
    tar zcvf $DATE.tar.gz $DATE > /dev/null
    rm -rf $DATE > /dev/null
    if [ ! -d $LOGDIR/$DATA ];then
        mkdir -p $LOGDIR/$DATA
    fi
    echo $DATE `date +"%H:%M:%S"` - database : $db , backups success! >> $LOGDIR/$DATE.log
done



上面就是將配置的幾個DB按照日期(每日)導出到指定文件。

上面mysqldump沒有添加-h默認連接本機mysql,也可以配上-h在其他機器上運行sh文件,將備份與mysql服務分開。

db.recover.sh

#!/bin/bash

DB_USER=root
DB_PASS=123456
BAKDIR=/var/backups/mysql
LOGDIR=/var/log/mysql/recover

function recover() {
    DB=$1
    TABLES=$2
    DATE=$3
    if [ -z $DATE ];then
        DATE=`date +"%Y%m%d"`
    fi
    
    if [ ! -f $BAKDIR/$DATE.tar.gz ];then
        echo $BAKDIR/$DATE.tar.gz file is not found.
        return 0
    fi
    tar zxvf $BAKDIR/$DATE.tar.gz -C $BAKDIR> /dev/null
    
    if [ ! -d $BAKDIR/$DATE/$DB ];then
        echo db : $DB is not found in $BAKDIR/$DATE.
        return 0
    fi
    
    if [ x$TABLES == 'xall' ];then
        TABLES=`ls $BAKDIR/$DATE/$DB | awk -F '.' '{print $1}'`
    fi
    
    #backup table to /tmp before recover
    mysqldump -u$DB_USER -p$DB_PASS $DB $TABLES > /tmp/$DB.sql
    
    for TABLE in $TABLES
    do
        if [ ! -f $BAKDIR/$DATE/$DB/$TABLE.sql ];then
            echo $TABLE.sql is not found in $BAKDIR/$DATE/$DB.
            return 0
        fi
        mysql -u$DB_USER -p$DB_PASS $DB < $BAKDIR/$DATE/$DB/$TABLE.sql
        echo db : $DB, table : $TABLE recover success. >> $LOGDIR/`date +"%Y%m%d"`.log
    done
    rm -rf $BAKDIR/$DATE > /dev/null
}

ARG1=$1
DATE=$2
DB=`echo $1 | awk -F '.' '{print $1}'`
TABLE=`echo $1 | awk -F '.' '{print $2}'`

if [ -z $DB ];then
    echo need you input db name.
    exit 0
fi

if [ -z $TABLE ];then
    TABLE=all
fi

recover $DB $TABLE $DATE



恢復DB的邏輯就是這樣了,定義了一些規則:

./db.recover.sh db.table date,

db必填

table可以選填,留空表示恢復所有表, ps:應該不會有人把表名取爲all吧?

date 是要選用哪天備份的數據來做恢復,留空則默認取當天備份的數據,格式yearmonthday

例子:./db.recover.sh demo.user 20160910 ,則表示取20160910那天備份的數據來恢復demo庫的user表。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章