#!/bin/bash
# Author: wangye
# For more information please visit:
# http://wangye.org/
# 请在使用本脚本前做好测试工作,脚本功能仅供参考,
# 对于可能的潜在问题造成损失,本人不承担责任。
MYSQL_USERNAME="mysql-username"
MYSQL_PASSWORD="mysql-password"
# 下面这行指示接收备份文件的电子邮件地址
BACKUP_RECEVIER="email-address-recive-backup@example.com"
BACKUP_FILENAME="/var/sample-site" # 需要备份的目录
BACKUP_DBNAME="sample" # 需要备份的数据库名称
BACKUP_PREFIX="backup_" # 备份文件的前缀
# 下面一些命令路径可以通过whereis获取
MYSQLDUMP_PATH="/usr/bin" # mysqldump 命令所在的路径
TARCOMPRESSOR_PATH="/bin" # tar 命令所在的路径
RM_PATH="/bin" # rm 命令所在的路径
MUTTMAIL_PATH="/usr/bin" # mutt 命令所在的路径
TEMP_PATH="/tmp" # 临时目录
# 产生临时名称形如 backup_20120221 名称
make_backup_name() {
TEMPNAME=${BACKUP_PREFIX}$(date +"%Y%m%d")
}
# 产生临时备份目录
make_backup_dir() {
make_backup_name
TEMPDIR=${TEMP_PATH}/$?
mkdir -m 777 -p $TEMPDIR
}
backup_files() {
${TARCOMPRESSOR_PATH}/tar -zcvf \
${TEMP_PATH}/${TEMPNAME}.tar.gz ${BACKUP_FILENAME}
}
backup_databases() {
local EXPORTDIR=$1
${MYSQLDUMP_PATH}/mysqldump -u${MYSQL_USERNAME} \
-p${MYSQL_PASSWORD} \
${BACKUP_DBNAME} >${EXPORTDIR}/${BACKUP_DBNAME}.sql
${TARCOMPRESSOR_PATH}/tar -zcvf \
${TEMP_PATH}/${TEMPNAME}_${BACKUP_DBNAME}.tar.gz ${EXPORTDIR}
}
send_byemail() {
echo "**IMPORTANT BACKUP** Hi! :-)\n\n$(uname -a)"| \
$MUTTMAIL_PATH/mutt -s "** System Backup$(date +%Y-%m-%d)" \
-a ${TEMP_PATH}/${TEMPNAME}_${BACKUP_DBNAME}.tar.gz \
${TEMP_PATH}/${TEMPNAME}.tar.gz -- \
${BACKUP_RECEVIER}
}
# 清除产生的临时文件(使用了rm -rf怕怕中,不过目标路径正确就OK啦)
cleanup() {
$RM_PATH/rm -rf $TEMPDIR
$RM_PATH/rm -rf ${TEMP_PATH}/${TEMPNAME}_${BACKUP_DBNAME}.tar.gz
$RM_PATH/rm -rf ${TEMP_PATH}/${TEMPNAME}.tar.gz
}
main() {
make_backup_dir
backup_databases $TEMPDIR
backup_files
send_byemail
cleanup
}
main
exit 0
此脚本的正常使用,要保证VPS支持邮件sendmail
函数,可以用探针中的邮件测试功能测试一下。则要检查邮件组件的正确运行。
1、将下面的代码保存为automysqlbackup.sh
并上传至/home/www/
目录下
mysqldump -uuser -ppassword db1 > /home/www/backups/db1.sql
mysqldump -uuser -ppassword db2 > /home/www/backups/db2.sql
tar zcf /home/www/backups/databackup.sql.tar.gz /home/www/backups/
echo “主题:数据库备份” | mutt -a /home/www/backups/databackup.sql.tar.gz -s “内容:数据库备份”admin@tt2u.com
rm -r /home/www/backups/*
其中user
为数据库用户名,password
为用户密码,db1
、db2
为数据库名,/home/www/
目录可自定义,admin@tt2u.com
邮箱可自定义。
2、将automysqlbackup.sh,修改其属性755
chmod 755 /home/www/automysqlbackup.sh
3、然后利用crontab
实现自动备份,用vi打开/etc/contab
文件,在最下行添加以下代码:
00 00 * * * /home/www/automysqlbackup.sh
这样就实现了每天00:00自动备份mysql数据库并发送到Email
脚本解释:
第一、第二句是操作备份db1
和db2
数据库名,可以依次增加。-u
后面的是数据库用户名 -p
后面的是数据库密码 无空格。
第三句是将 backups 文件夹里面的数据文件压缩为文件名:databackup.sql.tar.gz
第四句是将压缩了的数据库文件发送到指定的邮箱
最后一句是把发送完成后删除backups下的内容
直接用脚本,这个不是备份数据库的,数据库的差不多,由于文件可能比较大,所以用了rar的分卷压缩
可能文件比较大的时候会照成无法发送,所以可以将分段设置的小点,比如25M,30M左右
个人呢觉得QQ邮箱存这个东西比较不错,我就这样做的,一分钟多久收到了,速度应该是超级快的。
代码中有部分内容需要修改,自己改改就行,同时需要两个组件,rar和mutt,可以自己在网上搜索如何安装,也可是使用crontab来定时备份!
#!/bin/sh
cd /home/backup/
rm -rf my-blog
mkdir my-blog
cd my-blog
rar a -r -inul -v30000k my_blog.rar /home/web/loveyu.org/
file="/home/backup/my-blog/my_blog"
mail_date=`date "+%Y-%m-%d %H:%M:%S"`
email="admin@example.com"
if [ -f "$file.rar" ] ; then
echo "file exists"
echo "web-backup $mail_date" | mutt -s 'web backup all' -e 'set copy=no' -e 'set from=sql<backup@host.loveyu.org>' -a 'my_blog.rar' "$email"
else
i="1"
while [ -f "$file.part$i.rar" ]; do
echo "ok $i"
echo "web-backup $i $mail_date" | mutt -s "web backup $i" -e 'set copy=no' -e 'set from=sql<backup@host.loveyu.org>' -a "my_blog.part$i.rar" "$email"
i=$(($i+1))
done
fi
安装sendmail组件
这里以debian为例介绍下:
apt-get install sendmail-bin
apt-get install sendmail mutt
#如果不行,就执行
apt-get install -f sendmail mutt
运行以上代码,即可安装。
注意事项
VPS备份脚本
#!/bin/bash
MYSQL_USER="root" #mysql用户名
MYSQL_PASS="xxxxx" #mysql密码
MYSQL_DATABASENAME="xxxxx" #要备份的数据库名
MAIL_TO="xxx@xxx.com" #数据库发送到的邮箱
WEB_DATA="/var/www/xxx" #要备份的网站数据
#你要修改的地方从这里结束
#定义数据库的名字和旧数据库的名字
DataBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
#删除本地3天前的数据
rm -rf /var/www/Data_$(date -d -3day +"%Y%m%d").tar.gz /var/www/Web_$(date -d -3day +"%Y%m%d").tar.gz
#导出mysql数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DATABASENAME > /var/www/wordpress.sql
#压缩数据库
tar zcvf /var/www/$DataBakName /var/www/wordpress.sql
rm -rf /var/www/wordpress.sql
#压缩网站数据
tar zcvf /var/www/$WebBakName $WEB_DATA
tar zcvf /var/www/backup.tar.gz /var/www/$WebBakName /var/www/$DataBakName
echo "主题:vps备份" | mutt -s "内容:vps备份" $MAIL_TO -a /var/www/backup.tar.gz
将上述代码保存为backup2mail.sh并上传到vps空间中,我上传到的路径是/var/www。
设置定时运行
给脚本添加执行权限:
chmod +x /var/www/backup2mail.sh
利用系统crontab实现每天自动运行:
crontab -e
输入以下内容:
00 00 * * * /var/www/backup2mail.sh
其中00 00为时间分/小时,可自行修改,例如:30 12 *,就是每天12.30运行这个脚本。
邮箱接收
每天发送一封邮件也很烦,那怎么办呢,163有个功能叫订阅邮件,你可以将备份邮件分类至订阅邮件中,设置每7天删除一次,岂不是就完美了。
做网站最重要的是什么?数据!数据,是网站之本,备份,是每一个站长都应该重视的事情。但同时,备份也是一件繁琐和重复的事情。所以,这些事情,肯定能做到自动化的。
下面来介绍一下这个一键备份脚本 backup.sh。
总结一下 backup.sh 特点:
1、支持 MySQL/MariaDB 的数据库全量备份;
2、支持指定目录或文件的备份;
3、支持加密备份文件;
4、支持一键上传至 Google Drive(需先安装 gdrive 并配置)
2016 年 8 月 21 日更新:
1、新增:指定 MySQL/MariaDB 的数据库名进行备份,可以同时指定多个;
2、新增:删除指定天数本地旧的备份文件。
教程模式开启:
1、下载该脚本并赋予执行权限
wget https://github.com/teddysun/across/raw/master/backup.sh
chmod +x backup.sh
2、修改并配置脚本
请使用 vim 或 nano 等工具来修改。
关于变量名的一些说明:
ENCRYPTFLG(加密FLG,true 为加密,false 为不加密,默认是加密)
BACKUPPASS(加密密码,重要,务必要修改)
LOCALDIR(备份目录,可自己指定)
TEMPDIR(备份目录的临时目录,可自己指定)
LOGFILE(脚本运行产生的日志文件路径)
MYSQL_ROOT_PASSWORD(MySQL 或 MariaDB 的 root 用户密码)
MYSQL_DATABASE_NAME(指定 MySQL 数据库名,留空则是备份所有数据库)
※ 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 天)
一些注意事项的说明:
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.teddysun.com/files/gdrive-linux-x64
chmod +x /usr/bin/gdrive
i386(32位)
wget -O /usr/bin/gdrive http://dl.teddysun.com/files/gdrive-linux-386
chmod +x /usr/bin/gdrive
然后,运行以下命令开始获取授权:
gdrive list
根据提示用浏览器打开 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 自动备份,这里就不再赘述了。