述尔

^


Shell 脚本实现网站及数据库定时自动备份

碎碎念 • 阅读: 5543

代码有价,数据无价,为了安全起见,我们每天都需要备份数据库,但是备份数据库的时间往往是在凌晨左右,大家都休息,没人使用的时候,而我们也不能长期在每天的这个时候手动进行备份,所以我们就需要 Linux 系统实现自动备份,即定时自动执行脚本任务,但是我们也不能让所有的备份一直保留,那样长期备份的数据会占用很大的存储空间,所以我们还需要自动删除过期的备份。为了方便自己和大家,我写了一个 Shell 脚本来实现自动备份。

一、程序源码:

#!/bin/bash
# Author:Tespera
# Blog: https://www.tespera.com/

## 备份配置信息 (自定义)##

# 备份名称,用于标记,如:www.tespera.com
BACKUP_NAME=" "
# 备份目录,多个请空格分隔,如:/home/www
BACKUP_SRC=" "
# Mysql主机地址
MYSQL_SERVER="127.0.0.1"
# Mysql用户名
MYSQL_USER="user"
# Mysql密码
MYSQL_PASS="password"
# Mysql备份数据库,多个请空格分隔
MYSQL_DBS=" "
# 备份文件存放目录
BACKUP_DIR="/Data/BlogBackup"
# 备份文件压缩密码
BACKUP_FILE_PASSWD=" "
# 备份文件保留天数
SAVE_DAYS="30"
## 备份配置信息 End ##

## 以下内容无需修改 ##

NOW=$(date +"%Y%m%d%H%M%S") #精确到秒,同一秒内上传的文件会被覆盖

mkdir -p $BACKUP_DIR
mkdir -p $BACKUP_SRC/MySQL_bak

# 备份Mysql
echo -e "\nStart dump MySQL ..."
for db_name in $MYSQL_DBS
do
    mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS $db_name > "$BACKUP_SRC/MySQL_bak/$BACKUP_NAME-$db_name-$NOW.sql"
done
echo "Dump MySQL OK !"

# 打包备份文件
echo -e "\nStart tar ..."
BACKUP_FILENAME="$BACKUP_NAME-backup-$NOW.zip"
zip -q -r -P $BACKUP_FILE_PASSWD $BACKUP_DIR/$BACKUP_FILENAME $BACKUP_SRC/MySQL_bak/*.sql $BACKUP_SRC
echo "tar OK ! "

# 清理临时备份文件
echo -e "\nStart clean temp file ..."
rm -rf $BACKUP_SRC/MySQL_bak/*.sql
echo "Clean temp file OK !"

# 清理过期备份文件
echo -e "\nStart clean outdated file ..."
find $BACKUP_DIR -type f -name "*zip" -mtime +$SAVE_DAYS -exec rm -rf {} \;
echo "Clean outdated file OK !"

# 写入日志
echo "$NOW  Backup $BACKUP_SRC successifully!" >> $BACKUP_DIR/backup.log 2>&1

# 备份结束
echo -e "\033[32m \nBackup Successifully! \n \033[0m"

程序源码已同步至 GitHub 仓库:『 AutoBackupWebsite

二、使用方法:

1、下载脚本:

git clone https://github.com/Tespera/AutoBackupWebsite.git

2、修改配置信息,只需修改如下内容:

## 备份配置信息 (示例)##

# 备份名称,用于标记
BACKUP_NAME="www.tespera.com"
# 备份目录,多个请空格分隔
BACKUP_SRC="home/www"
# Mysql主机地址
MYSQL_SERVER="127.0.0.1"
# Mysql用户名
MYSQL_USER="user"
# Mysql密码
MYSQL_PASS="password"
# Mysql备份数据库,多个请空格分隔
MYSQL_DBS="blog"
# 备份文件存放目录
BACKUP_DIR="/Data/BlogBackup"
# 备份文件压缩密码
BACKUP_FILE_PASSWD="123456"
# 备份文件保留天数
SAVE_DAYS="30"
## 备份配置信息 End ##

3、赋予脚本执行权限:

chmod +x AutoBackupWebsite.sh

4、开始执行:

./AutoBackupWebsite.sh

执行结束之后,屏幕输出如下信息意味着已经备份成功,可在自己设置的备份文件存放目录查看生成的备份文件,压缩包内含 MySQL 数据库文件。

Start dump MySQL ...
Dump MySQL OK !

Start tar ...
tar OK ! 

Start clean temp file ...
Clean temp file OK !

Start clean outdated file ...
Clean outdated file OK !
 
Backup Successifully! 
 
[root@VM_135_138_centos backblog]#

注:脚本中清理过期备份的命令:

find $BACKUP_DIR -type f -name "*zip" -mtime +3 -exec rm -rf {} \;

参数 -mtime 表示修改时间,按天计算,以当前时间 2019-05-17 04:00 来说, -mtime +3 表示整数三天前,即 2019-05-14 04:00 之前,04:00 之后的不在查找范围之内。该行命令表示查找以当前时间 2019-05-17 04:00 计算三天之外的以 zip 结尾的普通文件并静默删除。

本地测试需将 -mtime 参数改为 -mmin ,即修改时间按分钟计算,-mmin +3 可以删除三分钟之前修改过的文件,-mtime 无法在本地测试。

测试成功之后,我们需要将此脚本添加至 Linux 的定时任务中,让其每天按时自动执行。

先查看系统是否安装了 cron 服务(一般默认都安装了)

crontab -l  

输入上述命令如果不报错并输出了 corntab 里面已经存在的定时任务列表即表示系统已安装了 corntab 服务,如果显示 ‘no crontab for root’ 表示系统没有安装 corn ,安装指南:

yum -y install vixie-cron crontabs
apt-get install cron

安装成功之后,终端输入下面指令,打开定时器:

crontab -e

按 i 修改,在最后一行添加如下代码,保存并退出,即可实现每天凌晨 4 点自动执行备份:

0 4 * * * /你的脚本存放目录/AutobackupWebsite.sh

凌晨 4 点上网人数最少,服务器压力最小,适合做备份,可自行修改时间。

OK ! Enjoy !

顺便说下 crontab ,好玩!

三、Crontab 概念

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中(是“cron table”的简写),以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常 crontab 储存的指令被守护进程激活,crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为 cron jobs。简单来说,原理类似于我们手机上的闹钟。

1、cron 服务的启动与关闭

# 查看cond 状态
service crond status

# 启动cron
service crond start

# 关闭cron
service crond stop

# 重启cron
service crond restart
# 查看cond 状态
service cron status

# 启动cron
service cron start

# 关闭cron
service cron stop

# 重启cron
service cron restart

2、指令解释:

每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command
# Example of job definition:
.---------------------------------- minute (0-59)表示分钟
|  .------------------------------- hour (0-23)表示小时
|  |  .---------------------------- day of month (1-31)表示日期
|  |  |  .------------------------- month (1-12)表示月份
|  |  |  |  .---------------------- day of week (0-6)表示星期
|  |  |  |  |  .------------------- username  以哪个用户来执行(可省略)
|  |  |  |  |  |            .------ command  要执行的命令
|  |  |  |  |  |            |
*  *  *  *  * user-name  command to be executed

3、格式示例:

tips:

#每30秒 把时间写入 /tmp/cron.txt 文件
*/1 * * * * data >> /tmp/cron.txt
*/1 * * * * sleep 30s; data >> /tmp/cron.txt

你 Get 到了吗?

文章标签: Shell, 网站备份
点此生成 >> 文章海报


上一篇 : 使用 Python 和 sendmail 服务给用户发送邮件
下一篇 : 纯Shell脚本实现CentOS7一键安装Python3及pip3并与Python2共存
留言