一键备份脚本 backup.sh

在网站运营中,最重要的是什么?答案是数据!数据是网站的基础,而备份则是每位站长必须重视的任务。然而,备份往往是一项复杂且重复的工作,因此将其自动化显得尤为重要。
接下来,我们将介绍一款一键备份脚本 backup.sh。
backup.sh 的主要特点:
1. 支持 MySQL/MariaDB/Percona 数据库的全量或选择性备份;
2. 允许指定目录或文件进行备份;
3. 提供备份文件加密功能(需安装 openssl 命令,选用);
4. 支持将备份文件上传至 Google Drive(需事先安装 gdrive 并配置,选用);
5. 可在删除本地旧备份文件的同时,也删除 Google Drive 上的同名文件(选用)。
2016年8月21日更新:
1. 新增:可以指定 MySQL/MariaDB 数据库名进行备份,支持多个;
2. 新增:支持删除本地指定天数的旧备份文件。
2016年9月8日更新:
1. 新增:在删除本地旧备份文件的同时,也可选择删除 Google Drive 上的同名文件。
2016年11月29日更新:
1. 新增:支持将备份文件上传到 FTP;
2. 新增:在删除本地旧备份文件的同时,也可选择删除 Google Drive 及 FTP 上的同名文件。
下面是教程模式的开启:
1. 下载脚本并赋予执行权限
wget --no-check-certificate https://github.com/teddysun/across/raw/master/backup.sh chmod +x backup.sh
2. 修改和配置脚本
请使用 vim 或 nano 等编辑工具进行修改。
以下是变量名的说明:
ENCRYPTFLG (加密标志,true 表示加密,false 表示不加密,默认加密)
BACKUPPASS (加密密码,务必修改)
LOCALDIR (备份目录,用户可自定义)
TEMPDIR (备份目录的临时目录,用户可自定义)
LOGFILE (脚本运行生成的日志文件路径)
MYSQL_ROOT_PASSWORD (MySQL/MariaDB/Percona 的 root 用户密码)
MYSQL_DATABASE_NAME(指定 MySQL/MariaDB/Percona 的数据库名,留空将备份所有数据库)
※ MYSQL_DATABASE_NAME 是数组变量,可以指定多个。示例如下:
MYSQL_DATABASE_NAME[0]="phpmyadmin" MYSQL_DATABASE_NAME[1]="test"
BACKUP (指定需要备份的目录或文件列表,留空则不备份)
※ BACKUP 是数组变量,可以指定多个。示例如下:
BACKUP[0]="/data/www/default/test.tgz" BACKUP[1]="/data/www/default/test/" BACKUP[2]="/data/www/default/test2/"
LOCALAGEDAILIES (指定多少天后删除本地旧备份文件,默认为7天)
DELETE_REMOTE_FILE_FLG (删除 Google Drive 或 FTP 上备份文件的标志,true 表示删除,false 表示不删除)
FTP_FLG (上传文件至 FTP 的标志,true 表示上传,false 表示不上传)
FTP_HOST (FTP 域名或 IP 地址)
FTP_USER (FTP 用户名)
FTP_PASS (FTP 用户密码)
FTP_DIR (FTP 远程目录,例如:public_html)
注意事项:
1)脚本需以 root 用户执行;
2)需安装 openssl 以支持加密;
3)默认情况下,脚本将备份所有数据库(全量备份);
4)备份文件的解密命令如下:
openssl enc -aes256 -in [ENCRYPTED BACKUP] -out decrypted_backup.tgz -pass pass:[BACKUPPASS] -d -md sha1
5)解密后的备份文件解压命令如下:
tar -zxPf [DECRYPTION BACKUP FILE]
参数 -P 的解释:
tar 压缩文件默认是相对路径的,添加 -P 则可以让 tar 以绝对路径压缩文件,因此解压时也需带上 -P 参数。
3. 配置 gdrive 命令
gdrive 是一个命令行工具,用于 Google Drive 的上传和下载等操作。官网地址:
https://github.com/prasmussen/gdrive
你可以使用以下命令安装 gdrive。
x86_64(64位):
wget -O /usr/bin/gdrive http://dl.lamp.sh/files/gdrive-linux-x64 chmod +x /usr/bin/gdrive
i386(32位)
wget -O /usr/bin/gdrive http://dl.lamp.sh/files/gdrive-linux-386 chmod +x /usr/bin/gdrive
接着,运行以下命令获取授权:
gdrive about
根据提示在浏览器中打开 gdrive 提供的 URL,点击接受(Accept),然后将显示的字符串粘贴回命令行,完成授权。
4. 运行脚本开始备份
./backup.sh
脚本将默认显示备份进度,并在最后统计所需时间。
若希望将脚本加入 cron 自动运行,则不需要前台显示进度,只需记录日志即可。
此时,需要稍作修改脚本中的 log 函数。
log() { echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1" echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE} }修改为:
log() { echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE} }关于如何使用 cron 自动备份,这里不再赘述,以 CentOS 6 为例说明。
修改文件 /etc/crontab,内容如下:
SHELL=/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin MAILTO=root HOME=/root # 具体请参见 man 4 crontabs # 示例任务定义: # .---------------- 分钟 (0 - 59) # | .------------- 小时 (0 - 23) # | | .---------- 日期 (1 - 31) # | | | .------- 月 (1 - 12) 或 jan,feb,mar,apr ... # | | | | .---- 星期 (0 - 6) (星期日=0 或 7) 或 sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * 用户名 要执行的命令 30 1 * * * root bash /root/backup.sh
以上配置表示,每天凌晨1点30分,root 用户执行一次 backup.sh 脚本。
注意:
一定要修改其中的 PATH 和 HOME 变量的值,尤其是 HOME 变量,gdrive 命令的正常执行依赖于其配置文件,因此必须确保其指向正确的路径。
最后,欢迎大家交流和提出意见。
