苏苏的博客

简约至极

Crontab与自动备份

Crontab使用

crontab -l 查看当前用户的crontab列表 使用crontab -e开始编辑规则

基本格式 :
*  *  *  *  *  command
分  时  日  月  周  命令

* 第1列表示分钟1~59 每分钟用*或者*/1表示
* 第2列表示小时1~23(0表示0点)
* 第3列表示日期1~31
* 第4列表示月份1~12
* 第5列标识号星期0~6(0表示星期天)
* 第6列要运行的命令

禁止Crontab产生邮件: 在crontab末尾加上> /dev/null 2>&1 或者 > &> /dev/null

例如

0 1 5 10 * /path/to/script.sh > /dev/null 2>&1
0 1 5 10 * /path/to/script.sh > &> /dev/null

你也可以将/dev/null换成你想要存储日志的文件地址

配置文件

对于CentOS

/etc/ 目录下包含

cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/

其中 crontab 为其主配置文件,可以编写命令,按指定用户去执行.

/var/spool/cron/ 目录下存放按用户名的配置, 使用 crontab -l 相当于读取其当前用户名的配置文件

简化版的scron

https://git.2f30.org/scron/files.html

定时备份数据库

先写好shell脚本存入/home/cron1.sh

user="root"
pass="root"
host="127.0.0.1"
port="3306"
dbs="db1 db2 db3"
dir="/data/backup/"

nowDate=`date '+%Y%m%d'`
nowTime=`date '+%H%M'`
backupdir=$dir$nowDate
timeold=`date -d "-1 week" +%Y%m%d`
delold=$dir$timeold
if [ ! -d $backupdir ]; then
  mkdir -p $backupdir
fi
if [ -d $delold ]; then
  rm -rf $delold
fi
for i in $dbs
	do
		backupFile=$backupdir/$i-$nowTime.sql
		mysqldump -u$user -p$pass -h$host -P$port --databases $i > $backupFile
		xz $backupFile
	done

然后定时任务crontab -e 每5个小时备份一次数据库.

0 */5 * * * sh /home/cron1.sh

使用此脚本建议每20个小时以内备份一次数据库,此脚本保留最近7天备份,删除过期备份

增量备份数据库

先写好shell脚本存入/home/cron2.sh

user="root"
pass="root"
host="127.0.0.1"
port="3306"
storedb="backup"
backup="db1.table1 db1.table2"

mysql -u$user -p$pass -h$host -P$port -e "create database if not exists $storedb"
for i in $backup
	do
		table=${i##*.}
		sql="create table if not exists $storedb.$table like $i;replace into $storedb.$table  select * from $i ;"
		mysql -u$user -p$pass -h$host -P$port -e "$sql"
	done

数据表从源数据库中增量备份至备份数据库中的同名数据表

0 */20 * * * sh /home/cron2.sh

每20个小时增量备份一次

更高级的文件实时同步

Mac上可以使用fswatch + rsync进行实时同步

首先安装fswatch,rsync应该是自带了

brew install fswatch

监视目录输出有变动的文件 fswatch -0 /tmp | xargs -0 -n 1 echo $1

文件变化自动同步函数

sync1()
{
    dir=/data/project/21textv3/
    while true
    do
        rsync -arvuzpt --progress --exclude=".git" /data/project/21textv3/  root@172.168.1.3:/data/web/21textv3/
        echo "start morniting folder $dir"
        fswatch -1 $dir
        sleep 2
    done
}

rsync  参数

-a, --archive 归档(压缩)模式,表示以递归方式传输文件,并保持所有文件属性等同于-rlptgoD(无 -H,-A,-X)
-r, --recursive 对子目录以递归模式处理
-v, --verbose 详细模式输出
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件(不覆盖更新的文件)
-z, --compress 在传输过程中进行压缩
-t, --times 保留修改时间
-p, --perms 保留权限
--delete 删除那些DST中SRC没有的文件

全功能文件备份脚本