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表。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值