做网站最害怕的就是数据丢失,无论再靠谱的空间,都不能保证100%的数据安全,所以只有定时异地备份才是靠谱之选。然而每天去执行备份操作是很枯燥的,并且难坚持。那么这种枯燥的工作能不能用一键脚本代替呢?既精准又可靠。
今天给大家介绍一键备份脚本,本脚本适合VPS或云服务器上执行,感谢原作者秋水逸冰提供源代码。
脚本特点
- 支持 MySQL/MariaDB/Percona 的数据库全量备份或选择备份;
- 支持指定目录或文件的备份;
- 支持加密备份文件(需安装 openssl 命令,可选);
- 支持上传至 Google Drive(需先安装 gdrive 并配置,可选);
- 支持在删除指定天数本地旧的备份文件的同时,也删除 Google Drive 上的同名文件(可选)。
获取代码
代码托管到了Github,获取脚本并授予执行权限
wget --no-check-certificate https://github.com/teddysun/across/raw/master/backup.sh chmod +x backup.sh
配置脚本
基本参数
- ENCRYPTFLG (加密FLG,true 为加密,false 为不加密,默认是加密)
- BACKUPPASS (加密密码,重要,务必要修改)
- LOCALDIR (备份目录,可自己指定)
- TEMPDIR (备份目录的临时目录,可自己指定)
- LOGFILE (脚本运行产生的日志文件路径)
- MYSQL_ROOT_PASSWORD (MySQL/MariaDB/Percona 的 root 用户密码)
- MYSQL_DATABASE_NAME (指定 MySQL/MariaDB/Percona 的数据库名,留空则是备份所有数据库)
备份目录和备份数据库均可用于指定多个例:
BACKUP[0]="/data/www/default/test.tgz" BACKUP[1]="/data/www/default/test/" BACKUP[2]="/data/www/default/test2/"
FTP参数
- FTP_FLG (上传文件至 FTP 的 FLG,true 为上传,false 为不上传)
- FTP_HOST (连接的 FTP 域名或 IP 地址)
- FTP_USER (连接的 FTP 的用户名)
- FTP_PASS (连接的 FTP 的用户的密码)
- FTP_DIR (连接的 FTP 的远程目录,比如: public_html)
有FTP的小伙伴可以选择异地备份至远程FTP地址,依次配置FTP参数即可,注意启用FTP_FLG开关,开启才会执行上传操作。没有FTP的小伙们也可以用GoogleDrive更加安全可靠,当然国内主机是用不了的。
博主选择的是上传至GoogleDrive,脚本默认备份文件夹是/root/backups/,无特殊情况不必修改。所以我只配置了以下参数:
#不进行加密 ENCRYPTFLG=false #MySQL的root密码以及要备份的数据库 MYSQL_ROOT_PASSWORD="mypassword" MYSQL_DATABASE_NAME[0]="wpdb" #要备份的文件夹,即网站www目录 BACKUP[0]="/data/sites/yantuz.cn/www"
备份至GoogleDrive
备份至GoogleDrive要安装gdrive进行上传操作项目地址:https://github.com/prasmussen/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),然后将浏览器上显示出来的字符串粘贴回命令行里,完成授权。
只要成功设置gdrive,脚本会自动识别并在备份完成时上传至GoogleDrive。
备份至FTP
这块博主没有FTP空间,所以无法测试,手头有的一个FTP端口号不是默认的21端口,而脚本似乎不支持备份到带端口号的FTP,所以没测试成功。
国内服务器或者没有google帐号的朋友,可以申请一个低价的网站空间,如最便宜的woothosting虚拟主机 年付1美元或体验阿里云6元年付虚拟主机
运行脚本
直接执行脚本./backup.sh
即可
测试正常后修改log()方法删掉输出部分,并添加脚本至任务计划
log() { echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1" #删掉此行 echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE} }
添加脚本至任务计划
以CentOS为例,编辑 /etc/crontab,内容如下:
SHELL=/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin MAILTO=root HOME=/root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 30 1 * * * root bash /root/backup.sh
以上表示,每天凌晨 1 点 30 分,root 用户执行一次 backup.sh 脚本。