前言
由于项目需要,要求实现定时备份用户数据的功能,以便数据库出现意外时可以恢复数据。本项目为 SaaS 架构,我们会为每个新注册的公司动态生成一个数据库,用来存放该公司下的所有数据,因此,我们做数据备份的时候也需要动态备份该项目相关的所有数据库。
实现思路
经过一番查阅,决定采用 mysql 自带的备份命令,配合 Linux 的定时任务,实现每天定时备份所有用户数据。即编写一个 shell 脚本,写入备份命令,然后让 Linux 去定时执行这个脚本。
实现步骤
1. 创建目录 /root/mysqlbackup/shell/ ,并将 mysql_dump_script.sh 和 mysqlCron.cron 移动到该目录下
2. 为 mysql_dump_script.sh 和 mysqlCron.cron 赋予可执行权限:
sudo chmod 777 XXX.XX
3. 添加定时任务,执行命令:
crontab mysqlCron.cron
4. 查看定时任务是否成功创建:
crontab -l
注:
1. mysql_dump_script.sh 是执行数据库备份脚本,如本例中每次执行会导出所有以 cloud_ 开头的数据库的所有结构和数据,
并存至 xx.sql 文件,xx为执行时的日期。另外,默认保存最近 31 份文件,超出部分会从最原始的文件开始删除,直至总量保持在 31。
2. mysqlCron.cron 是定时任务文件
附上本文提及的脚本源码:
mysql_dump_script.sh
#!/bin/bash
#保存备份个数,备份31天数据
number=31
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#用户名
username=root
#密码
password=1234
#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi
#数据备份命令,导出所有数据结构和数据
mysql -e "show databases;" -u$username -p$password | grep "cloud_*" | xargs mysqldump -u$username -p$password --databases > $backup_dir/backup-$dd.sql
#记录创建备份日志
echo "create $backup_dir/$backup-$dd.dupm" >> $backup_dir/log.txt
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi
mysqlCron.cron
0 2 * * * /root/mysqlbackup/shell/mysql_dump_script.sh