目录
近期因为mysql数据库数据量增加的比较快,使用的阿里云的主机,内网远程备份,在备份过程中耗用了大量的带宽,导致用户在登陆的时候出现短暂登陆不上的情况,以前的数据库备份脚本是整库备份,备份了日志表等一些相对不重要的表,无形中增加了备份的时间以及带宽,故花了点时间将脚本改了一下。
1.全库备份
以前的脚本-----按库进行全备
backup.sh
#!/bin/bash
MYUSER=root
MYPASS=123456
MYLOGIN="mysql -u$MYUSER -p$MYPASS"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -B"
#DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi "Data|_schema|mysql")"
#for dbname in $DATABASE
#do
MYDIR=/backup/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
/bin/nice -n 19 $MYDUMP $dbname|gzip >$MYDIR/${dbname}_$(date +%F).sql.gz
done
find /backup/ -name "*.gz" -mtime +7 -exec rm -rf {} \;
更改后的表
2.数据库中的指定部分表进行备份
tables.txt,格式为库名.表名字
·在测试中文本在windows编辑器中编辑好了,上传到linux环境,运行脚本的时候,会导致有些乱码,可以在linux环境用vim打开,复制文本,最好不要直接上传到linux环境。
tables.txt
ApolloPortalDB.App
ApolloPortalDB.Consumer
ApolloPortalDB.Role
ApolloPortalDB.Users
ApolloConfigDB.Cluster
ApolloConfigDB.Item
ApolloConfigDB.ServerConfig
这样有一点就是比较繁琐,如果mysql中含有多个数据库,库里面有许多表都需要备份,需要将所有表都添加到这个文本文件
脚本mysql-backup-singletable.sh
#!/bin/bash
## backup some tables on some databases;
MYUSER=root
MYPASS=root
HOST="192.168.0.248"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -h$HOST "
TABLES_TXT=/backup/tables.txt
echo "`date +'%Y-%m-%d %H:%M:%S'` begin to backup databases------------------------------------------------------- "
for line in `cat $TABLES_TXT`
do
#echo $line
#TableName=$line
DbName=`echo $line | awk -F '.' '{print $1}'`
#TableName=`echo $line | awk -F '.' '{print $1" "$2}'`
TableName=`echo $line | awk -F '.' '{print $2}'`
MYDIR=/backup/$DbName
echo "`date +'%Y-%m-%d %H:%M:%S'` begin to backup table $line-------------- "
[ ! -d $MYDIR ] && mkdir -p $MYDIR
/bin/nice -n 19 $MYDUMP $DbName $TableName|gzip >$MYDIR/${line}_$(date +%F).sql.gz
echo "`date +'%Y-%m-%d %H:%M:%S'` end backup table $line------------------ "
done
echo "`date +'%Y-%m-%d %H:%M:%S'` end backupdatabases--------------------------------------------------------------"
find /backup/ -name "*.gz" -mtime +7 -exec rm -rf {} \;
该脚本也比较简单,就是对文本中的数据进行解析作为变量传入到备份语句中。
执行语句,会将脚本信息重定向到自定义的日志中。
sh /backup/mysql-backup-singletable.sh > /backup/$(date +%F).log 2>&1
注意:不能将此条语句直接放到定时任务中,定时任务不能识别此条语句,可以将这条语句放入脚本中,在定时任务中执行脚本就好了,参考下面例子。
3.备份指定库以及指定库中的指定部分表。
上面的两个脚本可以结合在一起使用。
只需要将库备份脚本中过滤掉相关库,然后在表备份脚本中添加上相关库的相关表即可,实现自由组合。
例如
过滤掉含这些关键字的库,然后将这些苦衷需要备份的表以库名.表名的形式添加到tables.txt文本中集合。
创建mysql_cron.sh
#!/bin/bash
###go running scripts
sh /backup/backup.sh && sh /backup/mysql-backup-singletable.sh > /backup/$(date +%F).log 2>&1
添加定时任务,晚上一点钟执行
* 1 * * * sh /backup/mysql_cron.sh