前言
开始写博客了,数据备份也很重要,你总不希望你费老大劲写的文章因为各种不可抗力原因导致数据丢失吧。typecho进行数据备份需要备份两样东西:Mysql数据库(typecho中存放的你写过的文章, 以及你的评论等)和usr文件(存放你的用户配置, 包括网站设置, 主题, 插件等)备份好文件之后, 只需要将备份的usr文件覆盖新部署的usr文件夹. 然后并导入备份的数据库就ok了。
手动备份恢复过程
1. 备份usr文件
找到typecho的安装目录,如果是使用 lnmp一键脚本 搭建的typecho环境的话,目录在 /home/wwwroot/你的域名
:
cd /home/wwwroot/你的域名/
tar -Pczf typecho_usr.tar.gz usr
将备份的数据文件通过rclone上传到你的网盘:
rclone copy /home/wwwroot/你的域名/typecho_usr.tar.gz syqman:typecho备份 -v-P
因为typecho的用户设置文件平时修改得少,我们正常备份一次上传到网盘即可。
2.备份mysql数据库数据
进入mysql数据库管理工具phpMyAdmin(http://your-vpsip/phpmyadmin/)界面,在数据库列表中选择网站相应的数据库并导出sql文件。
3.恢复篇
- 导入之前备份的
usr
文件替换替换初始的usr
文件夹(上传并覆盖即可)。 - 导入Mysql数据库数据,进入新服务器的phpMyAdmin管理界面. 并新建一个空的数据库
- 修改typecho根目录下config.inc.php文件数据库信息为新的数据库信息
最后访问你的域名, 你会看到你的博客已经全部转移过来了。
自动备份恢复过程
手动备份过程只是方便你了解整个流程是怎样的,对于懒人来说,肯定还是自动化才是终极目标。这里提供群里 翔翎 大佬的备份脚本,这个脚本可实现备份typecho数据库和用户usr文件,然后通过rclone同步到网盘,并自动删除7天前的备份:
#!/bin/bash
# 使用方法
# 备份:bash backup.sh -z
# 还原:bash backup.sh -u 20220606 (20220606为备份文件的日期)
back(){
# 数据库账号信息
DB_USER=""
DB_PWD=""
DB_HOST=""
DB_PORT="3306"
# MYSQL所在目录
MYSQL_DIR="/usr/local/mysql"
# 备份文件存放目录
BAK_DIR="/home/bak"
WEB_DIR="/home/wwwroot"
# 时间格式化,如 20200902
DATE=`date +%Y%m%d`
# 备份脚本保存的天数
DEL_DAY=7
# 要备份的数据库,空格分隔
DATABASES=("typehco" "git")
# 创建日期目录
if [[ ! -d ${BAK_DIR}/${DATE} ]]; then
mkdir -p $BAK_DIR/$DATE
fi
# echo "-------------------$(date +%F_%T) start ---------------" >>${BAK_DIR}/db_backup.log
for database in "${DATABASES[@]}"
do
# 执行备份命令
$MYSQL_DIR/bin/mysqldump --defaults-extra-file=/etc/my.cnf ${database} > $BAK_DIR/$DATE/${database}.sql
done
# echo "--- backup file created: $BAK_DIR/db_backup_$DATE.tar.gz" >>${BAK_DIR}/db_backup.log
# 将备份好的sql脚本压缩到db_backup_yyyyMMdd.tar.gz
cd $BAK_DIR/$DATE
tar -Pczf $BAK_DIR/db_backup_$DATE.tar.gz ./
# 将Blog的usr目录压缩到web_backup_yyyyMMdd.tar.gz
cd $WEB_DIR
tar -Pczf $BAK_DIR/web_backup_$DATE.tar.gz --exclude=.user.ini ./
# 压缩后,删除压缩前的备份文件和目录
rm -f $BAK_DIR/$DATE/*
rmdir $BAK_DIR/$DATE
# 遍历备份目录下的压缩文件
LIST=$(ls ${BAK_DIR}/*_backup_*)
# LISt1=$(ls ${BAK_DIR}/web_backup_*)
# 获取7天前的时间,用于作比较,早于该时间的文件将删除
SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s)
for index in ${LIST}
do
# 对文件名进行格式化,取命名末尾的时间,格式如 20200902
timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]")
if [ -n "$timeString" ]
then
indexDate=${timeString//./-}
indexSecond=$( date -d ${indexDate} +%s )
# 与当天的时间做对比,把早于7天的备份文件删除
if [ $(( $SECONDS- $indexSecond )) -gt 0 ]
then
rm $index
# echo "---- deleted old backup file : $index " >>${BAK_DIR}/db_backup.log
fi
fi
done
# 此处根据自己rclone config的配置进行修改
rclone sync /home/bak nongjiale:blog-bak -v -P
}
restore(){
# 数据库目录
MYSQL_DIR="/usr/local/mysql"
# 数据库账户信息
DB_USER=""
DB_PWD=""
DB_HOST="127.0.0.1"
DB_PORT="3306"
DATABASES="typehco"
# 备份文件路径
BAK_DIR="/home/bak"
# 网站路径
WEB_DIR="/home/wwwroot"
# 还原网站备份
tar -xzf $BAK_DIR/web_backup_$DATE.tar.gz -C $WEB_DIR
if [[ "$#" -eq 0 ]]; then
echo "网站数据恢复成功。"
else
echo "出现错误,网站数据恢复失败。"
fi
# 还原数据库备份
tar -xzf $BAK_DIR/db_backup_$DATE.tar.gz -C ./
mysql --defaults-extra-file=/etc/my.cnf ${DATABASES} < ./${DATABASES}.sql
rm *.sql
if [[ "$#" -eq 0 ]]; then
echo "数据库恢复成功。"
else
echo "出现错误,数据库恢复失败。"
fi
}
if [[ $# > 0 ]];then
key="$1"
DATE="$2"
case $key in
-z|--back)
back
;;
-u|--restore)
restore
;;
esac
else
echo "出错了,请注意传参····"
fi
保存成 backup.sh
,上传到vps,并给与权限 :
chmod +x backup.sh
使用说明
先手动执行下看有无报错:
bash backup.sh -z
查看 home/typecho_backup
目录下有无 db_backup_20220604.tar.gz、web_backup_20220604.tar.gz
类似的文件,有的话表示脚本无问题。
加入定时任务,比如每天0点自动备份,先执行:
crontab -e
添加定时任务:
0 0 * * * /root/backup.sh -z
ctrl +x
保存,按 y
退出。
使 crontab
生效:
/etc/init.d/cron restart
评论 (0)