假如一台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.logecho "mysql backup begin at `date`"#对所有数据库进行遍历for db in db1 db2 db3 db4 db5do
    $mysqldump -u$bakuser -p$passwd $db >$bakdir/$db-$d1.sqldone#对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 db5do
    rsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sqldoneecho "mysql backup end at `date`"

脚本中,

  1. shell脚本中,可使用反引号来引用一条命令的结果,然后将其保存到变量中

  2. &> 指定正确输出和错误输出到 /tmp/mysql_bak.log

  3. exec 命令,会接管该shell脚本中后续所有的命令,可以把exec理解为“一个盒子”,将exec那行以下所有的命令都拉到“这个盒子”里面运行。exec &> 1.txt 可以理解为 “这个盒子”所有操作的输出都写入到 1.txt 中