假如一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份,具体要求如下:
1) 每天备份一次,需要备份所有的库;
2) 把备份数据存放到 /data/backup/ 下;
3) 备份文件名称格式示例:database_name-2018-11-11.sql;
4) 需要对1天前的所有sql文件压缩,格式为gzip;
5) 本地数据保留1周;
6) 需要把备份的数据同步到远程备份中心,假如本机可以直接通过rsync命令同步,同步目标地址为rsync://10.10.10.10/mysqlbak/ ;
7) 远程备份数据需要保留1个月。
参考脚本如下:
#!/bin/bash
##备份本地数据库
##本地保留1周,远程保留一个月
mysqldump="/usr/local/mysql/bin/mysqldump"
bakuser="backup"
passwd="34KpmyzUq"
bakdir="/data/backup"
remote_dir="rsync://10.10.10.10/mysqlbak"
d1=`date +%F`
d2=`date +%d`
#定义日志
exec &> /tmp/mysql_bak.log
echo "mysql backup begin at `date`"
#对所有数据库进行遍历
for db in db1 db2 db3 db4 db5
do
$mysqldump -u$bakuser -p$passwd $db >$bakdir/$db-$d1.sql
done
#对1天前的所有sql文件压缩
find $bakdir/ -type f -name "*.sql" -mtime +1 |xargs gzip
#查找并删除一周以前的老文件
find $bakdir/ -type f -mtime +7 |xargs rm
#把当天的备份文件同步到远程
for db in db1 db2 db3 db4 db5
do
rsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sql
done
echo "mysql backup end at `date`"
脚本中,
-
shell脚本中,可使用反引号来引用一条命令的结果,然后将其保存到变量中
-
&> 指定正确输出和错误输出到 /tmp/mysql_bak.log
-
exec 命令,会接管该shell脚本中后续所有的命令,可以把exec理解为“一个盒子”,将exec那行以下所有的命令都拉到“这个盒子”里面运行。exec &> 1.txt 可以理解为 “这个盒子”所有操作的输出都写入到 1.txt 中