以下文章内容首发于本人博客:https://www.chiloh.cn,原Hexo博客已废弃,有问题可以评论咨询联系。
数据无价!基于此理念,决定对本博客的数据(网站内容及数据库)进行定期备份。但人工备份过程繁琐,容易疏忽,因此采用脚本进行备份。
脚本使用
作用:Typecho备份脚本。将数据库和usr目录备份打包。
用法:上传脚本至VPS,执行./backup_typecho.sh /path/to/yoursite.com/
即可开始备份,其中/path/to/yoursite.com
为博客程序安装位置。备份结果放在/var/backups/typecho/yoursite.com/
目录下。另外使用时注意给/var/backups/
目录添加写入权限。
定期:由于博客更新不是很频繁,因此未采用Crontab定期执行脚本备份,转而采用人工更新内容后执行备份,也能帮助自己建立定期更新博客的习惯。
脚本代码
#设置备份目录
backup_dir="/var/backups/typecho/"
function print_help(){
echo 'Usage: $shell dir_to_typecho'
}
function die(){
test -z "$1" || echo "$1"
exit 1
}
function parse_db(){
config_file=$2
db_key=$1
cat "$config_file" | grep -A 6 '$db' | grep '=>' | grep "$db_key" | awk -F "'" '{print $4}'
}
if [ "$#" -lt "1" ]
then
print_help
exit 1
fi
te_dir="$1"
backup_dir="$backup_dir`basename "$te_dir"`"
#判断备份时间是否过频
min_time="43200" #12H
flag="/tmp/last_backup_typecho_`echo $te_dir | md5sum | awk '{print $1}'`"
last_backup="0"
test -f $flag && last_backup="`ls -l --time-style=+%s "$flag" | awk '{print $6}'`"
delta_time=$(expr "`date +%s`" - "$last_backup")
test "$delta_time" -lt "$min_time" && die "Time from last backup is less then $min_time, skip this time"
#初始化变量
te_config="$te_dir/config.inc.php"
te_usr_dir="$te_dir/usr"
#初始化环境
test -f "$te_config" || die "Can not find config file: $te_config"
test -d "$backup_dir" || mkdir -p "$backup_dir" || die "Can not create backup dir"
db_host=$(parse_db 'host' "$te_config")
db_port=$(parse_db 'port' "$te_config")
db_user=$(parse_db 'user' "$te_config")
db_pass=$(parse_db 'password' "$te_config")
db_name=$(parse_db 'database' "$te_config")
#备份数据库
echo "Found database config: host=$db_host, port=$db_port, user=$db_user, pass=**** and database=$db_name"
echo 'Try to dump database....'
dump_target='/tmp/database.sql';
test -f "$dump_target" && rm "$dump_target"
mysqldump -h"$db_host" -P"$db_port" -u"$db_user" -p"$db_pass" "$db_name" > "$dump_target"
echo 'Dump done.'
#备份usr目录
echo "Try to tar usr dir..."
tar_target="/tmp/user.tar.gz"
test -f "$tar_target" && rm "$tar_target"
tar czvf "$tar_target" "$te_usr_dir"
echo "Tar done."
echo "Try to pack..."
md5sum "$dump_target" > "$dump_target.md5sum"
md5sum "$tar_target" > "$tar_target.md5sum"
backup_file="$backup_dir/`basename "$te_dir"`.`date +%s`.tar.gz"
tar czvf "$backup_file" "$dump_target" "$dump_target.md5sum" "$tar_target" "$tar_target.md5sum"
#清理临时文件
rm $tar_target
rm "$tar_target.md5sum"
rm $dump_target
rm "$dump_target.md5sum"
touch "$flag"
echo "Backup to $backup_file done."
网友评论