1. 题目

设计一个 shell 脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们已经知道了 mysql root 账户密码,要备份的数据库为 wenming ,本地备份目录为 /data/backup/mysql,远程服务器 ip 为 192.168.12.34 ,远程提供了一个 rsync 服务,备份的地址是 192.168,12.34::backup . 写完脚本后,需要加入到cron 中,每天凌晨 3 点执行。

2. 习题分析

  1. 首先要会写 mysql 数据库的备份命令,会写命令行,就把它直接写到脚本里;
  2. 因为涉及到远程和本地服务器的备份,所以会用到 rsync 命令,还要懂得用这个命令在本地和远程服务器之间传输文件;
  3. 最后一个要求是,备份文件的过期时间,所以要实现时间判断,并删除的功能;通常使用的方法是 find 命令,判断文件时间,再删除。但是 find 命令对于远程服务器就比较难实现了。这里建议使用 data +%w 和 data +%d 命令,分别表示周几和几号。

3. 脚本

#!/bin/bash
### backup mysql

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/mysql/bin

d1=`date +%w`
d2=`data +%d`

pass="your_mysql_password"
backupdir=/data/backup/mysql
r_backupdir=192.168.12.34::backup

exec 1>/your/mysql/log/path.log  2>/your/mysql/log/path.log
echo "mysql backup begin at date `date +"%F %T"`"
mysqldump  -uroot -p${pass} wenming > ${backupdir}/${d1}.sql
rsync  -az ${backupdir}/${d1}.sql $r_backupdir/${d2}.sql

echo "mysql backup end at `date +"%F %T"`"

4. 解析

  1. 设定 PATH 的原因,是可能我们在后面使用的 mysqldump 命令并不在 PATH 路径。或者,你可以使用 mysqldump 的全路径。
  2. 变量 d1 为当天是周几,变量 d2 为当天是这个月的几号。周的取值范围是 0-6,月的是1-31。本地存一周,就用 d1 取值,无论怎么循环都只有 0-6 个文件。远程用 d2 取值,存一个月,无论怎么循环都只有1-31个文件。
  3. 定义 exec 1>/your/mysql/log/path.log 2>/your/mysql/log/path.log ,表示对输出和错误输出进行重定向,在下面的命令的所有正确和错误的输出内容都保存在 /your/mysql/log/path.log 日志。
  4. mysqldump 就是 mysql 数据库用来备份的命令,不多解释了。
  5. rsync 就是远程同步,远程传输复制文件的一个命令,选项 -z 表示在传输的过程会对文件进行压缩处理。