对于任何一个项目数据库备份都很重要,虽然平时不容易出问题,但是一出问题如果没有事先准备的话,基本就蒙逼了
这次主要说说一种比较基本简单的备份策略,适合一些小项目,大了的项目也不用我们操心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表。